Linux内核线性地址到物理地址的疑问

kieran 2017-07-24 03:51:01
Linux内核的虚拟地址到物理地址有两种方法:
1. vir_to_phy = vir_addr - PAGE_OFFSET;
2. vir_addr查找页目录,在查找页表,然后得到物理地址;

这两种映射物理地址,有什么区别和联系? 分别在什么情况下用哪一种?会不会有些矛盾?
...全文
1922 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
kieran 2018-03-19
  • 打赏
  • 举报
回复
追问: 这两种映射方式会不会映射到同一个物理地址上去? 或者Linux采用了什么机制能够隔离这两种方式映射到同一个物理地址上去? @ wjx5210 @ Heaven_Redsky
wjx5210 2017-12-21
  • 打赏
  • 举报
回复
引用 6 楼 Heaven_Redsky 的回复:
就内核而言,kmalloc的内存物理连续,与硬件低地址空间一一对应,大小有限,用virt_to_phy()转换。vmalloc的内存逻辑连续,物理不连续,需要通过页表知会mmu进行线性地址与物理地址的转换。
同意。 内核中有Normal区域,就是常说的低端内存,虚拟地址和物理地址是线性偏移的。 而vmalloc区域不要求物理地址连续,连续的虚拟地址映射到不连续的物理页上。 为什么在64bit中还需要vmalloc区域呢? 物理内存是固定的,如果全部都是线性偏移,随着内存的申请和释放,内存都会呈现碎片化趋势,空闲物理页也不再连续,再申请的时候也还是需要进行动态映射的。所以干脆就划一片区间供vmalloc使用。
野草和大树 2017-10-27
  • 打赏
  • 举报
回复
内存访问。是采用段基址:段内偏移量得到的就是线性地址,同时也是物理地址。这是没有采用分页机制。采用分页机制后也就是CR0寄存器的PG位置1。将采用分页机制,分页机制是联立在分段机制之上的。过程是 段基址:段内偏移量 得到线性地址,这时候的线性地址并不是物理地址,而是我们所说的虚拟地址,这个地址需要经过分页加工,才能得到物理地址,也就是说分段寻址这一步是必须步骤。原因是向下兼容,也就是说,以前的程序也能在现在的机子上跑起来。为什么要分页?因为段的内存容量太大了,假如4G内存,三个进程,分别1G2G3G.你采用分段的话,不能同时运行三个进程。最多同时运行两个。但是采用分页的话。你可以同时运行三个。你的进程并不是一下都加载到内存中,而是你需要的才加载进来。加载进程要有个单位,这里有两个单位。你一次要加载多少数据进内存?分段,将一个进程的分为几个大段。而分页将进程分为以4KB位单位的页。明显才用分页能同时运行更多的进程。还有一个区别,分段的进程内存地址是连续的。而分页可以不连续。分页有自己的寻址机制。一个进程可以被分为很多页处于内存中的多个不连续位置。
Heaven_Redsky 2017-09-26
  • 打赏
  • 举报
回复
就内核而言,kmalloc的内存物理连续,与硬件低地址空间一一对应,大小有限,用virt_to_phy()转换。vmalloc的内存逻辑连续,物理不连续,需要通过页表知会mmu进行线性地址与物理地址的转换。
herome0000 2017-09-26
  • 打赏
  • 举报
回复
同意楼上的说法
我并不是大神 2017-09-19
  • 打赏
  • 举报
回复
蹭个积分啊啊啊、
qq_36234920 2017-09-18
  • 打赏
  • 举报
回复
aaaaaa
huangxingzhou 2017-09-04
  • 打赏
  • 举报
回复
第一种方法比较直接。逻辑地址直接映射到物理地址。 第二种方法则拐了几个弯。步骤多且繁琐。不过,这种方法使用操作系统的文件内部系统比较多。
yjpcn 2017-09-01
  • 打赏
  • 举报
回复
不同的平台估计不大一样,同问
yjpcn 2017-09-01
  • 打赏
  • 举报
回复
这个应该是配置到寄存器里,哪些地址用哪种方法,当访问时,硬件上就直接翻译了,

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧