who懂x386下的内存管理机制?

yadang 2003-05-08 05:52:10
逻辑地址: 出现在机器指令中,用来制定操作数的地址。段:偏移
线性地址:逻辑地址经过分段单元处理后得到线性地址,这是一个32位的无符号整数,可用于定位4G个存储单元。

我记得是把段地址左移4位,再和偏移相加。这样怎么会寻到4G呢?

比如:0000:4010的线性地址=04010
0001:4000的线性地址=04010
其实这2个地址是一样的。也就是说里面有很多线性地址是重合的,怎么可以说是寻到4G呢?
...全文
54 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
qqchen79 2003-05-09
  • 打赏
  • 举报
回复
GDT和LDT是需要操作系统提供的,存在于系统内存当中,操作系统只要把它们的基地址设置到CPU的GDTR和LDTR寄存器里面就行了。

Windows使用的Flat模式没有使用LDT,只使用了GDT(因为所有进程的描述都一样),GDT表一般就保存在系统内存起始的地方(0x80036000); Linux使用LDT描述进程用户空间,GDT描述Kernel内存空间。
yadang 2003-05-09
  • 打赏
  • 举报
回复
hs_guanqi(关七),tkit(熊熊520), qqchen79(知秋一叶 [MS MVP])果然高手。
顺便问一下:GDT和LDT是操作系统自己在内存中建立的一段区域,还是CPU本身就存在这个一段东东?
qqchen79 2003-05-09
  • 打赏
  • 举报
回复
>> 难道现在linux版本中的段和偏移都是32位的吗?那样还要段干什么?
>> 我就一个偏移就可以寻址4G,干脆把段设置为0算了

有想法。:)
Linux和Windows都是这么干的(简单忽略分段机制,只使用分页),Intel把这种内存管理方式称为Flat Mode。

你会发现所有的程序运行期间CS、DS的值分别在Kernel和User模式下都相同,只不过不是0,在系统问建立可以找到定义。进一步,所有这些CS/DS(其实是指向系统描述表GDT的索引)都描述了一个从0x00000000开始,到0xffffffff的地址空间。CS和DS不同只是因为Code和Data段的读写权限不一样。

在你的例子当中,偏移地址本身就有32位,所以已经可以寻址4G了,Intel x86号称可以寻址64G (2^36,使用实模式),但是好像没有操作系统这么用过。
wollya 2003-05-09
  • 打赏
  • 举报
回复
CPU本身就存在
它有MMU内存管理单元
tkit 2003-05-08
  • 打赏
  • 举报
回复
Linux使用的是三级分页机制,分段对其而言是多余的东冬,所以在Intel386上,linux简单的将分段单元做了一个透明的映射,32位逻辑地址映射出来仍然是32位的线性地址,后者再经过分页机制的处理,转换成真正的物理地址。
在386的保护模式下,存在段寄存器中的不再是为了搂主希望的移位相加,也即不再是段地址,而只是一个段选择符,通过这个段选择符作为索引,最终到一个描述符表中去查找,这个描述符表的每个表项可以指定这个段的粒度(字节还是页),通过这个间接的方式,就可以对4G的空间寻址,搂主说的只是实模式 下的寻址方式
hs_guanqi 2003-05-08
  • 打赏
  • 举报
回复
:)
保护模式下,段是有权限的,比如用户程序不能访问系统段
另外段也有多种,代码段,任务段等等,各有各的作用。
保护模式,字面意思,就是让内存空间受保护,不被任意访问。
实模式下,任何地址都可以在用户程序中直接读写,一个不慎,比如数租越界,非法指针,系统就咔嚓了。
保护模式下,同样的问题,可能会弹出一个非法操作对话框,或者提示Segment fault,系统照转。
yadang 2003-05-08
  • 打赏
  • 举报
回复
难道现在linux版本中的段和偏移都是32位的吗?那样还要段干什么?
我就一个偏移就可以寻址4G,干脆把段设置为0算了
hs_guanqi 2003-05-08
  • 打赏
  • 举报
回复
你写的偏移都是16位的,
实际上段内偏移可以达到32位,你写一个32位数再来试试?

23,222

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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