免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2726 | 回复: 5
打印 上一主题 下一主题

内核运行地址,堆栈地址问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-30 11:52 |只看该作者 |倒序浏览
10可用积分
请问:
1 内核本身的运行地址是哪个地址,我想应该是被bootloader加载到的地址吧,那大小又是多少如何确定的呢?
2 堆和栈的地址又是多少呢?又是如何确定的呢?

论坛徽章:
0
2 [报告]
发表于 2009-03-30 15:36 |只看该作者
内核运行于虚拟高端地址,跟bootloader加载到的物理地址是两码事

论坛徽章:
0
3 [报告]
发表于 2009-04-02 14:09 |只看该作者
不是吧 居然没人来看看?

论坛徽章:
0
4 [报告]
发表于 2009-04-02 14:21 |只看该作者
内核运行在内核逻辑地址空间,也就是0xC0000000开始系统实际物理内存大小的虚拟地址空间,不是虚拟高端地址空间;bootloader加载内核的地址是内核逻辑地址对应的虚拟地址。

论坛徽章:
0
5 [报告]
发表于 2009-04-02 16:32 |只看该作者
那堆栈的地址呢 堆栈对应地址是多少怎么确定 ?

论坛徽章:
0
6 [报告]
发表于 2009-04-02 22:40 |只看该作者

回复 #5 rw99yy 的帖子

堆:内核里面使用的堆都是通过vmalloc来获取的,而vmalloc获取的其实就是3G~4G之间除了哪些直接映射物理内存条之外的地址空间,所以在内核里面所有的堆中中的东西起地址永远超过0xC0000000+RAM_SIZE的。(RAM_SIZE<=896)。
栈:任何一个内核routine在运行时,其都有依赖于某个进程的环境,也就是current指向的进程。栈的地址就是current指向的那个页面的顶端开始。大小要么是4K要么是8K,是有编译内核的时候决定的。

和bootloader看到的物理地址的关系。在内核启动的时候,内核会对所有的物理内存做个一一映射到3G开始的虚拟地址中,因此内核中看到的代码的地址和bootloader看到的物理地址实际上差了一个常数即0xC0000000. 表面上只是差了一个常数,但是从该虚拟地址到内存物理地址的映射还是要经过cpu的mmu硬件机制,也就是还是要依靠页表机制,只是这页表计算出来的物理地址正好是和该虚拟地址差常数。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP