日志子系统分析 1. 日志子系统简介 Xv6中的log日志子系统主要用于系统以外崩溃挥着掉电后,再次运行时能够恢复运行。xv6中的磁盘中的文件系统布局如下: 日志区域由一个日志头加上30...
Xv6内核分析(十三)
buffer cache分析 1. buffer cache概述 Buffer cache是一个双向循环链表,用于缓存磁盘上的数据以提高性能。使用bread从磁盘上读取数据,使用bwrite将修改的数...
Xv6内核分析(十二)
sleeping lock分析 Xv6中的sleeping lock只在文件系统中使用到,因为从磁盘读写数据可能需要数ms的时间,这时进程可以放弃cpu让其他进程运行。但是放弃cpu的同时也会锁住文件...
Xv6内核分析(十一)
sleep与wakeup分析 1. 案例 首先来看下xv6的sleep和wakeup使用例子: cquire(lock) sleep(chan,lock) release(lock) acquire(...
Xv6内核分析(十)
spinlock分析 1. initlock spinlock分析spinlock: 主要是初始化锁的状态为0,并记录锁的名字用于调试分析。 2. pushcli和popcli 在xv6中,用spin...
Xv6内核分析(九)
ide硬盘驱动分析 1. 磁盘驱动程序 磁盘驱动程序用结构体 buf(称为缓冲区)来表示一个磁盘扇区。每一个缓冲区表示磁盘设备上的一个扇区。域 dev 和 sector 给出了设备号和扇区号,域 da...
Xv6内核分析(八)
新进程运行分析 进程刚创建时的内核栈分布如下: 当从swtch中的ret返回后,新进程回到forkret中执行。 forkret首先会释放ptable.lock这个锁,这个锁是在scheduler线程...
Xv6内核分析(七)
scheduler线程分析 1. scheduler函数 当检索到有一个空闲的PCB后,将PCB的地址记录在c->proc成员中。接着调用switchuvm。 2. switchuvm函数 pu...
Xv6内核分析(六)
main函数之userinit 1. userInit函数 userinit函数做的事就是初始化第一个进程运行所需要的栈中的数据: initcode.S是第一个进程的用户空间程序,_binary_in...
Xv6内核分析(五)
mian函数之kinit2 kinit2函数的作用是将之间的物理内存页添加到空间页链表之中: 在调用kinit2函数之后,物理内存页的申请释放就启用了锁机制。
Xv6内核分析(四)
从核运行过程分析 1. entryother.S 从核的启动代码在entryother.S中,大致的流程和主核启动一样,主要包括: 设置cpu进入32位保护模式。 开启分页部件,在boot启动阶段,和...
Xv6内核分析(三.11)
main函数之startothers 1. startothers函数 startothers函数用来启动其他从核运行,大致的思想就是:首先设置好从核需要运行的代码的地址,然后使用核间中断IPI通知从...