xv6源码分析
elif
这个作者很懒,什么都没留下…
展开
-
xv6源码分析(一):BootLoader
BootLoader是操作系统启动时的重要一环,负责从实模式切换到保护模式并且将存在存储设备的操作系统二进制文件读入内存,最后将控制权交给操作系统。一、计算机启动时的硬件动作PC机上电时运行的第一条指令总是存储在ROM中的BIOS指令,BIOS固件对硬件进行自检然后按照规范总是从磁盘的中的第一个扇区载入程序,并将其放入0x07c00地址处,一般情况下这个便是BootLoader,有些Boo原创 2017-01-17 16:09:52 · 12672 阅读 · 0 评论 -
xv6源码分析(三):锁
锁xv6支持多核心CPU,计算机上有多个同时运行代码的CPU,但是所有CPU共享同一个地址空间,为了保护数据结构的一致性,xv6需要某一种机制来防止它们互相干扰。其实即使在单处理器的抢占内核中,也同样需要处理内核数据结构的互斥现象。xv6以硬件提供的处理方式,采用了较为底层的锁机制来处理多核操作系统的互斥问题,xv6只是简单的使用了自旋锁,因为一般情况下内核对数据结构的占用时间一般比较短,使用原创 2017-01-20 15:28:16 · 5620 阅读 · 0 评论 -
xv6源码分析(二):内核初始化和多核启动
内核初始化bootloader将内核载入物理地址0x100000,通过跳转命令正式将控制权交给内核# Entering xv6 on boot processor, with paging off..globl entryentry:这里的entry便是内核最开始运行的代码,前面说过,此时虽然已经开始了保护模式但是分页机制并没有开启,这个时候线性地址等于物理地址,但是内核中所有的符号地址都是位于原创 2017-01-19 21:12:22 · 6612 阅读 · 0 评论 -
xv6源码分析(四):内存管理
xv6通过页表机制实现了对内存空间的控制。页表使得 xv6 能够让不同进程各自的地址空间映射到相同的物理内存上,还能够为不同进程的内存提供保护。 除此之外,我们还能够通过使用页表来间接地实现一些特殊功能。xv6 主要利用页表来区分多个地址空间,保护内存。另外,它也使用了一些简单的技巧,即把不同地址空间的多段内存映射到同一段物理内存(内核部分),在同一地址空间中多次映射同一段物理内存(用户部分的每一原创 2017-01-21 15:15:58 · 14351 阅读 · 4 评论 -
xv6源码分析(五):异常、中断、系统调用机制
操作系统在开始运行用户进程的时候,内核便开始处于被动状态,只有在出现以下几种情况的时候才会触发硬件机制陷入内核:(1)用户代码由于某种原因引发异常(例如除以0);(2)硬件产生中断并且没有屏蔽触发中断;(3)用户代码调用相关指令(例如x86体系下的int系统调用指令)主动陷入内核。以上三种情况便是异常、中断、系统调用机制。这三种机制由于需要陷入内核所以在进入内核之前必须先保存现场,然后回到用户环境的原创 2017-01-21 22:08:50 · 13200 阅读 · 2 评论 -
xv6源码分析(六):进程调度
xv6是支持多处理器多进程的操作系统,每个CPU都能够并行地运行不同的进程,同一个CPU也能通过不断地切换进程达到并发的效果,xv6在时钟中断机制下,在很短的时间内完成进程切换操作使得宏观上感觉在同一个CPU下能出现“并行”的效果。进程上下文xv6在进程调度中主要通过切换context上下文结构进行的:struct context { uint edi; uint esi; uint e原创 2017-01-23 15:12:35 · 8512 阅读 · 1 评论 -
xv6源码分析(七):文件系统
xv6文件系统采用了分层的实现,下面的每一层都向上提供接口供上层调用,这里并不阐述xv6文件系统的系统细节,仅仅针对每一层需要注意的问题和各种接口的联系做解释,具体的文件系统细节可参考xv6中文文档。xv6文件系统块缓冲层xv6将硬盘中的每个分区编号为各种块,每块512Byte,磁盘读写总是以块为单位,xv6使用结构buf来代表磁盘块数据在内核中的表示:struct buf { int flag原创 2017-01-23 20:49:37 · 6772 阅读 · 2 评论