内存的物理地址最低总是从0开始的吗?

tyngi 2010-04-16 09:02:05
如题,
看到一本书上说内存的物理地址最低总是从0开始,在系统启动时将0---896M低端物理内存直接线性映射到内核线性空间
0xC000_0000+896M处,所以在内核中有 线性地址=物理地址+0xC000_0000 的简单映射。
难道内存的物理地址总是从0开始? 特别是在一些嵌入式系统中也是如些吗?
如果内存的物理地址是从0x3000_0000(1G)开始的,那内核中,线性地址到物理地址间的映射是怎样呢?

谢谢!
...全文
2500 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
tyngi 2010-04-20
  • 打赏
  • 举报
回复
看到code中有:vir_addr=phy_addr+PAGE_OFFSET-PHYS_OFFSET.这个PHYS_OFFSET应该就是物理内存的起始地址了,这样的话才没问题。
充电宝111 2010-04-19
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 tyngi 的回复:]
ls认为0xC000_0000这个值是不能变的?
我觉得这个值也就是PAGE_OFFSET的值是可以修改的,只不过修改后,进程的4G线性空间中,就不是1G的内核空间与3G的用户空间了(0xC000_0000就是3G).

还是这个问题:可能有两块内存,一块起始地址为1G,第二块起始地址为2G,内存大小都为128M,如果PAGE_OFFSET修改为2G,那第二块内存映射不是有问题了么?对第二块……
[/Quote]

可以改,但一般情况下没人去改他

物理内存和PAGE_OFFSET有啥关系?一点关系都没有。
zigzag_xiang 2010-04-18
  • 打赏
  • 举报
回复
1,PAGE_OFFSET当然可以修改,内核配置里都有这项,这个内核和用户空间比为1:3是前辈们多年前就定下来的,不是特殊情况是不需要修改的。
2,如你说的确有问题了,但是到底内核是为硬件设计的还是硬件为内核设计的,还是内核和硬件要彼此匹配呢?
充电宝111 2010-04-17
  • 打赏
  • 举报
回复
你没有完全理解虚拟地址的含义
0xC000_0000是虚拟地址(线性地址),雷打不动,一般情况下都是kernel空间的起始地址(X86,ARM),如果这时候物理内存不是0,自然把这个偏移也要算上了。

物理内存不连续,跟这个没关系,内核启动的时候bootmem分配器会处理空洞。
tyngi 2010-04-17
  • 打赏
  • 举报
回复
ls认为0xC000_0000这个值是不能变的?
我觉得这个值也就是PAGE_OFFSET的值是可以修改的,只不过修改后,进程的4G线性空间中,就不是1G的内核空间与3G的用户空间了(0xC000_0000就是3G).

还是这个问题:可能有两块内存,一块起始地址为1G,第二块起始地址为2G,内存大小都为128M,如果PAGE_OFFSET修改为2G,那第二块内存映射不是有问题了么?对第二块内存来说,2G+2G就是4G了,进程的线性空间总共才4G,当然,这是在没有启用高端内存HIGHT_MEMORY下。

tyngi 2010-04-16
  • 打赏
  • 举报
回复
如果起始地址为0x3000_000,那线性空间1G(内核)/3G(用户)变成了2G(内核)/2G(用户)了.
-------------------------------------
看不明白你的意思


意思是修改了PAGE_OFFSET=0xC000_0000-0x3000_0000(0x8000_0000),那在用户态时,4G进程空间中,用户空间就不是3G,而是2G(0x8000_0000)了。

另外,内存地址可以不连续吧?
deep_pro 2010-04-16
  • 打赏
  • 举报
回复
默认的PAGE_OFFSET为0xC000_0000(3G),ls的意思是修改这个PAGE_OFFSET=0xC000_0000-起始地址?
-------------------------


如果起始地址为0x3000_000,那线性空间1G(内核)/3G(用户)变成了2G(内核)/2G(用户)了.
-------------------------------------
看不明白你的意思


还有一个问题.可能有两块内存,一块起始地址为1G,第二块起始地址为2G,内存大小都为128M,如果PAGE_OFFSET修改为2G,那第二块内存映射不是有问题了么?
----------------------------------------------------------
没有遇到过内存地址不连续的情况
tyngi 2010-04-16
  • 打赏
  • 举报
回复
默认的PAGE_OFFSET为0xC000_0000(3G),ls的意思是修改这个PAGE_OFFSET=0xC000_0000-起始地址?
如果起始地址为0x3000_000,那线性空间1G(内核)/3G(用户)变成了2G(内核)/2G(用户)了.

还有一个问题.可能有两块内存,一块起始地址为1G,第二块起始地址为2G,内存大小都为128M,如果PAGE_OFFSET修改为2G,那第二块内存映射不是有问题了么?

谢谢!
deep_pro 2010-04-16
  • 打赏
  • 举报
回复
嵌入式RISC CPU,load/store 结构的,内存和IO共享相同的地址空间,所以一切都没准

如果内存的物理地址是从0x3000_0000(1G)开始的,那内核中,也是加一个固定偏移,加到0xc0000000

4,436

社区成员

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

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