0x03: JOS的启动过程
启动只有两个文件: boot.S 和 main.c.
从实现可以发现,JOS在启动方面的做法是,首先用汇编代码尽早设置好c函数运行所需要的条件,然后迅速转入用C语言实现。
此外,JOS用到了目前通用的ELF格式。
boot.S的作用:
1. cli, cld,然后清空ds,es和ss的内容。
2. Enable A20, 使得内存管理范围超出1M之外。
3. 设置gdt,然后打开保护位(cr0)。
4. ljmp到保护模式,转入32位保护模式。
5. 设置ds,es,fs,gs和ss为保护模式下数据段描述符的地址(0x10)。
6. 设置好栈,进入C代码中的函数bootmain(), 继续启动过程。
此时,内存布局及内存中的内容大致如下:
|-------------|
| |
| |
|-------------| <-- 0x7dff(the end of bootcode)
| |
|-------------| <-- 0x7c64(gdtdesc)
| |
|-------------| <-- 0x7c4c(gdt)
| |
| |
| |
| |
|-------------| <-- 0x7c00 (esp)
| |
| |
| |
|-------------| <-- 0x00000000
main.c的作用:
1. 将磁盘(即kernel)的前8个扇区的内容读入某内存地址(任意地址均可,只要不影响启动。jos使用地址为0x10000, 在boot代码所用内存区间(0x7c00-0x7dff)之外,因此是安全的),并且分析其是否为正确的ELF格式文件。
2. 若为正确ELF文件,则根据这8扇区内容将kernel中对应的program segment读入内存中对应的位置(ph->p_va).
3. 从kernel的e_entry位置开始执行。
此时,将进入kernel的主体代码,boot代码任务结束。
(转贴请注明: by: chunchengfh, from:
chunchengfh.cublog.cn)
阅读(1358) | 评论(0) | 转发(0) |