为什么linux操作系统内核在虚拟地址空间的3GB处?

avimatrix 2008-01-10 05:28:28
为什么linux操作系统内核在虚拟地址空间的3GB处?
...全文
1917 26 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
ask_qianru 2010-07-26
  • 打赏
  • 举报
回复
其实很简单,就是早先的一个规定,有些系统是在1G以内,而linux规定是3G到4G的范围
carey1986 2010-07-18
  • 打赏
  • 举报
回复
long型,32位上可以用int
[Quote=引用 24 楼 zecard_fu 的回复:]

引用 14 楼 sailor_8318 的回复:

内核在编译时有个默认参数KERNEL_BASE,通常默认为0xc000 0000即3G
也就是说Linux内核虚拟地址3G是可以更改的


问一下表示地址的是 unsigned int 型吗?
[/Quote]
louyong0571 2010-07-08
  • 打赏
  • 举报
回复
就是虚拟地址嘛
zecard_fu 2010-07-08
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 sailor_8318 的回复:]

内核在编译时有个默认参数KERNEL_BASE,通常默认为0xc000 0000即3G
也就是说Linux内核虚拟地址3G是可以更改的
[/Quote]

问一下表示地址的是 unsigned int 型吗?
linkejin 2010-07-07
  • 打赏
  • 举报
回复
说的很深奥啊
火雲邪神 2010-07-04
  • 打赏
  • 举报
回复
zty598416146 2010-07-03
  • 打赏
  • 举报
回复
这个没啥关系吧 呵呵
Linconglc 2010-05-22
  • 打赏
  • 举报
回复
为了方便用户态和内核态的内存管理,当内存小于896时,内核会把物理地址永久映射在3G开始处,而对于使用前3G的用户态程序来说,如果内核动态分配物理地址到他的线性地址,那用户只能在系统给的区域里活动,超了,他访问不到,也无权访问。
ArtiFly2000 2010-05-21
  • 打赏
  • 举报
回复
没有关系,你一个进程用的不超过4G就成
进程用到哪些内存,就把这些内存映射到该进程的4G地址空间中就可以了

不过以后都64位系统了,那就没有4G地址空间的限制了

[Quote=引用 7 楼 xp4105 的回复:]
如果实际内存超过4G , 那怎么办呢?


如何分配地址 ?
[/Quote]
小新小新小新 2009-03-06
  • 打赏
  • 举报
回复
虚拟地址的开始:大概在3G+一段内核映射空间(最多896M)+8M
结束:4G减去几十K吧

内核映射空间来映射物理内存,其地址和物理地址之间有一固定的偏移3G,8M是防止虚拟地址越界,很多这方面的资料,你查查吧
meiZiNick 2008-05-01
  • 打赏
  • 举报
回复
以后需再关注,现在先帮你顶一下
杨帆_8318 2008-04-12
  • 打赏
  • 举报
回复
内核在编译时有个默认参数KERNEL_BASE,通常默认为0xc000 0000即3G
也就是说Linux内核虚拟地址3G是可以更改的
talent1224 2008-04-02
  • 打赏
  • 举报
回复
看《linux内核完全剖析》里面写得很清楚
Great_qiang 2008-03-12
  • 打赏
  • 举报
回复
在分页内存管理中,如果cpu是32位,那么系统只能管理到4G的内存空间。
虚地址是软件实现 物理地址则是指物理内存。
OstrichFly 2008-02-25
  • 打赏
  • 举报
回复
1: 并不是所有平台都在3G
2:i386没有PAE,并且编译时没有特别指定的时候才在3G
3:在这种情况下,由于地址总线最大只能访问4G的空间,并且为了在切换入内核空间时不需要重新加载内核的页表,使用了一个技巧:让内核与用户空间影射到同一内存段。根据实际需要,给内核保留了1G的内存空间,并且为了让应用程序看起来是从0地址开始的,那么内核的1G内存段就占用了3G~4G的空间。这就回答了你的问题。
4:其实这种方法不是唯一的,比如,可以让内核少占用一些空间,那么就不是3G了。或者,让内核与应用程序不映射到同一个内存空间,那么用户程序可以使用几乎全部的4G空间(有些patch可以做到,但这样的话内核<->用户态切换时代价很大。说几乎4G的原因是:调用syscall时还是需要一段内存传递参数的)。

还有最重要的一点:回答得这么辛苦,LZ下次问问题的时候给点分撒
gogofly_lee 2008-02-18
  • 打赏
  • 举报
回复
由于CPU总线是32位的,所以它最多能够支持2^32=4G的地址空间,在LINUX系统中,把3G以后作为内核空间,1--3G位用户进程空间,如果物理内存大于896M,则需要把多余的内存划分位高端内存,利用1G-896M的内存来映射高端内存,这也是为什么物理内存大于896M而不是1G时就需要高端内存的原因。
对于64位的系统,它的内存空间可以倒2^46,所以不因该有此限制。
DennisRitche 2008-01-29
  • 打赏
  • 举报
回复
虚拟地址 线性地址 物理地址

弄清楚先
windlazio 2008-01-22
  • 打赏
  • 举报
回复
内存可以分为3个部分,最底下的16M是供DMA使用的,1G以下的为正常内存区ZONE_NORMAL,如果内存超过1G,多出来的部分是高端内存区ZONE_HIGH,正常内存区和高端内存区对内存的管理方式不一样
xp4105 2008-01-21
  • 打赏
  • 举报
回复
如果实际内存超过4G , 那怎么办呢?


如何分配地址 ?
crashbluebird 2008-01-18
  • 打赏
  • 举报
回复
4GB是32位系统虚拟内存的上限。即使你只有64m的物理内存也可以有4GB的虚拟内存
一般用户进程在0到2G 操作系统在3到4G
但也不是绝对的,可以通过设置boot.ini使用用户进程空间达到3G的大小。
具体哪个option可以去网上查。
加载更多回复(5)

4,466

社区成员

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

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