2014-01-08 3 views
0

Итак, я работаю с ядром 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 ядра и операционной системы в целом, поэтому, пожалуйста, начните с основ ...

Я признателен за любую помощь, вы можете дать, спасибо.

+0

Это может ответить на один из ваших вопросов: [Есть ли какая-либо физическая часть памяти с адресом NULL (0)?] (Http://stackoverflow.com/questions/3932081) – jweyrich

ответ

1

Базовый адрес: a_entry.

Кроме того, из любопытства я знаю, что в C, "(void *) 0" является NULL, что вы не можете разыменовать. Как тогда вы получите содержимое адреса памяти 0?

Любая система, позволяющая использовать память по программе C с нулевым адресом, должна заставить ее работать. Хотя можно представить себе возможные способы сделать это, я не знаю никого, кто беспокоится. Нулевой виртуальный адрес, по сути, никогда не использовался.

+0

Итак, как именно я получу адрес смещения от адреса инструкции в памяти процесса? – user3109672

+0

Вычтите базовый адрес из адреса памяти. Но я бы настоятельно предложил использовать фактическое сопоставление, а не заголовок. (В linux вы можете читать сопоставления из '/ proc//maps'.) –

+0

Не могли бы вы рассказать нам больше о том, что делает файл, как оно относится к проблеме, и почему чтение заголовка a.out не является настолько хорошо? thanks – user3109672

0

Операционная система может загружать приложение в любое место, которое он выбирает, а затем перемещать внедренные адреса относительно этой точки. Эта информация о перемещении записывается в файл a.out. Базовый адрес зависит от архитектуры и других деталей и часто отличен от нуля.

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

Примечание. Эти символы не будут присутствовать в исполняемом файле, если ваш сценарий компоновщика их вырезает.

+0

Является ли перемещение релевантным для исполняемого файла (уже связанного)? Как получить информацию, указанную в исполняемом файле? – user3109672

+0

Формат a.out - это гибрид, который можно перенаправить при необходимости (см. Ссылку на справочную страницу) и необязательно содержит символы. – Pekka

0

Кроме того, из любопытства я знаю, что в C "(void *) 0" NULL, который вы не можете разыменовать. Как тогда вы получите содержимое адреса памяти 0?

На самом деле вы можете разыскивать NULL, но результаты не определены. Для удобства большинство операционных систем ловушки доступа, чтобы помочь вам отлаживать проблемы с указателем.

Кроме того, расположение памяти с адресом 0 в пространстве процесса отличается от местоположения памяти с адресом 0 в «аппаратном пространстве».Поддержка «pagination» в CPU и операционной системе «развязывает» физическую память из виртуальной памяти. Может случиться так, что виртуальная страница будет отображаться по адресу 0, хотя там обычно есть векторы прерываний и другая специальная память устройства, а не реальная RAM.

Смежные вопросы