xv6源码分析 001

xv6源码分析 001

我们先看看xv6这个项目的基本结构(只看代码部分)

主要就是两个目录kerneluser

  • user是一些用户程序,也就是我们平时在shell上面执行的命令,每执行一个命令就会创建一个新的用户进程来执行这个命令

    user目录下有两个文件需要我们注意一下:usys.plinitcode.S

    usys.pl:主要是输出一段汇编指令,并通过重定向输入到指定的文件中,下面我们就来看看这段汇编

    print "# generated by usys.pl - do not edit\n";print "#include \"kernel/syscall.h\"\n";	# 引入定义对应系统调用号的宏常量的头文件sub entry {my $name = shift;print ".global $name\n";print "${name}:\n";print " li a7, SYS_${name}\n";print " ecall\n";print " ret\n";
    }
    

    很明显,这是系统调用的trap过程,但是这个是什么语言我还不清楚,

    • .global $name:类似C语言中的声明,global声明这个过程在这个目录内可见
    • ${name}::过程的名称,在c代码中通过一个向量extren char name[];可以引入这个汇编过程
    • li a7, SYS_${name}li指令的作用将任意的立即数加载到指定的寄存器中,这里是将SYS_{name}这个宏常量加载到寄存器a7中,为什么这么做呢?明天我们将会看到,在进行系统调用的时候,发起系统调用的进程将会将CPU的执行权交给内核线程,内核线程如何知道进程调用的是那个系统调用呢?这是就可以从寄存器a7中取出先前存放进去的SYS_{name}系统调用号,来执行相应的系统调用。注意:这是涉及的是线程切换:由用户态线程切换到了内核线程,因为每个进程都都一个内核线程,这样能够大大减少系统调用的开销。
    • ecall:陷入指令(trap),使进程从用户态切换到内核态,即用户线程切换到内核线程
    • ret:调用返回,返回的内核线程的上下文

    我们再来看看initcode.S

    主要作用是系统调用execstart的过程,我就直接在源码上注释了

    # Initial process that execs /init.
    # This code runs in user space.#include "syscall.h"# exec(init, argv)
    .globl start				 	# 声明start过程为整个目录可见
    start:						    # 过程的开始,标签la a0, init				 # 将init这个字符串的地址加载到寄存器a0la a1, argv				 # 将argc字符串的地址加载到寄存器a1li a7, SYS_exec			 # 将exec的系统调用号加载到寄存器a7ecall					# 陷入内核执行系统调用# for(;;) exit();
    exit:							li a7, SYS_exitecalljal exit				# jal指令是跳转到对应的标签,相当于c语言的goto# char init[] = "/init\0";
    init:							# 定义一个字符串,表示加载的可执行程序映像的名称.string "/init\0"# char *argv[] = { init, 0 };	 # 定义了一个argv 数组
    .p2align 2
    argv:.long init					# init字符串的地址.long 0						# 一个空指针

ok,今晚就先到这里了,我们明晚再继续吧。

字符串的地址
.long 0 # 一个空指针

ok,今晚就先到这里了,我们明晚再继续吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/795131.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习 Git 基础知识 - 日常开发任务手册

欢迎来到我关于 Git 的综合指南,Git 是一种分布式版本控制系统,已经在软件开发中彻底改变了协作和代码管理方式。 无论你是经验丰富的开发者还是刚开始编程之旅的新手,理解 Git 对于正确掌控代码、高效管理项目和与他人合作至关重要。 在本…

App应用的服务器如何增加高并发能力

大家好!我是你们的好朋友咕噜铁蛋!近年来,随着移动互联网的蓬勃发展,各类App应用如雨后春笋般涌现,用户量呈现爆发式增长。然而,随之而来的高并发访问问题也开始频繁出现,给服务器带来了极大的挑…

UV胶水与聚氯乙烯PVC材料的塑料粘接,效果如何?

UV胶水可以与聚氯乙烯PVC很好地粘接。 PVC是一种常见的塑料材料,UV胶水通常对PVC具有良好的粘接性能。UV胶水可以在紫外线照射下迅速固化,形成坚固的粘接,因此通常被用于PVC制品的粘接和修复。 UV胶水与PVC粘接的优点: 1. 快速固…

java数据结构与算法刷题-----LeetCode172. 阶乘后的零

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 文章目录 数学:阶乘的10因子个数数学优化:思路转变为求5的倍数…

wordpress全站开发指南-面向开发者及深度用户(全中文实操)--创建新主题

前言 你可以在wordpress里面下载使用人家打包好的主题,但可能不是很好用,接下来就自己做一个自己的主题。你需要先找到xampp文件夹–htdocs–wordpress(我给更名为wplocal)–wp-content–themes 进入该文件夹之后你可以看到你之前下载导入的所有主题文件…

【Python第三方库】lxml 解析器和xpath路径语言

1.lxml是做什么的 是xml/html的解析器,主要是用来解析和提取html/xml数据 2.lxml语法 使用etree.HTML(html字符串),将字符串转换为Element对象通过使用Element对象.xpath(语法)提取信息,返回的是一个列表的内存地址,需要通过使用索引获取信…

实验5-表达式求值算法

要求: 优化表达式求值算法,使得该算法可实现多位整数甚至浮点数的四则运算,并写程序进行验证 一下代码由AI生成,这个作业我是实在不想做了,老师上课讲的时候也是一笔带过,然后就要求我们自己动手写......…

redis的List详细介绍

Redis的列表(List)是一个由字符串组成的双向链表。以下是关于Redis列表的一些详细介绍: 基本概念: Redis的列表数据构造模式是一个双向链表,这意味着你可以在表头或表尾追加元素,从表头或表尾弹出元素。每个…

Java实现ATM机模拟系统(Week2)

目录 前言 项目规划(第二周) 具体实现 用户大类 AccountOperations接口 UserOperations接口 Operations类(实现类) Account类 User类 Area类 (父类) 货币大类 Money类(抽象类&…

redis的Set详细介绍

Redis的集合(Set)是由字符串组成的无序集合,和列表(List)不同的是,集合中的元素是唯一的,不存在重复的元素。以下是关于Redis集合的一些详细介绍: 基本概念: Redis的集合…

vue + koa + Sequelize + 阿里云部署 + 宝塔:宝塔数据库连接

之前文章已经介绍了宝塔上传前后端代码并部署,不清楚的请看这篇文章: vue koa 阿里云部署 宝塔:宝塔前后端部署 下面是宝塔创建数据库: 我用的 koa Sequelize 连接的数据库,Sequelize 非常适合前端使用&#xf…

【Python】字符串处理技巧大揭秘:从基础到高级

欢迎来CILMY23的博客 本篇主题为 字符串处理技巧大揭秘:从基础到高级 个人主页:CILMY23-CSDN博客 Python系列专栏:http://t.csdnimg.cn/HqYo8 上一篇博客: http://t.csdnimg.cn/5NRlT C语言专栏: http://t.csdnim…

5543: 【J1】【vector】【pair】星空时代大比武

题目描述 星空时代人类发明了很多太空母舰用来开拓家园,现有2n(n≤10)艘太空母舰进行战斗力大小比较,角逐出谁是最强太空母舰。比赛规则如下:1 号太空母舰和 2 号太空母舰比赛,胜者晋级。3 号太空母舰和 4…

虚幻UE5智慧城市全流程开发教学

一、背景 这几年,智慧城市/智慧交通/智慧水利等飞速发展,骑士特意为大家做了一个这块的学习路线。 二、这是学习大纲 1.给虚幻UE5初学者准备的智慧城市/数字孪生蓝图开发教程 https://www.bilibili.com/video/BV1894y1u78G 2.UE5数字孪生蓝图开发教学…

Docker 安装 Linux 系统可视化监控 Netdata

docker 安装 netdata 前提准备Docker 两种方式部署 Netdata1、使用 docker run 命令运行 netdata 服务2、使用 docker compose 运行 netdata 服务 Netdata 服务可视化界面Netdata 汉化处理 前提准备 说明:此处使用 windows11 安装的 docker desktop & wsl2/apli…

大语言模型LLM《提示词工程指南》学习笔记01

文章目录 大语言模型LLM《提示词工程指南》学习笔记01以下是使用不同LLM提供程序时会遇到的常见设置:标准提示词应该遵循以下格式:提示词要素 大语言模型LLM《提示词工程指南》学习笔记01 提示工程(Prompt Engineering)是一门较新…

linux E: You don‘t have enough free space in /var/cache/apt/archives/. 空间不足

问题: 在ubuntu的亚马逊云计算机平台上,apt install的时候,报错,空间不足 解决方法: 查看磁盘情况: 设置自动清理: sudo apt-get autoclean sudo apt-get clean 解决:

RabbitMQ3.13.x之十_流过滤的内部结构设计与实现

RabbitMQ3.13.x之十_流过滤的内部结构设计与实现 文章目录 RabbitMQ3.13.x之十_流过滤的内部结构设计与实现1. 概念1. 消息发布2. 消息消费 2. 流的结构1. 在代理端进行过滤2. 客户端筛选3. JavaAPI示例4. 流过滤配置5. AMQP上的流过滤6. 总结 3. 相关链接 1. 概念 流过滤的思…

前端与后端协同:实现Excel导入导出功能

🌟 前言 欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍 &#x…

[实战经验]Mybatis的mapper.xml参数#{para}与#{para, jdbcType=BIGINT}有什么区别?

在MyBatis框架中,传入参数使用#{para}和#{para, jdbcTypeBIGINT}的有什么区别呢? #{para}:这种写法表示使用MyBatis自动推断参数类型,并根据参数的Java类型自动匹配数据库对应的类型。例如,如果参数para的Java类型是Lo…