add description of main func for xv6 of riscv

This commit is contained in:
shzhxh 2019-12-02 21:16:10 +08:00
parent 9452c81352
commit 209b3d9397
2 changed files with 15 additions and 5 deletions

View File

@ -2,11 +2,19 @@
bootblock->entry.S->main.c
##### bootblock的执行过程
##### 1. 从MBR开始执行
关中断开启A20地址线开启保护模式设置段选择子将内核载入内存
从bootasm.S的`start`标记处开始,关中断开启A20地址线开启保护模式设置段选择子调用bootmain函数
##### main函数的执行过程
`bootmain`函数在bootmain.c其作用是将内核载入内存。然后跳转到内核的入口开始执行内核的入口为`_start`。
##### 2. 内核的入口_start
`_start`在entry.S开启分页然后跳转到main函数开始执行。
##### 3. main函数
`main`函数在main.c是内核的主控函数。
1. 在`kalloc.c`里实现kinit1函数(不需要锁的物理页分配)其原理是把前4M的物理页放到一个单向链表里。kinit1和kinit2调用freerange将内存加入空闲链表中, freerange则是通过对每一页调用kfree实现该功能。一个PTE只能指向一个4096字节对齐的物理地址(即是4096的倍数),因此freerange用PGROUNDUP来保证分配器只会释放对齐的物理地址。分配器原本一开始没有内存可用,正是对kfree的调用将可用内存交给了分配器来管理。
@ -96,5 +104,7 @@ bootblock->entry.S->main.c
##### 3. main函数
文件位置kernel/main.c这是整个内核的总控函数目的是。
文件位置kernel/main.c这是整个内核的总控函数。如果当前的核编号为0则为主控核执行一系列的硬件初始化工作然后执行scheduler函数进入处理器调度。如果当前的核编号不为0则初始化当前核的数据结构然后执行scheduler函数进入处理器调度。

View File

@ -18,7 +18,7 @@ make qemu
1. bootasm.S和bootmain.c编译为bootblock
2. bio.c, console.c, exec.c, file.c, fs.c, ide.c, ioapic.c, kalloc.c, kbd.c, lapic.c, log.c, main.c, mp.c, picirq.c, pipe.c, proc.c, sleeplock.c, spinlock.c, string.c, swtch.S, syscall.c, sysfile.c, sysproc.c, trapasm.S, trap.c, uart.c, vectors.pl, vm.c, entry.Sentryother.S, initcode.S编译为kernel
3. 将boolblock和kernel装入kernel.img里
3. 将bootblock和kernel装入kernel.img里。bootblock放在第一个扇区里(即MBR)这样BIOS就从MBR开始执行了而kernel则从第2个扇区开始放入。
#### kernel(对于riscv)