首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

xv6(6) 系统调用

$Linux$ 里面系统调用使用的向量号是 $0x80$,$xv6$ 里面使用的 $64$(不同 $xv6$ 版本可能不同)。...上述说的用户接口就会执行 INT 64 触发一个 $64$ 号中断,这里 $xv6$ 做了简化,按照以前版本的 $Linux$,用户接口是调用一个宏定义 $_SYSCALL$,这个宏再来执行 INT...可是系统调用是有很多的,虽然 $xv6$ 中实现的系统调用没多少,没多少也还是有那么一些的,怎么区别它们呢?...这就涉及了系统调用号概念,每一个系统调用都唯一分配了一个整数来标识,比如说 $xv6$ 里面 $fork$ 系统调用的调用号就为 1。...上述差不多将系统调用的一些理论知识说完了,下面用 $xv6$ 的实例来看看系统调用具体如何实现的。

21010
您找到你想要的搜索结果了吗?
是的
没有找到

xv6(4) 中断理论部分

$8259A$ 还有其他的寄存器比如初始化命令寄存器,操作命令寄存器,这里我们后面讲述 $xv6$ 并不会使用 $PIC$,所以这里也就不说明了,最后来看看通过 $PIC$ 的中断流程: PIC 中断流程...如果优先级别设置为 15,则不会接受任何中断,如果优先级别设置为 0,表示接受所有中断,这也是 $Linux$ 设置的默认值。...到 0 ,产生时钟中断时,$Current$ $Count$ 就会自动地从 $Intial$ $Count$ 重新加载,接着新一次的倒数,所以其实 $Current$ $Count$ 似乎没什么用,xv6...$LAPIC$ 自己也可以作为中断源,可在 $LVT$ 中配置相关中断,主要留意时钟中断的设置,$xv6$ 就是使用 $LAPIC$ 自带的时钟来周期性产生时钟中断。...以前 $Linux$ 中系统调用就是使用 $int$ 0x80 来实现的。

22700

xv6(2) 启动代码部分

启动代码部分 本文来说码,实打实地来看看计算机到底是如何启动的,先来看看 $xv6$ 启动的整体流程图,好有个大概认识: 不要被这么一大坨吓到,$xv6$ 的启动过程算简单的,在启动方面做了很多简化,应该说整个操作系统都做了简化...虽说 $xv6$ 的启动过程相对简单,但也是有些复杂的,弯弯绕绕有些多,看代码和看下面文章时可以对照着这张图,免得走掉。...$xv6$ 使用了另一种方法:使用键盘控制器来打开 $A20$,来看码: seta20.1: # Wait for not busy 等待i8042缓冲区为空 inb...KERNEL 前面所做的事情都可以看作是引导部分,目的就是将 $xv6$ 的内核加载到内存,然后将权力交给内核。...最后再来看一下 $xv6$ 的启动流程图: 上面的启动流程图是很完整的一个图,将各种初始化也画出来了,但是本文只讲述了一小部分,其他部分留待相应章节讲述。

22500

xv6(3) 内存管理部分

我觉得那里面对内存管理层次抽象分的很清楚,每个操作系统都有相通性,这里拿出来说说: 物理内存管理,主要就是物理页的分配与回收 虚拟内存管理,主要就是虚拟页的分配与回收 物理内存与虚拟内存建立映射,那就是页表了 xv6...分配某页/块就是将相应的位置 1,回收就是将相应的位置 0 空闲链表法 xv6 对于物理内存的组织管理使用的是空闲链表法。...页表内核部分 映射关系 要了解其他几个参数还需要先来了解 xv6 的虚拟地址空间和实际的物理地址空间的映射关系,这也有相应的结构体表示: #define EXTMEM 0x100000...再者也可以看出 xv6 并没有使用全部的 4G 地址空间,有很大一部分都没有使用,内核的为映射部分和物理地址空间的未映射部分两者大小是不一样的,可能图画得有些迷惑,拿出来说一下。...的设计思路,当然只是看和内存相关比较紧密的部分: 最开始内核加载到物理地址 0x10 0000 处,xv6 内核很小,整个内核只有 200 多 K。

23410

xv6(19) SHELL交互程序

反观 $Linux\ 0.11$ 这一块的处理,它是为管道文件分配了 $inode$ 的,各个层次分明,所以文件读写函数只需要判断 $inode$ 的类型字段去调用不同的读写函数就行了,使得整个代码看起来特别的漂亮...->i_mode)) //普通文件 return file_write(inode,file,buf,count); /***********略***********/ } 这个函数就是 $Linux...实际上在 $Linux$ 的 $bash$ 中,$List$ 不止 ;还有 && || 等符号,详见 man bash struct cmd* listcmd(struct cmd *left, struct...平时在 $Linux$ 下使用命令没有指定命令路径是因为环境变量 $PATH$ 已经帮我们做了这个工作。...总而言之 $xv6$ 机制少,使用方面也要符合习惯于规范。关于文件系统和进程资源的回收详见前文,这里不赘述。

23810

xv6(11) 文件系统:日志

日志就是设计来解决因为系统崩溃导致的错误问题,本文就 $xv6$ 来讲解怎么实现一个简单的日志系统。...上面的理论大都来自 $xv6$ 文档,我们能了解到,最为重要的是实现写操作的原子性,那么怎样实现呢?...$xv6$ 在磁盘上分配了一片日志区,假如现在内存中有一个缓存块准备同步到磁盘区域 A,$xv6$ 并不立即将该缓存块的数据写到磁盘区域 A,而是先写到磁盘的日志区(提交)。...$xv6$ 文件系统的总体布局如下: 引导块位于磁盘第零个扇区(LBA),里面存放的就是引导程序。其后就是超级块,接着就是日志区,分为日志头(位于第一个日志块)和日志数据块。...$n$ 来记录当前日志使用的空间大小,日志区的总大小记录在超级块中(大小的单位是块),同时 $xv6$ 也规定每次日志使用的块数也不能超过 $LOGSIZE$。

17610

xv6(14) 文件系统:创建

当然这只是基本原理,还有很多细节要处理,我们在 $xv6$ 创建文件系统的程序中再详细了解。...主机上有个文件叫做 $fs.img$,虚拟机将这个文件当作 $xv6$ 的磁盘,但是对于 $xv6$ 本身来说,它不知道这个 $fs.img$ 就是主机磁盘上的一个普通文件,对于 $xv6$ 来说,$fs.img...相关功能函数 转化为小端模式 我学习的 $xv6$ 实现基于 $intel$ 的 $x86$ 架构,使用小端模式,$xv6$ 一般运行在虚拟机上,虚拟机又可能运行在各个平台,使用的大小端可能就不一样,这里全转化为小端模式...为什么 $qemu$ 里的 $xv6$ 能使用,原因就在此处了。...$xv6$ 里面的块都是有相应的位图标识,所以这里调用 $balloc$ 将第一个空闲块之前的位图全部置 1。因为 $xv6$ 的系统布局就是数据区前面全是不可分配的元数据,需要全部置 1。

19210

xv6(15) 进程一:数据结构

概念始终只会是一个抽象的概念,进程系列文章通过 $xv6$ 的实例来将进程这个概念具象化。...记录管理着文件的信息,当可执行文件被加载到内存当作进程执行后,也有类似的数据结构来记录管理进程的执行情况,这个数据结构就是 $PCB(Process\ Control\ Block)$,进程控制块,$Linux...简要回顾 $xv6$ 的内存管理方式,计算机启动初始化的时候,$xv6$ 将所有的空闲内存分成一页一页的大小然后使用链表头插法的方式将它们给串起来。...所以 $xv6$ 的空闲物理内存就可以看作是一个大链表。...准确点来说应该是下图这样: 图中有鲜明显色的区域都是实际映射到了物理内存的区域,其中蓝色部分才是 $malloc\ free$ 作用的区域,在 $Linux$ 中程序在内存中的映像有个属性叫做 $break

18810

xv6(20) 常用命令实现

常用命令实现 本节来看看在 $xv6$ 里面一些常见的命令是如何实现的,它们都是用户程序,封装系统调用而成,大多数都很简单一眼过去就能懂那种,来看: echo $echo$ 命令将紧跟其后的参数当作字符串打印出来...来看 $xv6$ 里的实现 首先是两个匹配函数 int matchhere(char* re, char* text); int matchstar(int c, char* re, char* text...printf(2, "rm: %s failed to delete\n", argv[i]); break; } } exit(); //执行完后退出 } $xv6...$ 直接调用 $unlink$ 来"删除"一个文件,但实际上在文件系统调用一文中,我们说过,只有一个文件的链接数,引用数都为 0 的时候才会真正地将一个文件删除,当时还在 $Linux$ 下做了一个实验...上述就是 $xv6$ 中一些命令的实现,很简单,大多数就是调用现成的系统调用就能完成工作,配上详细的注释应该是一眼就能懂什么意思。

26010
领券