Доступ к данным, сегментам BSS будет через указатель или по инструкции напрямую?

Я знаю, что когда речь идет о доступе к памяти кадра стека, это будет происходить с помощью указателя кадра стека, но мне интересно, как будет осуществляться доступ к данным, сегментам BSS, содержащим глобальные/статические данные, с помощью указателя, такого как указатель кадра стека указание начальной точки этих сегментов или адресных частей инструкций этих сегментов напрямую, так что каждый раз, когда приложение запускается, система должна будет записывать адресные части инструкций в текстовом сегменте?


person Pooria    schedule 18.10.2010    source источник


Ответы (2)


Виртуальная память означает, что эти сегменты всегда появляются в одном и том же месте в пространстве виртуальных адресов, поэтому их адреса могут быть жестко запрограммированы в исполняемый код.

(Обратите внимание, что это неверно для ASLR).

person Oliver Charlesworth    schedule 18.10.2010
comment
_эти сегменты всегда появляются в одном и том же месте в виртуальном адресном пространстве, что вы подразумеваете под одним и тем же местоположением, вы имеете в виду, что они находятся в части памяти в фиксированном положении от начальной точки времени жизни приложения до его конца? - person Pooria; 18.10.2010
comment
@Pooria: я имею в виду, что нет необходимости обращаться к ним через указатель. Их адреса известны во время соединения. - person Oliver Charlesworth; 18.10.2010
comment
_да, я думал так же, каждый раз, когда приложение выполняется, эти адреса жестко закодированы в инструкции. - person Pooria; 18.10.2010

Вы можете объявить глобальную переменную с помощью __attribute__ ((section ("BSS"))) и получить адрес переменной. Посмотрите документацию Gcc

Вы также можете объявить неинициализированную статическую переменную и получить ее адрес.

person Thomas    schedule 18.10.2010
comment
@Thomas_Какой смысл использовать этот материал, когда есть хороший и оператор для получения адреса? - person Pooria; 19.10.2010
comment
@Pooria Если у вас есть int, о котором вы знаете, что он находится в определенном разделе, вы можете получить его адрес и перебрать содержимое раздела. После того, как сказал Оли Чарльзворт, вы можете взглянуть на спецификацию ELF и спецификацию вашей ОС, чтобы увидеть, где разделы отображаются в памяти. - person Thomas; 19.10.2010
comment
Перечитав ваш комментарий, я не уверен, что понял... int a attribute ((section (BSS))); int *bss_section_address = конечно, вам нужно будет проверить, в какой части раздела вы находитесь. Я не знаю, есть ли способ убедиться в том, что вы находитесь в начале или нет. - person Thomas; 19.10.2010
comment
Мой друг должен сделать то же самое в своей реализации ядра (в objC) pmbsd.googlecode.com/hg/kernel/kern/kern_objc.c - person Thomas; 19.10.2010