请教有关段式映射方面的内容
各位,请教一下,有关《linux情景分析》里有关对 i386CPU 的内存管理方面的内容,具体如下:
1、里面提到了一个例子,如下:
========================================
greeting()
{
printf("hello world\n");
}
main()
{
greeting();
}
其中反编译后(objdump),发现 greeting()的入口地址为 0x8048368.
========================================
2、当执行 “call 0x8048368” 这条指令时,按上面所说的是,(由于是 i386CPU 的缘故)CPU分析 0x8048368 这个地址时,是先进行段式映射,再进行页式映射的。对于页式映射部分,没什么问题。但对于段式映射部分,还是不太清楚,想请教一下大家(换句话说,对于0x8048368这个地址,在linux中是如何进行段式映射的?第一步干什么、第二步干什么....),谢谢。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
回复 1# sherf
先顶一下
呵呵 Linux中沒使用分段的這個特性,Linux中有四個主要的段,但是都是映射到同一個地方。具體可以看《深入理解Linux內核》
分段的特性是由 i386cpu 定的(其他CPU没有),因此linux要能在i386下正常运行,则必须先分段后分页........
本帖最后由 amarant 于 2011-04-27 22:16 编辑
回复 4# sherf
嗯,linux只象征性的分了下 你可以去看看head.S 看了就明白了
这么说吧,因为在linux中,用户(内核)代码(数据)断 这四个断的base全部都是0x0000 0000,所以就跟没分段一样的。
在没开启保护模式的,地址的算法是 cs * 16 + ip
开启保护模式以后就是: cs 指定段 eip 指定线性地址
看下这个精华贴吧,写的应该比较清楚了:http://bbs.chinaunix.net/thread-2083672-1-1.html
我手头上现在没linux代码,但我记得至少权限是不一样的。
确实用了分段,但从最后的效果上来说,几乎等于没用。
回复 8# new_learner
他说的应该是segment descriptor里七零八落的base字段,几个段的其它属性肯定有别。