03-启动-虚拟地址映射

为何需要虚拟地址映射?

这个问题其实牵涉到在内存布局中,内核放在逻辑高地址还是低地址?在内核启动过程,虚拟地址映射不是必要的,默认可以理解为实地址和虚拟地址一一映射(当然还有别的复杂的情况,暂不考虑),比如FreeNOS就是将内核直接映射在逻辑内存低地址处。

  • 放在低地址的优点在于编译链接内核时候直接用实地址即可,内存管理相关相对直观一点。而缺点就是编译用户态进程的时候,载入地址(entry point)略微反直觉(就比如是0x80000000)。

  • 放在高地址的优缺点恰好与低地址的相反,内存管理上抽象复杂许多,优点也仅是用户态进程的entry point符合直觉(一般就是0x0地址)

总的来说两者都可以,只不过为了与xv6linux对齐,并且增加点难度,我这边选择了将内核放在高地址。

具体怎么做?

最终目标简单来说就是,将原来上一章中的载入地址加上一个偏移KERNEL_BASE即可,这样做的最大好处是便于内核态做虚实地址的切换。也就是内核态的地址映射遵循简单的数学公式虚拟地址 = 实地址 + KERNEL_BASE

实现的思路

  • 1、编译链接时候全部使用虚拟地址,也就是在kernel.ld中指定了KERNEL_BASE
  • 2、在启动时候,预先进行虚拟地址映射,假定编译出来的内核最终体积小于8M,那么映射范围就是[0, 8M] -> [KERNEL_BASE, KERNEL_BASE + 8M]

最终如何实现依赖于各个处理器的MMU,就比如x86的页管理机制,具体在后续内存管理章节会详细展开,这章节深究会导致本末倒置。

参考资料

  • 1、xv6-book
  • 2、linux 1.0
  • 3、https://github.com/dwelch67/raspberrypi
  • 4、INTEL 80386 PROGRAMMER’S REFERENCE MANUAL 1986
  • 5、ARM Cortex -A Series Version: 4.0 Programmer’s Guide
  • 6、Arm ® Architecture Registers for A-profile architecture
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值