内存管理的几点疑惑,请指教。

goodyun82 2008-05-05 11:12:08
都说linux内核占用0xc0000000以上的空间,即3G~4G处,而且0xc0000000处开始是物理内存的影射,比如物理内存大小是64M,那么0xc0000000到0xc0000000+64M处是影射的物理内存,而且内核中确实也有全局变量high_memory来保存物理内存上限所对应的虚地址。那么有两个疑惑了:
(1)对于物理内存大于1G的怎么办?你一共才1G的虚地址空间,怎么影射超过1G的内存?
(2)对于booter中启动参数带mem=..的来说,high_memory包含保留内存吗?比如,物理内存大小是128M,启动的时候用选项mem=64M,那么high_memory为多少?
...全文
478 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
softwarewander 2009-03-11
  • 打赏
  • 举报
回复
mingtianhui
hefuhua 2009-03-10
  • 打赏
  • 举报
回复
[Quote=引用楼主 goodyun82 的帖子:]
都说linux内核占用0xc0000000以上的空间,即3G~4G处,而且0xc0000000处开始是物理内存的影射,比如物理内存大小是64M,那么0xc0000000到0xc0000000+64M处是影射的物理内存,而且内核中确实也有全局变量high_memory来保存物理内存上限所对应的虚地址。那么有两个疑惑了:
(1)对于物理内存大于1G的怎么办?你一共才1G的虚地址空间,怎么影射超过1G的内存?
(2)对于booter中启动参数带mem=..的来说,high_memory包含保留内存吗…
[/Quote]

蓝色的话我觉得不太对,可以理解内核是在内存中的一个普通程序,这个程序到底装在内存的那个物理页上,这个对我们理解不重要
我们知道内核的运行单位是进程,可以不去管中断和软中断和定时器之类的东西,那么这个普通的程序管理了每个进程,而给每进程
规定了0-3G为用户空间,3-4G为内核空间,这两块是每个进程都具备的,而这个0-3G,3-4G的虚拟地址跟我们的进程的机制可以说没有
什么关系,内核让每个进程自己觉得都享有这个虚拟空间,如果有N个进程就有Nx4G的虚拟空间在使用.

我想64M或者更多的物理,或者高端内存,这个跟MMU和内核内存管理有关系的,具体怎么实现又是需要继续专研了.

我们不太清楚的就是linux进程概念和4G虚拟地址和物理内存的概念,这个问题我刚学的时候是折腾了1年多

又不足的希望其他的兄弟指正我的理解和补充.
KevinRecycler 2009-03-10
  • 打赏
  • 举报
回复
学习了
独孤过儿 2009-03-10
  • 打赏
  • 举报
回复
請參看一下《Linux內核完全注釋》第十章,內存管理。那裡面寫的非常詳細了

我不會回答的原因是怕自己說不明白,誤導了各位,所以就直接推薦書了,呵呵
xhy_851221 2009-03-08
  • 打赏
  • 举报
回复
来学习
顺便帮顶
  • 打赏
  • 举报
回复
up,学习下
小新小新小新 2009-03-06
  • 打赏
  • 举报
回复
我明白你的意思,物理映射最多到896M当你的物理内存大于这个值时,就用896M了!
linuxguy 2008-05-06
  • 打赏
  • 举报
回复
1)映射可以映射到4GB,你内存大于1G有何妨? 感觉你说得有些混乱!
虚拟地址是4GB,应该问如果大于4Gb该怎么办? 呵呵, 但是32bit CPU最多4G,所以32bit CPU没法进行大于4GB寻址.
2)最好做个试验!
dxing_1983 2008-05-06
  • 打赏
  • 举报
回复
保留是预留给后面可能空间不够的时候用的
只是人为的规定用户内核空间,其实你都可以用
goodyun82 2008-05-06
  • 打赏
  • 举报
回复
今天在板上把high_memory打印出来了,呵呵,包含保留内存的大小。
high_memory好象在很多地方会用做判断,典型的就是ioremap的时候。哎,刚刚开始研究内核,很多不懂!今天看了下自己的板内核是在0x80000000位置处开始的,mips架构。
那位大虾能解释下保留内存一般都在什么情况下使用?
joyself 2008-05-06
  • 打赏
  • 举报
回复
对于 2) 因为你的物理内存才128M, 所以没有所谓的高端内存
xianfengdesign 2008-05-06
  • 打赏
  • 举报
回复
通过PAE,32bit的X86 CPU可以访问到64GB内存

》对于物理内存大于1G的怎么办?你一共才1G的虚地址空间,怎么影射超过1G的内存?

准确的说应该是大于896MB的怎么办。
高于896MB的内存,Linux把它们作为高端内存,这些内存在kernel初始化时并没有映射到页表上。
Kernel是保留内核空间那1GB的高128MB用于临时映射这些高端内存,所以,如果要访问这些高端内存,你必须要将它们映射到那个保留128MB中。

4,441

社区成员

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

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