Ïëàòà: ïðè âêëþ÷åíèè ïèòàíèÿ çàãðóæàåòñÿ ïðîøèâêà. Îáû÷íî ïðîøèâêó ìîæíî ãðóçèòü èç íåñêîëüêèõ èñòî÷íèêîâ.
Èñòî÷íèê çàäàåòñÿ âíåøíåé êîíôèãóðàöèåé: íàïðèìåð, äæàìïåð — ïðîâîä, ñîåäèíÿþùèé äâà êîíòàêòà. Îí ìîæåò çàìûêàòü êîíòàêòû èëè íå çàìûêàòü.  çàâèñèìîñòè îò ñîñòîÿíèÿ êîíòàêòîâ (çàìêíóòû èëè íåò) îïðåäåëÿåòñÿ èñòî÷íèê, îòêóäà ãðóçèòü ïðîøèâêó. Åùå ïðèìåð: êíîïêà — åñëè çàæàòà ïðè âêëþ÷åíèè ïèòàíèÿ — ãðóçèòñÿ îäíà ïðîøèâêà, åñëè íåò — äðóãàÿ.
Ïîäîáíàÿ âíåøíÿÿ êîíôèãóðàöèÿ îïðåäåëÿåò, ïî êàêîìó àäðåñó ïàìÿòè íàõîäèòñÿ òàáëèöà âåêòîðîâ ïðåðûâàíèé.
Ïàìÿòü æåñòêî ðàñïðåäåëåíà ìåæäó ðàçëè÷íûìè óñòðîéñòâàìè â äèçàéíå ïëàòû.
Íàïðèìåð, âíåøíèå óñòðîéñòâà. Ñàìîå ïðîñòîå âíåøíåå óñòðîéñòâî — GPIO (General Purpose Input/Output) – ëàìïî÷êè, êíîïî÷êè è ò. ä. Èì óïðàâëÿþò ïðè ïîìîùè íåñêîëüêèõ ðåãèñòðîâ. Âèðòóàëüíî ðåãèñòð — ýòî ÿ÷åéêà ïàìÿòè, èìåþùèé îïðåäåëåííûé àäðåñ. Ïðè çàïèñè èëè ÷òåíèè â/èç ýòîé ÿ÷åéêè â ïëàòå ïðîèñõîäÿò îïðåäåëåííûå äåéñòâèÿ (ìîæíî ñêàçàòü, ïîáî÷íàÿ ôóíêöèÿ). Äëÿ GPIO òàêèõ ðåãèñòðîâ íåñêîëüêî: enable óñòðîéñòâî, ðåãèñòð ñîñòîÿíèÿ óñòðîéñòâà (1/0), …
Flash-êàðòà — Read Only ïàìÿòü. Ýòà ïàìÿòü ñîõðàíÿåò ñîäåðæèìîå ïðè âûêëþ÷åííîì ïèòàíèè.
Ïðîöåññ çàãðóçêè (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;
}
System Control coprocessor