Итак, я работаю с ядром linux 0.11 на виртуальной машине, и мне нужно написать программу, которая анализирует исполняемые файлы, запущенные на этом ядре. Файлы находятся в формате a.out. Я хочу знать, как операционная система решает, где загрузить файл в (виртуальную?) Память? Решено ли что-то под названием «базовый адрес», и если да, то почему я не могу найти упоминания об этом в заголовке a.out?Вопросы по загрузке исполняемых файлов в память
//where is base address?
struct exec {
unsigned long a_magic; /* Use macros N_MAGIC, etc for access */
unsigned a_text; /* length of text, in bytes */
unsigned a_data; /* length of data, in bytes */
unsigned a_bss; /* length of uninitialized data area for file, in bytes */
unsigned a_syms; /* length of symbol table data in file, in bytes */
unsigned a_entry; /* start address */
unsigned a_trsize; /* length of relocation info for text, in bytes */
unsigned a_drsize; /* length of relocation info for data, in bytes */
};
Я пытался искал документации о формате, но только информация, которую я нашел только объясняет, что каждая из этих полей, какие значения a_magic может иметь и т.д.
мне нужно знать об этом, потому что программе необходимо распечатать номера файлов и строк при задании адреса в памяти инструкции в исполняемом файле, а символы отладки имеют только их адреса в качестве смещений (например, относительно начала текстового раздела и т. д.).
Кроме того, из любопытства я знаю, что в C, "(void *) 0" является NULL, что вы не можете разыменовать. Как тогда вы получите содержимое адреса памяти 0?
Как вы видите, я очень мало знаю о Linux ядра и операционной системы в целом, поэтому, пожалуйста, начните с основ ...
Я признателен за любую помощь, вы можете дать, спасибо.
Это может ответить на один из ваших вопросов: [Есть ли какая-либо физическая часть памяти с адресом NULL (0)?] (Http://stackoverflow.com/questions/3932081) – jweyrich