Çàãðóçêà âûïîëíÿåìîãî ôàéëà â îïåðàòèâíóþ ïàìÿòü


Ïðîöåññ çàãðóçêè (loading) ñîñòîèò â ðàçìåùåíèè ñîäåðæèìîãî ôàéëà â ïàìÿòè è ðàçðåøåíèè ññûëîê (relocate links).

Ðàçðåøåíèå ññûëîê


Ðàçðåøåíèå ññûëîê (relocation) – ýòî ïðîöåññ ñâÿçûâàíèÿ ññûëîê íà ñèìâîëû ñ îïðåäåëåíèÿìè ýòèõ ñèìâîëîâ. Íàïðèìåð, âûçîâ ôóíêöèè äîëæåí ïåðåäàâàòü óïðàâëåíèå íà àäðåñ ýòîé ôóíêöèè.

Ôàéëû ñ ïåðåìåùàåìûì êîäîì ñîäåðæàò èíôîðìàöèþ, îïèñûâàþùóþ, êàê ìîäèôèöèðîâàòü ñîäåðæèìîå ñåêöèé ïðè ðàçìåùåíèè â ïàìÿòè. Ýòà èíôîðìàöèÿ íàçûâàåòñÿ relocation entries – òàáëèöà ïåðåìåùåíèé.

Êàæäàÿ çàïèñü òàáëèöû ïåðåìåùåíèé ñîäåðæèò âèðòóàëüíûé àäðåñ ññûëêè è èíôîðìàöèþ î åå ðàçðåøåíèè. Èíôîðìàöèÿ î ðàçðåøåíèè, íàïðèìåð, äëÿ âûçîâà ôóíêöèé – ýòî èíäåêñ ôóíêöèè â òàáëèöå ñèìâîëîâ.

Ðàçìåùåíèå â ïàìÿòè


Ôîðìàò çàãðóæàåìîãî (âûïîëíÿåìîãî) ôàéëà îáû÷íî îòëè÷àåòñÿ îò åãî îáðàçà â îïåðàòèâíîé ïàìÿòè.

Íåêîòîðûå ÷àñòè (ñåêöèÿ “heap”, íàïðèìåð) ïîÿâëÿþòñÿ òîëüêî ïðè çàãðóçêå â ïàìÿòü, íåêîòîðûå – íàîáîðîò, ïîñëå çàãðóçêè â ïàìÿòü èñ÷åçàþò.

 ôîðìàòå ELF îïðåäåëåíî 16 ðàçëè÷íûõ òèïîâ ñåêöèé. Äëÿ ïðàâèëüíîãî ðàçìåùåíèÿ ñåêöèè â ïàìÿòè äîñòàòî÷íî çíàòü òðè åå õàðàêòåðèñòèêè:

- çàíèìàåò ëè îíà ìåñòî â ïàìÿòè âî âðåìÿ âûïîëíåíèÿ: áèò SHF_ALLOC â àòðèáóòàõ ñåêöèè (ïîëå “sh_flags” â õåäåðå ñåêöèè);

- ðàçìåð ñåêöèè â áàéòàõ: ïîëå “sh_size” â õåäåðå ñåêöèè;

- çàíèìàåò ëè îíà ìåñòî â ôàéëå: çíà÷åíèå SHT_NOBITS ïîëÿ “sh_type” â õåäåðå ñåêöèè.


Ñïåöèàëüíûå ñåêöèè


Ëèíêåð ïðè ñâÿçûâàíèè îáúåêòíûõ ôàéëîâ ìîæåò ãåíåðèðîâàòü êàðòó ïàìÿòè (map) çàãðóæàåìîãî ôàéëà. Ýòà êàðòà ÷àñòî èñïîëüçóåòñÿ â îòëàäî÷íûõ öåëÿõ.  íåé ïðèâåäåíû ñâåäåíèÿ î ðàñïîëîæåíèè ñïåöèàëüíûõ ñåêöèé â ïàìÿòè, î ðàñïîëîæåíèè äàííûõ è èíñòðóêöèé âíóòðè ñåêöèé è ò.ä.

.bss – ñåêöèÿ ñîäåðæèò íåèíèöèàëèçèðîâàííûå äàííûå. Ïî óìîë÷àíèþ èíèöèàëèçèðóåòñÿ íóëÿìè. Ýòà ñåêöèÿ íå çàíèìàåò ìåñòî â ôàéëå, òî åñòü èìååò òèï “SHT_NOBITS”.

.data è .data1 – ñåêöèÿ ñîäåðæèò èíèöèàëèçèðîâàííûå äàííûå.

.rodata è .rodata1 – ñåêöèÿ ñîäåðæèò äàííûå ñ äîñòóïîì «òîëüêî íà ÷òåíèå». Îáû÷íî ðàçìåùàåòñÿ â non-writable ñåãìåíòå ïàìÿòè.

.text – ñåêöèÿ ñîäåðæèò èíñòðóêöèè ïðîãðàììû.


 ïðèâåäåííîì íèæå ïðèìåðå C-ïðîãðàììû èíñòðóêöèè áóäóò ðàçìåùåíû â ñåêöèè “.text”, ïåðåìåííàÿ “str” áóäåò ðàçìåùåíà â ñåêöèè “.data”, à ïåðåìåííàÿ “N” – â “.bss”:


int N;

char str[] = “Hello, World!”;

int main ()

{

printf (str);

return 0;

}


Ïðèëîæåíèÿ

Ôîðìàòû çàãðóæàåìûõ ôàéëîâ ELF




Ðèñóíîê 1. Ôîðìàò OBJ-ôàéëà



Ôîðìàò õåäåðà ôàéëà


#define EI_NIDENT 16

typedef struct {

unsigned char e_ident[EI_NIDENT];

Elf32_Half e_type;

Elf32_Half e_machine;

Elf32_Word e_version;

Elf32_Addr e_entry;

Elf32_Off e_phoff;// ñìåùåíèå òàáëèöû

Elf32_Off e_shoff; // ñìåùåíèå òàáëèöû õåäåðîâ ñåêöèé / 0

Elf32_Word e_flags;

Elf32_Half e_ehsize;

Elf32_Half e_phentsize;

Elf32_Half e_phnum;

Elf32_Half e_shentsize;

Elf32_Half e_shnum;

Elf32_Half e_shstrndx;

} Elf32_Ehdr;


Ôîðìàò õåäåðà ñåêöèè


typedef struct {

Elf32_Word sh_name;

Elf32_Word sh_type;

Elf32_Word sh_flags; // Àòðèáóòû ñåêöèè

Elf32_Addr sh_addr;

Elf32_Off sh_offset; // ñìåùåíèå ñåêöèè îòíîñèòåëüíî íà÷àëà ôàéëà

Elf32_Word sh_size;

Elf32_Word sh_link;

Elf32_Word sh_info;

Elf32_Word sh_addralign;

Elf32_Word sh_entsize;

} Elf32_Shdr;




Èìÿ àòðèáóòà

Áèò àòðèáóòà âî ôëàãå ñåêöèè

Îïèñàíèå

SHF_WRITE

0x1

Äàííàÿ ñåêöèÿ ñîäåðæèò äàííûå, êîòîðûå ìîãóò áûòü ïåðåçàïèñàíû âî âðåìÿ âûïîëíåíèÿ ìîäóëÿ

SHF_ALLOC

0x2

Äàííàÿ ñåêöèÿ çàíèìàåò ìåñòî â ïàìÿòè âî âðåìÿ ïðîöåññà âûïîëíåíèÿ. Íåêîòîðûå ñåêöèè íå ðàçìåùàþòñÿ â îáðàçå ìîäóëÿ, íàõîäÿùåìñÿ â ïàìÿòè, äëÿ íèõ ýòîò àòðèáóò âûêëþ÷åí

SHF_EXECINSTR

0x4

Äàííàÿ ñåêöèÿ ñîäåðæèò âûïîëíÿåìûå ìàøèííûå êîìàíäû

SHF_MASKPROC

0xF0000000

Âñå áèòû äàííîãî àòðèáóòà çàðåçåðâèðîâàíû äëÿ ñïåöèôèêè ïðîöåññîðîâ


Òàáëèöà 1. Àòðèáóòû ñåêöèé