社区
C语言
帖子详情
关于 程序的段
fang92
2015-09-01 08:18:54
hello,请教各位一个问题。
在C程序里面,有段寄存器,cs,ds,ss,分别存折代码段,数据段和堆栈段的段选择子,通过选择子,访问GDT全局描述符表,就可以得到cs,ds,ss的段基址。然后加上offset,得到相应的线性地址。
在elf里面,整个程序也被分成了很多段,其中载入内存的那几个程序头里面就包括这几个段,而且都有这几个段的基址和size。我想问的是,在GDT或者LDT里面访问到的段基址和elf里面的.data, text等段的基址是一样的吗?
...全文
175
3
打赏
收藏
关于 程序的段
hello,请教各位一个问题。 在C程序里面,有段寄存器,cs,ds,ss,分别存折代码段,数据段和堆栈段的段选择子,通过选择子,访问GDT全局描述符表,就可以得到cs,ds,ss的段基址。然后加上offset,得到相应的线性地址。 在elf里面,整个程序也被分成了很多段,其中载入内存的那几个程序头里面就包括这几个段,而且都有这几个段的基址和size。我想问的是,在GDT或者LDT里面访问到的段基址和elf里面的.data, text等段的基址是一样的吗?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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 中没法关闭,必须使用。
linux下,
程序
各个部分对应的
段
位置,图说 bss
段
text
段
data
段
rodata
段
栈 堆
图说 bss
段
text
段
data
段
rodata
段
栈 堆理论上
程序
编译出来后,各个
段
的分布二级目录三级目录 理论上
程序
编译出来后,各个
段
的分布
程序
在执行后,虚拟内存分布,如下图: 二级目录 三级目录 ...
C++
程序
的内存分配以及 bss
段
、data
段
、text
段
一个
程序
本质上都是由 bss
段
、data
段
、text
段
三个组成的。这样的概念,不知道最初来源于哪里的规定,但在当前的计算机
程序
设计中是很重要的一个基本概念。而且在嵌入式系统的设计中也非常重要,牵涉到嵌入式系统运行时的内存大小分配,存储单元占用空间大小的问题。 在采用
段
式
程序
的
段
信息
本文简单介绍可执行
程序
的短信息
程序
:text
段
、data
段
、bss
段
C语言
程序
的内存布局包含三个关键
段
:text
段
存储只读的机器指令;data
段
存储已初始化的全局和静态变量;bss
段
存储未初始化或零值的全局和静态变量,由系统自动初始化为零。text
段
在磁盘文件中存储,data
段
存储初始值,而bss
段
仅记录大小信息。这些
段
的生命周期贯穿整个
程序
运行期,地址分布相邻,与堆栈区域形成对比。通过示例
程序
可验证各
段
变量的存储位置特征。
程序
内存之谜:bss
段
、data
段
、text
段
到底怎么分?
未初始化全局变量去bss
段
报到(系统自动清零);已初始化全局变量住data
段
(值存在文件里);代码和只读数据待在text
段
(雷打不动)。下次看
程序
内存布局时,脑海里浮现这套"三室一厅"模型,再也不会晕啦!
C语言
70,039
社区成员
243,245
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章