Ñïåöêóðñ «Ñèñòåìíîå ïðîãðàììèðîâàíèå»
Ëåêöèÿ 4. 19.10.2021



Ïëàòà: ïðè âêëþ÷åíèè ïèòàíèÿ çàãðóæàåòñÿ ïðîøèâêà. Îáû÷íî ïðîøèâêó ìîæíî ãðóçèòü èç íåñêîëüêèõ èñòî÷íèêîâ.

Èñòî÷íèê çàäàåòñÿ âíåøíåé êîíôèãóðàöèåé: íàïðèìåð, äæàìïåð — ïðîâîä, ñîåäèíÿþùèé äâà êîíòàêòà. Îí ìîæåò çàìûêàòü êîíòàêòû èëè íå çàìûêàòü.  çàâèñèìîñòè îò ñîñòîÿíèÿ êîíòàêòîâ (çàìêíóòû èëè íåò) îïðåäåëÿåòñÿ èñòî÷íèê, îòêóäà ãðóçèòü ïðîøèâêó. Åùå ïðèìåð: êíîïêà — åñëè çàæàòà ïðè âêëþ÷åíèè ïèòàíèÿ — ãðóçèòñÿ îäíà ïðîøèâêà, åñëè íåò — äðóãàÿ.

Ïîäîáíàÿ âíåøíÿÿ êîíôèãóðàöèÿ îïðåäåëÿåò, ïî êàêîìó àäðåñó ïàìÿòè íàõîäèòñÿ òàáëèöà âåêòîðîâ ïðåðûâàíèé.

Ïàìÿòü æåñòêî ðàñïðåäåëåíà ìåæäó ðàçëè÷íûìè óñòðîéñòâàìè â äèçàéíå ïëàòû.

Íàïðèìåð, âíåøíèå óñòðîéñòâà. Ñàìîå ïðîñòîå âíåøíåå óñòðîéñòâî — 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

https://www.intel.com/content/dam/www/programmable/us/en/pdfs/literature/third-party/archives/ddi0100e_arm_arm.pdf