project5到project9主要处理内存管理。
其中project5是一个大工程,内部分为5个小工程,本次主要针对第一个小工程进行分析。
在project3.1中,就已经使用了ld的linker script,直接在其中指定链接时的一些配置。比如起始代码的符号,起始地址值,某个段的align值,以及可以定义一些变量。
在project5中,起始地址改为汇编函数kern_entry,其中重新设置gdt,然后调入c代码kern_init。同时设置内核地址为0xC0100000,为内存管理做准备,同时也是起始地址改为汇编kern_entry的原因:因为内核代码开始时仍然是加载到0x00100000的,而编译时内核地址指定为0xC0100000,怎么办呢?在kern_entry中,创建临时的gdt,其中的段的基址都是-0xC0000000,这样,所有的地址访问就自然都变成了(address-0xC0000000)了,内核代码中的地址也就正确了。
先分析这些,明天继续。