我在内存中有关于.data和.bss部分顺序的问题, 我不会为了我的生命而谷歌。
我试图了解是否可以保证.bss部分始终来自.data部分,就内存地址而言。
我的具体需求是:
section .data
malloc_pointer:
dq start_of_my_malloc
start_of_data:
; more stuff...
section .bss
; more stuff
start_of_my_malloc:
resb 1 << 30 ; pre-allocate 1gig
我需要有时使用偏移[malloc_pointer] - start_of_data
,所以我需要它是正面的,因此关于.bss和.data顺序的问题。
作为一方 - 我很高兴知道我是否可以引用标签start_of_data
来帮助我选择要在start_of_my_malloc
中保留的尺寸。
我真正想做的是:
start_of_my_malloc:
resb (1 << 30) - start_of_data ; this won't compile though
谢谢!
答案 0 :(得分:1)
关于节定位的决定由链接器完成,可以通过linker scripts(默认或自定义)进行控制。我试着不要依赖它们,因为它们会使你的代码不那么独立。
关于你的第二个问题 - 你可以汇编一次文件,从目标文件中提取.data
的大小,然后用适当的-DSTART_OF_DATA=...
重新组装。
答案 1 :(得分:1)
传统上,内存布局是首先是文本,然后是数据,最后是bss。这种设计非常方便,因为您可以简单地将整个二进制文件复制到内存中,然后将一大块内存清零,然后(可选)设置内存保护。要扩展bss细分,您可以使用brk
和sbrk
系统调用。
三个标签etext
,edata
和end
由链接器定义,指向文本段的末尾,初始化数据的结尾和数据段的结尾。由于程序传统上映射到地址0,因此不存在标签start
,从而无需标签。
不能保证布局是这样的,但由于很多程序都依赖于这种设计,因此不太可能在不久的将来改变。
如果要编写内存分配例程,建议您使用sbrk
系统调用。这消除了对布局假设的全部需求,因为sbrk
始终做正确的事。
请注意sbrk
今天有点过时了,所以如果您想使用现代的东西,我建议您在mmap
之上实施内存管理。