首页
社区
课程
招聘
关于80X86的段寄存器和虚拟地址生成索引的问题
发表于: 2009-1-17 05:48 4456

关于80X86的段寄存器和虚拟地址生成索引的问题

2009-1-17 05:48
4456
1、32位机段寄存器用来存放段选择子的,抽取前13位生成索引,这个索引指向GDT或者LDT描述符选择子,GDTR高32位存放GDT的基址,后根据索引指向的描述符得出段地址,这个能够明白。
2、有在分页存储中根据虚拟地址的前20位生成索引的后找出物理地址的一部分+偏移量的到内存的物理地址,应该是这样的吧。
3、不明白的地方是描述符的内存物理地址如何和这些索引建立的联系呢?如:CS段:0X00023H
的索引是4,应该是4*8(8个字节)得到的,后根据基址+这个偏移量就得到了段描述符的位置,也就的到了段的起始物理地址,这个段是否为PE文件中的第四段呢?我想是否为这样的行为,操作系统读PE文件头知道这个程序有多少段,然后给每个段制定一个索引,即第一段为1,以后各段累加1的得来的呢?那么分页存储中的索引是否也是这个套路得来的呢?
4、还有一个问题在虚拟存储器中,系统是否按照00001:0X01234567H   MOV EAX [EBX]的形式组织的虚拟内存呢?还是根据段头部信息以后只是+一些偏移量得到其它的地址呢?
5、如果不分页的话,VC++中给定的0X04000000H的基址是否为真是的物理地址?如果是那么如果我运行的几个程序的进程都是这个物理地址,虽然在一个时间片内,CPU只执行一个程序,那调度起来岂不是非常麻烦?一会将这个程序的段调入这段内存,一会又将哪个的程序段调入这段内存?GDTR中的高32位的存放的GDT基址是否为实际的物理地址?

我写的可能很啰嗦,可能理解的也有问题,还望不吝赐教

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
2
首先,386的segment(段)和PE文件中的section(有人叫节,有人叫段)根本是两码事,这两个概念没有任何关联。

PE文件中的section只是文件的一中的某一部分数据而已,是个逻辑的概念。比如文件大小是10K,其中.text节起可能始于文件偏移512字节处,长度是834字节;而.data节则起始于文件的第1536字节,长度为289字节等。不同的section只是文件中的一段而已。

其余的问题,你只要把以下几个概念彻底搞明白了,就会明白了:

逻辑地址、有效地址、线性地址、虚拟地址、物理地址

这个你自己多看几遍书,看看书中的例子,我记得很多Windows编程的书,特别是讲汇编语言的书,都会有相关内容;一来这个内容不是几句话能说清楚,二来我说得肯定没有书上说得准确,再来自己看书的印象能更深一些。所以我就不多说了。
2009-1-17 07:51
0
雪    币: 200
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
多谢版主,我是看书看不懂啊!!!!!
“386的segment(段)和PE文件中的section(有人叫节,有人叫段)根本是两码事,这两个概念没有任何关联”
还请明示,或者推荐一本书,我看的书有5~6本了越看越糊涂了,我本人不是计算机专业的,所以进步有点慢,也有点笨啊

刚刚又在网上看到一个说明,“386的segment(段)和PE文件中的section(有人叫节,有人叫段)根本是两码事”是两码事,segment(段)仍然是按,程序段、数据段、堆栈段来进行分段的?
“全局描述符表”(GDT)、“局部描述符表”(LDT)和中断描述符表(IDT),是在什么时候出现的呢?编译阶段?
2009-1-17 11:52
0
游客
登录 | 注册 方可回帖
返回
//