关于 程序的段

fang92 2015-09-01 08:18:54
hello,请教各位一个问题。
在C程序里面,有段寄存器,cs,ds,ss,分别存折代码段,数据段和堆栈段的段选择子,通过选择子,访问GDT全局描述符表,就可以得到cs,ds,ss的段基址。然后加上offset,得到相应的线性地址。
在elf里面,整个程序也被分成了很多段,其中载入内存的那几个程序头里面就包括这几个段,而且都有这几个段的基址和size。我想问的是,在GDT或者LDT里面访问到的段基址和elf里面的.data, text等段的基址是一样的吗?
...全文
106 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2015-09-05
  • 打赏
  • 举报
回复
window ,linux 段 寄存器,除了fs 都不再使用了 等于关闭了段模式 其实偶尔还会用的,不过用户(3级别代码)程序,不能够使用而已。 elf 中的段,只是操作系统,划分 代码数据等不同用途数据的一种方式,不再是 dos 时代的那种段了
赵4老师 2015-09-02
  • 打赏
  • 举报
回复
CPU中的段选择子 和 PE或elf文件中的Section 不是一个概念。
www_adintr_com 2015-09-01
  • 打赏
  • 举报
回复
当然不一样 不管是 Linux 还是 Windows,现在都是平坦内存模型。 cs, ds, ss 所指向的段选择子基址都是 0,size 都是 0xffffffff , 也就是说偏移的范围其实就是 0~4G 整个内存地址空间。偏移值就是地址的值。 Linux 和 Windows 都采用分页机制来管理内存,通过这种设置相当于绕过分段机制了,因为分段在 CPU 中没法关闭,必须使用。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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