Xv6

Xv6内核分析(十四)

日志子系统分析 1. 日志子系统简介 Xv6中的log日志子系统主要用于系统以外崩溃挥着掉电后,再次运行时能够恢复运行。xv6中的磁盘中的文件系统布局如下:   日志区域由一个日志头加上30...
阅读全文
Xv6

Xv6内核分析(十三)

buffer cache分析 1. buffer cache概述 Buffer cache是一个双向循环链表,用于缓存磁盘上的数据以提高性能。使用bread从磁盘上读取数据,使用bwrite将修改的数...
阅读全文
Xv6

Xv6内核分析(十二)

sleeping lock分析 Xv6中的sleeping lock只在文件系统中使用到,因为从磁盘读写数据可能需要数ms的时间,这时进程可以放弃cpu让其他进程运行。但是放弃cpu的同时也会锁住文件...
阅读全文
Xv6

Xv6内核分析(十)

spinlock分析 1. initlock spinlock分析spinlock: 主要是初始化锁的状态为0,并记录锁的名字用于调试分析。 2. pushcli和popcli 在xv6中,用spin...
阅读全文
Xv6

Xv6内核分析(九)

ide硬盘驱动分析 1. 磁盘驱动程序 磁盘驱动程序用结构体 buf(称为缓冲区)来表示一个磁盘扇区。每一个缓冲区表示磁盘设备上的一个扇区。域 dev 和 sector 给出了设备号和扇区号,域 da...
阅读全文
Xv6

Xv6内核分析(八)

新进程运行分析 进程刚创建时的内核栈分布如下: 当从swtch中的ret返回后,新进程回到forkret中执行。 forkret首先会释放ptable.lock这个锁,这个锁是在scheduler线程...
阅读全文
Xv6

Xv6内核分析(七)

scheduler线程分析 1. scheduler函数 当检索到有一个空闲的PCB后,将PCB的地址记录在c->proc成员中。接着调用switchuvm。 2. switchuvm函数 pu...
阅读全文
Xv6

Xv6内核分析(六)

main函数之userinit 1. userInit函数 userinit函数做的事就是初始化第一个进程运行所需要的栈中的数据: initcode.S是第一个进程的用户空间程序,_binary_in...
阅读全文
Xv6

Xv6内核分析(五)

mian函数之kinit2 kinit2函数的作用是将之间的物理内存页添加到空间页链表之中: 在调用kinit2函数之后,物理内存页的申请释放就启用了锁机制。
阅读全文
Xv6

Xv6内核分析(四)

从核运行过程分析 1. entryother.S 从核的启动代码在entryother.S中,大致的流程和主核启动一样,主要包括: 设置cpu进入32位保护模式。 开启分页部件,在boot启动阶段,和...
阅读全文
Xv6

Xv6内核分析(三.11)

main函数之startothers 1. startothers函数 startothers函数用来启动其他从核运行,大致的思想就是:首先设置好从核需要运行的代码的地址,然后使用核间中断IPI通知从...
阅读全文