【问题标题】:Access to data, BSS segments will be through using a pointer or by instructions directly addressing?访问数据,BSS 段是通过使用指针还是通过指令直接寻址?
【发布时间】:2010-10-18 17:14:54
【问题描述】:

我知道何时访问堆栈帧的内存将通过使用堆栈帧指针来完成,但我想知道如何通过使用指针来访问数据、包含全局/静态数据的 BSS 段堆栈帧指针指示这些段的起始点或指令直接寻址这些段的片段,以便每次应用程序启动时系统都必须在文本段中写入指令的地址部分?

【问题讨论】:

    标签: c++ compiler-construction global-variables instructions


    【解决方案1】:

    虚拟内存意味着这些段总是出现在虚拟地址空间中的相同位置,因此它们的地址可以硬编码到可执行代码中。

    (注意,ASLR 不是这样)。

    【讨论】:

    • _"这些段总是出现在虚拟地址空间中的相同位置" 你所说的相同位置是什么意思,你的意思是它们在一块内存中从起点开始的固定位置应用程序生命周期结束了吗?
    • @Pooria:我的意思是不必通过指针访问它们。他们的地址在链接时是已知的。
    • _是的,我也是这么想的,每次执行应用程序时,这些地址都会被硬编码为指令。
    【解决方案2】:

    您可以使用__attribute__ ((section ("BSS"))) 声明一个全局变量 并获取变量的地址。 Take a look at the Gcc documentation

    你也可以声明一个未初始化的静态变量并获取它的地址。

    【讨论】:

    • @Thomas_当有良好的 & 运算符来获取地址时,使用这些东西有什么意义?
    • @Pooria 如果你有一个知道它在特定部分的 int,你可以获取它的地址并遍历该部分的内容。就像 Oli Charlesworth 所说的那样,您可以查看 ELF 规范和您的操作系统规范,以查看这些部分在内存中的映射位置。
    • 重新阅读您的评论后,我不确定是否理解... int a attribute ((section ("BSS"))); int *bss_section_address = &a;当然,您必须检查您所在的部分。不知道有没有办法保证你在开始的事实。
    • 我的一个朋友必须在他的内核实现中(在 objC 中)做类似的事情pmbsd.googlecode.com/hg/kernel/kern/kern_objc.c
    猜你喜欢
    • 2018-07-04
    • 1970-01-01
    • 2014-07-26
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    相关资源
    最近更新 更多