Xv6

Xv6内核分析(六)

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

Xv6内核分析(八)

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

Xv6内核分析(五)

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

Xv6内核分析(二)

启动Xv6 1. Xv6入口代码 内核的入口代码在entry.S中,Xv6的内核是支持用grub引导的,grub引导的知识见此博客:https://blog.csdn.net/xiaolanmysel...
阅读全文
Xv6

Xv6内核分析(九)

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

Xv6内核分析(三.8)

main函数之uartinit uart的具体编程知识见8250相关资料。 由代码可知,在初始化了uart之后,调用ioapicenable使能了uart中断,处理中断的cpu设置为了主核???
阅读全文
Xv6

Xv6内核分析(三.7)

main函数之consoleinit devsw用来表示一个设备,xv6下最多有10个设备。其中console是第1个设备: consoleinit函数很简单,就是初始化了devsw中的读写操作函数指...
阅读全文
Xv6

Xv6内核分析(三.4)

main函数之seginit 1. seginit函数 seginit是用于设置每个cpu自己的GDT全局描述符表: 首先获得当前cpu的结构,然后对其中的gdt初始化,最后加载gdt寄存器。 1.1...
阅读全文