lab2:
总共分为四个包一个文件,分别为:
boot: 操作系统加载程序代码
kern: 操作系统内核代码
libs: 相关的库和数据结构
tools: 相关编译链接调试工具
Makefile: 构建脚本
操作系统启动顺序:
CPU启动加载操作系统加载程序到物理地址为0x7c00处,先从上往下执行bootasm.S汇编代码,在bootasm.S里先解决A20问题(参考https://ferryman1st.wordpress.com/2007/07/23/a20%E9%97%AE%E9%A2%98-%E5%85%B3%E4%BA%8Ex86%E5%9C%B0%E5%9D%80%E7%BA%BF%E7%9A%84%E5%8E%86%E5%8F%B2%E9%81%97%E7%95%99%E9%97%AE%E9%A2%98/),然后启动保护模式,并执行部分寄存器初始化,最后跳转到bootasm.c的bootmain函数执行。bootmain做的工作主要是从磁盘加载操作系统内核代码到内存中,具体加载到什么地方,在makefile构建内核镜像时链接时指定了入口地址,可以在tools的kernel.ld里看到加载到了虚拟地址为0xC0100000处,通过kernel.ld里指定entry point和kern包下entry.S文件可以看到执行操作系统内核的第一条指令在entry.S的kern_entry
根据讲义里写的在enable page之前应该会设置一个va - 0xC000000 = pa的一个段映射关系,看代码应该是entry.S中的movl $REALLOC(__boot_pgdir),%eas这句做的,这句意思不是太明白。。。。。????????