linux 神秘的0xC0000000&&内核逻辑地址&&内核虚拟地址&&直接映射&&高端内存

这篇博客详细讲解了Linux中0xC0000000地址的含义,以及内核逻辑地址、内核虚拟地址和高端内存的概念。0xC0000000是3GB用户空间和1GB内核空间的分界线,内核代码被编译到此地址后方。内核通过直接映射和动态映射管理内存,其中直接映射的线性地址可以视为逻辑地址。高端内存用于访问超过1GB的物理地址,当内核需要访问这些地址时,会动态映射相应虚拟地址。 DMA操作通常在直接映射区域进行,以确保物理地址的连续性。
摘要由CSDN通过智能技术生成

 

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汇编语言:从实模式到保护模式》第十一章,当你犯够了错误才能理解了这个偏移量使用不当致错的原因,一旦理解,那么许多东西就很容易懂了&

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值