0xC0000000个人笔记:
0xC0000000:3GB的起始地址。一个进程分为两个部分:私有和全局。私有部分是指进程自己的代码,而全局部分则是指内核代码。局部是进程私有的,而全局则是所有进程公用的。理解这个只需要理解页表即可:4GB内存,0-3GB用于用户,3-4GB用于内核,也就是说AB两个进程,页表中0-3GB分别映射到了不同的物理内存,而3-4GB都是映射到了同一片物理内存即内核代码段(内核可以通过复制把内核部分页表项复制到用户进程的页表中)。(“《ULK》 P74翻译版“原话”:主内核全局目录的最高目录项部分作为参考模型,给每个普通进程对应的页全局目录项提供参考模型 。 ”)。
csdn博客-内核的连接脚本vmlinux.lds中
. = PAGE_OFFSET + TEXT_OFFSET; 将我们的内核代码编译到0xc0000000+TEXT_OFFSET处。就像我们做的嵌入式实验一样,编译时我们的代码默认会加载到0x30000000处执行一样,而启动代码刚开始是加载到0x0处,编译好的代码需要在地址0x0处执行一段,因为在把我们的代码复制到0x30000000之前代码中使用的都是相对跳转和相对偏移,并不涉及存放数据的地址,所以即使我们编译时设定执行地址是0x30000000而实际在地址0x0处执行并不会出错。(要想深刻理解偏移量,则可以尝试写一个程序,从实模式跳入保护模式,见《x86汇编语言:从实模式到保护模式》第十一章,当你犯够了错误才能理解了这个偏移量使用不当致错的原因,一旦理解,那么许多东西就很容易懂了&