Ñòâîðåííÿ ïî÷àòêîâîãî çàâàíòàæóâà÷à îïåðàö³éíî¿ ñèñòåìè òà ïîòðóâàííÿ Linux äëÿ GPS/WiFi òåñòåðà êîìïàí³¿ Tescom
  Çâ³ò Çàïîðîæåöà Òàðàñà ³êòîðîâè÷à ïðî ïðîõîäæåííÿ ñòàæóâàííÿ ó Êîðå¿
Òåìà: «Îïåðàöèîííàÿ ñèñòåìà Linux äëÿ âñòðàèâàåìûõ ñèñòåì» 

ÂÂÅÄÅÍÈÅ 
Íåîáõîäèìîñòü óñêîðåíèÿ âûïóñêà íîâîé ïðîäóêöèè íà ðûíîê è ñíèæåíèÿ îáùåé ñòîèìîñòè ñèñòåì âûíóæäàåò ìíîãèõ ðàçðàáîò÷èêîâ ïðîãðàììíî-àïïàðàòíûõ ïðîäóêòîâ ïðèìåíÿòü ÎÑ Linux è äðóãèå ïðîãðàììíûå ñðåäñòâà ñ îòêðûòûìè èñõîäíûìè êîäàìè. Ïîäîáíîå ðåøåíèå îáóñëîâëåíî òåì, ÷òî, èñïîëüçóÿ îòêðûòîå ïðîãðàììíîå îáåñïå÷åíèå, ðàçðàáîò÷èêè ïîëó÷àþò âîçìîæíîñòü ñêîíöåíòðèðîâàòü óñèëèÿ íà ñîâåðøåíñòâîâàíèè ñâîåé ïðîäóêöèè. Òàêæå ðåøàþùèì ôàêòîðîì ÿâëÿåòñÿ òîò ôàêò, ÷òî Linux ïîääåðæèâàåò áîëüøîå êîëè÷åñòâî ïðîöåññîðíûõ àðõèòåêòóð.  óñëîâèÿõ ìîùíîãî äàâëåíèÿ ñðîêîâ âûõîäà íà ðûíîê, ìîäèôèêàöèÿ ÎÑ äëÿ íîâîãî ïðîöåññîðà èëè ïðîöåññîðíîãî ìîäóëÿ ìîæåò îêàçàòüñÿ ñëèøêîì äëèòåëüíûì ïðîöåññîì, íàëè÷èå æå ãîòîâîé îïåðàöèîííîé ñèñòåìû âåäåò ê ñóùåñòâåííîé ýêîíîìèè âðåìåíè è ñðåäñòâ. 
Ñàìàÿ ðàñïðîñòðàíåííàÿ íà ñåãîäíÿ âåðñèÿ Linux ýòî, áåçóñëîâíî, âåðñèÿ äëÿ ïåðñîíàëüíûõ êîìïüþòåðîâ ñîçäàííûõ íà áàçå ïðîöåññîðîâ ñ àðõèòåêòóðîé õ86. Ñîâðåìåííûå ïåðñîíàëüíûå êîìïüþòåðû ýòî íåäîðîãèå ñèñòåìû, ñïîñîáíûå âûñòóïàòü êàê â ðîëè èíñòðóìåíòàëüíûõ, òàê è öåëåâûõ ïëàòôîðì.  ìèðå òàêèå ìàøèíû èñïîëüçóåò áîëüøàÿ ÷àñòü Linux-ðàçðàáîò÷èêîâ, è èìåííî äëÿ ýòèõ êîìïüþòåðîâ ïðåæäå âñåãî è ïèøóòñÿ ðàçëè÷íûå ïðîãðàììû. Ïðîöåññîðû ñåìåéñòâà õ86 ïðèìåíÿþòñÿ íå òîëüêî â ïåðñîíàëüíûõ, íî è âî ìíîãèõ âñòðàèâàåìûõ ñèñòåìàõ.  íàñòîÿùåå âðåìÿ ñóùåñòâóåò ìíîæåñòâî ìîäåëåé õ86-ïðîöåññîðîâ - îò ÷ðåçâû÷àéíî áûñòðîäåéñòâóþùèõ äî ñàìûõ ýêîíîìè÷íûõ. Îäíàêî â îïðåäåëåííûõ ñëó÷àÿõ ïðîöåññîðû õ86 ìîãóò áûòü íå ñàìûì ëó÷øèì âûáîðîì.  òåõ ïðèëîæåíèÿõ, ãäå òðåáóåòñÿ î÷åíü íèçêèé óðîâåíü ýíåðãîïîòðåáëåíèÿ, áîëåå óìåñòíûìè ìîãóò îêàçàòüñÿ ïðîöåññîðû òèïà ARM èëè Hitachi SH, èìåþùèå ïðè ñóùåñòâåííî ìåíüøåé ðàññåèâàåìîé ìîùíîñòè òó æå ïðîèçâîäèòåëüíîñòü.  äðóãèõ ñèòóàöèÿõ ïðåäïî÷òåíèå ñëåäóåò îòäàòü äåøåâûì ìèêðîïðîöåññîðàì, èìåþùèì ÿäðî PowerPC, ñîïðîöåññîð è íåîáõîäèìûé íàáîð ôóíêöèé ââîäà/âûâîäà.  ïðåäïîëàãàþùèõ èíòåíñèâíóþ îáðàáîòêó äàííûõ ñèñòåìàõ îïðàâäàííûì ìîæåò áûòü ïðèìåíåíèå ïðîöåññîðîâ òèïà MIPS, õàðàêòåðèçóþùèõñÿ ëó÷øèì, ÷åì ó õ86, ñîîòíîøåíèåì öåíû è ïðîèçâîäèòåëüíîñòè. Õîðîøàÿ íîâîñòü ñîñòîèò â òîì, ÷òî ÿäðî ÎÑ Linux ïîääåðæèâàåò âñå ýòè òèïû àðõèòåêòóð. 

1.  ÏÎÑÒÐÎÅÍÈÅ ÑÈÑÒÅÌÛ ÍÀ ÁÀÇÅ ÏÐÎÖÅÑÑÎÐÀ ARM AT91SAM9G45 
1.1.  Îáùèå ñâåäåíèÿ î ïðîöåññîðå
Ìèêðîêîíòðîëëåð AT91SAM9G45 âûïîëíåí íà îñíîâå ÿäðà ARM926EJ-S è èíòåãðèðóåò íàèáîëåå âîñòðåáîâàííûé íàáîð ìîäóëåé äëÿ îðãàíèçàöèè ïîëüçîâàòåëüñêîãî èíòåðôåéñà è âûñîêîñêîðîñòíîé ïåðåäà÷è äàííûõ, â ò.÷. êîíòðîëëåð ÆÊ-äèñïëåÿ, êîíòðîëëåð ðåçèñòèâíîãî ñåíñîðíîãî ýêðàíà, èíòåðôåéñ êàìåðû, àóäèî èíòåðôåéñ, êîíòðîëëåð Ethernet 10/100 è âûñîêîñêîðîñòíûå èíòåðôåéñû USB è SDIO. Èìåÿ â ñâîåì àðñåíàëå ïðîöåññîð, ðàáîòàþùèé íà ÷àñòîòå 400 ÌÃö, è íåñêîëüêî êîììóíèêàöèîííûõ èíòåðôåéñîâ ñ áûñòðîäåéñòâèåì ñâûøå 100 Ìáèò/ñåê, AT91SAM9G45 îáëàäàåò âñåìè âîçìîæíîñòÿìè, êîòîðûå íåîáõîäèìû äëÿ ðåàëèçàöèè ñåòåâûõ ôóíêöèé è ôóíêöèé ëîêàëüíîãî õðàíåíèÿ äàííûõ. 
AT91SAM9G45 ïîääåðæèâàåò èíòåðôåéñû ïîñëåäíåãî ïîêîëåíèÿ ÈÑ çàïîìèíàþùèõ óñòðîéñòâ DDR2 è NAND Flash è ìîæåò èñïîëüçîâàòü èõ êàê äëÿ õðàíåíèÿ êîäà ïðîãðàììû, òàê è äëÿ õðàíåíèÿ äàííûõ. Âíóòðåííÿÿ 133-ìåãàãåðöîâàÿ ìíîãîñëîéíàÿ øèííàÿ àðõèòåêòóðà â ñâÿçêå ñ 37 êàíàëàìè DMA, äâóìÿ âíåøíèìè øèííûìè èíòåðôåéñàìè è ðàñïðåäåëåííîé ïàìÿòüþ, â ò.÷. 64 - êáàéò SRAM, êîòîðûå ìîæíî íàñòðîèòü êàê TCM-ïàìÿòü, îáåñïå÷èâàåò âñþ íåîáõîäèìóþ äëÿ ïðîöåññîðà è âûñîêîñêîðîñòíûõ óñòðîéñòâ ââîäà-âûâîäà ïðîïóñêíóþ ñïîñîáíîñòü. 
Èíòåðôåéñû ââîäà-âûâîäà ìîãóò ðàáîòàòü ïðè íàïðÿæåíèè 1.8 Â èëè 3.3 Â. Ïðåäóñìîòðåíà îòäåëüíàÿ ïîäà÷à íàïðÿæåíèÿ ïèòàíèÿ äëÿ èíòåðôåéñîâ çàïîìèíàþùèõ óñòðîéñòâ è óñòðîéñòâ ââîäà-âûâîäà. Äàííàÿ âîçìîæíîñòü ïîëíîñòüþ èñêëþ÷àåò ïîòðåáíîñòü â óñòàíîâêå âíåøíèõ ÈÑ äëÿ ïðåîáðàçîâàíèÿ óðîâíåé. Ó ìèêðîêîíòðîëëåðà èñïîëüçóåòñÿ øàã âûâîäîâ 0.8 ìì, ÷òî óäåøåâëÿåò ïðîèçâîäñòâî ïå÷àòíîé ïëàòû. 
Êîíòðîëëåð óïðàâëåíèÿ ýëåêòðîïîòðåáëåíèåì AT91SAM9G45 ïîçâîëÿåò ýôôåêòèâíî óïðàâëÿòü ñèãíàëàìè ñèíõðîíèçàöèè è ñîäåðæèò äîìåí ñ áàòàðåéíûì ðåçåðâèðîâàíèåì ïèòàíèÿ. 

1.2. Çàãðóç÷èê ïåðâîãî óðîâíÿ AT91Bootstrap 
1.2.1.  Îáùèå ñâåäåíèÿ î çàãðóç÷èêå 
 ìèêðîêîíòðîëëåðàõ ARM9 êîìïàíèè Atmel äëÿ çàãðóçêè ïðèëîæåíèé ïîëüçîâàòåëÿ èñïîëüçóåòñÿ ñïåöèàëèçèðîâàííûé çàãðóç÷èê ïîä íàçâàíèåì AT91Bootstrap. Öåëüþ ýòîãî çàãðóç÷èêà ÿâëÿåòñÿ èíèöèàëèçàöèÿ áàçîâîé ïåðèôåðèè(GPIO, SDRAM, IRQ è ò.ä), çàãðóçêà ïðèëîæåíèÿ ïîëüçîâàòåëÿ èç âíåøíåãî Flash íàêîïèòåëÿ è ïåðåäà÷à óïðàâëåíèÿ çàãðóæåííîìó ïðèëîæåíèþ.Ñàì AT91Bootstrap õðàíèòñÿ â ýíåðãîíåçàâèñèìîéïàìÿòè, ýòîé ïàìÿòüþ ìîæåò áûòü: âíóòðåííÿÿ Flash ïàìÿòü ìèêðîïðîöåññîðà, ïîñëåäîâàòåëüíàÿ Dataflash-ïàìÿòü, ïàðàëëåëüíàÿ NAND-ïàìÿòü èëè SD/MMC-êàðòà ïàìÿòè. 
Ìîæåò âîçíèêíóòü âîïðîñ "êóðèöû è ÿéöà": «Êòî çàãðóæàåò çàãðóç÷èê AT91Bootstrap?». Äåëî â òîì, ÷òî âñå ìèêðîïðîöåññîðû ARM9 êîìïàíèè Atmel èìåþò âñòðîåííûé çàãðóç÷èê íóëåâîãî óðîâíÿ RomBoot. Íàõîäèòñÿ çàãðóç÷èê âî âíóòðåííåé ROM-ïàìÿòè ìèêðîïðîöåññîðà. Çàäà÷à RomBoot ñîñòîèò â èíèöèàëèçàöèè âíåøíèõ íîñèòåëåé èíôîðìàöèè è ïîèñêà AT91Bootstrap-à. Íèæå, íà ðèñ. 1.1. ïðèâåäåíà ïîñëåäîâàòåëüíîñòü ïîèñêà AT91Bootstrap-à. 

Ðèñ.1.1. Ïîñëåäîâàòåëüíîñòü ïîèñêà AT91Bootstrap-à
 òîì ñëó÷àå, åñëè çàãðóç÷èêó RomBoot íå óäàëîñü íàéòè AT91Bootstrap, ïåðâûé ïåðåõîäèò â ðåæèì âîññòàíîâëåíèÿ SAM-BA Boot.  ýòîì ðåæèìå èíèöèàëèçèðóþòñÿ èíòåðôåéñûUSB è UART äëÿ ïðèåìà êîìàíä. Ñ ïîìîùüþ ñïåöèôè÷åñêèõ êîìàíä ìîæåò ïðîèçâîäèòüñÿ çàïèñü çàãðóç÷èêà AT91Bootstrap è äðóãèõ äàííûõ ïîëüçîâàòåëÿ âî âíåøíþþ Flash-ïàìÿòü. Òàêèì îáðàçîì, âî âñåõ ìèêðîêîíòðîëëåðàõ ARM9 êîìïàíèè Atmel ïðåäóñìîòðåí ðåæèì âîññòàíîâëåíèÿ. 
1.2.2.  Ïîäãîòîâêà ê êîìïèëÿöèè çàãðóç÷èêà 
Ïåðåä òåì êàê ïðèñòóïèòü ê ðàáîòå ñ çàãðóç÷èêà AT91Bootstrap, íåîáõîäèìî óñòàíîâèòü ìèíèìàëüíûé íàáîð óòèëèò, êîìïèëÿòîð è íàñòðîèòü ïåðåìåííûå îêðóæåíèÿ. Èç äîïîëíèòåëüíûõ óòèëèò íåîáõîäèìî óñòàíîâèòü make. Äëÿ êîìïèëèðîâàíèÿ èñïîëüçóåòñÿ êîìïèëÿòîð Sourcery G++ Lite2011.03-42 for ARM EABI. Âñå ðàáîòû ïðîâîäèëèñü íà äèñòðèáóòèâå Ubuntu 10.04.3 ñ îáíîâëåííûì ÿäðîì äî âåðñèè 2.6.38-10. 
Äëÿ íà÷àëà íóæíî ñîçäàòü äèðåêòîðèþ, â êîòîðîé áóäóò ïðîâîäèòüñÿ âñå ðàáîòû: 
- taras@taras-desktop:~/tescom$ mkdir example 
 - taras@taras-desktop:~/tescom$ cd example/ 
 - Ïîñëå ýòîãî íåîáõîäèìî ñêà÷àòü AT91Bootstrap, óñòàíîâèòü êîìïèëÿòîð è make: 
 - taras@taras-desktop:~/tescom/example$ wget http://www.atmel.com/dyn/resources/prod_documents/AT91Bootstrap1.16.zip 
 - taras@taras-desktop:~/tescom/example$ unzip AT91Bootstrap1.16.zip 
 - taras@taras-desktop:~/tescom/example$ wget http://www.codesourcery.com/sgpp/lite/arm/portal/package8736/public/arm-none-eabi/arm-2011.03-42-arm-none-eabi.bin 
 - taras@taras-desktop:~/tescom/example$ chmod 777 arm-2011.03-42-arm-none-eabi.bin 
 - taras@taras-desktop:~/tescom/example$ ./arm-2011.03-42-arm-none-eabi.bin 
 - taras@taras-desktop:~/tescom/example$ sudo apt-get install make 
 
1.2.3.  Ïîäãîòîâêà ê êîìïèëÿöèè çàãðóç÷èêà 
Çàãðóç÷èê ïåðâîãî óðîâíÿ AT91Bootstrap íå ïðåäíàçíà÷åí äëÿ çàãðóçêè îáðàçà ÿäðà Linux. Ïðåäïîëàãàåòñÿ, ÷òî AT91Bootstrap ñêîíôèãóðèðóåò âíåøíþþ äèíàìè÷åñêóþ ïàìÿòü, ñêîïèðóåò òóäà çàãðóç÷èê âòîðîãî óðîâíÿ è ïåðåäàñò åìó óïðàâëåíèå. Çàãðóç÷èêîì âòîðîãî óðîâíÿ ìîæåò âûñòóïàòü U-boot äëÿ çàãðóçêè Linux, èëè EBOOT –äëÿ Windows CE. Íî èñïîëüçîâàíèå çàãðóç÷èêà âòîðîãî óðîâíÿ óâåëè÷èâàåò ðàçìåð ñèñòåìû è âðåìÿ çàãðóçêè, à òàêæå íåñåò äîïîëíèòåëüíóþ íàãðóçêó íà ðàçðàáîò÷èêà ïðîãðàììíîãî îáåñïå÷åíèÿ. Íèæå áóäåò îïèñàí ïðîöåññ ìîäèôèöèðîâàíèÿ AT91Bootstrap äëÿ çàãðóçêè zImage îáðàçà ÿäðà. 
Äëÿ çàïóñêà ÿäðà Linux íåîáõîäèìî ñêîïèðîâàòü åãî îáðàç èç âíåøíåé Flash ïàìÿòè â ÎÇÓ, çàïðåòèòü ïðåðûâàíèÿ â çàãðóç÷èêå, îòêëþ÷èòü êýø, çàãðóçèòü â ðåãèñòð R0 íîëü,R1 –èäåíòèôèêàòîð ïëàòôîðìû, R2 – àäðåñ íà÷àëà àðãóìåíòîâ çàãðóçêè ÿäðà.  ñîîòâåòñòâèè ñî ñïåöèôèêàöèåé EABI ýòè ðåãèñòðû èñïîëüçóþòñÿ äëÿ ïåðåäà÷è ïàðàìåòðîâ â ôóíêöèþ. Ñîîòâåòñòâåííî, ñîçäàâ óêàçàòåëü íà ôóíêöèþ, êîòîðàÿ ïðèíèìàåò òðè ïàðàìåòðà, ïðèñâîèâ ýòîìó óêàçàòåëþ àäðåñ ÿäðà â ÎÇÓ ìîæíî ïåðåäàòü óïðàâëåíèå ÿäðó ñ çàäàííûìè ïàðàìåòðàìè. Òàêæå â çàãðóç÷èêå íóæíî èçìåíèòü ïàðàìåòðû îáðàçà ÿäðà. 
Äëÿ âíåñåíèé èçìåíåíèé íóæíî ñäåëàòü ñëåäóþùåå: 
•  Ïåðåéòè â äèðåêòîðèþ ñ AT91Bootstrap è äîáàâèòü â main.c ïåðåä îïåðàòîðîì return ñëåäóþùåå: 
- { 
 - void (*theKernel)(int zero, int arch, unsigned intparams); 
 - dbg_print("Run Linux...n"); 
 - theKernel = (void (*)(int, int, unsigned int))JUMP_ADDR; 
 - theKernel(0, MACH_TYPE, 0); 
 - } 
 - taras@taras-desktop:~/tescom/example$ cd Bootstrap-v1.16/ 
 - taras@taras-desktop:~/tescom/example/Bootstrap-v1.16$ nanomain.c 
 
•  Âíåñòè èçìåíåíèÿ â êîíôèãóðàöèîííûé ôàéë at91sam9m10g45ek.h, äëÿ ïëàòôîðìû èçìåíèâ ñëåäóþùèå îïðåäåëåíèÿ: 
- #define IMG_SIZE 0x300000 /* Image Size in DataFlash */ 
 - #define JUMP_ADDR 0x70008000 /* Final Jump Address */ 
 - #define CFG_DEBUG 
 - #define DEBUG 
 - taras@taras-desktop:~/tescom/example/Bootstrap-v1.16$ cd board/at91sam9m10g45ek/dataflash/ 
 - taras@taras-desktop:~/tescom/example/Bootstrap-v1.16/board/at91sam9m10g45ek/dataflash$ nano at91sam9m10g45ek.h 
 
•  Ïîñëå ýòèõ èçìåíåíèé ìîæíî ïðèñòóïèòü ê êîìïèëÿöèè, ðåçóëüòàòîì âûïîëíåíèÿ áóäåò dataflash_at91sam9m10g45ek.bin â ïàïêå ñ Makefile 
- taras@taras-desktop:~/tescom/example/Bootstrap-v1.16/board/at91sam9m10g45ek/dataflash$ make clean 
 - taras@taras-desktop:~/tescom/example/Bootstrap-v1.16/board/at91sam9m10g45ek/dataflash$ make CROSS_COMPILE=arm-none-eabi- 
 
1.3.  ßäðî Linux 
1.3.1.  Îáùèå ñâåäåíèÿ 
Ïðîöåññ çàãðóçêè â ñèñòåìå Linux âêëþ÷àåò â ñåáÿ íåñêîëüêî ñòàäèé. Îäíàêî âíå çàâèñèìîñòè îò òîãî, âûïîëíÿåòñÿ ëè çàãðóçêà íà ñòàíäàðòíîì ïåðñîíàëüíîì êîìïüþòåðå ñ àðõèòåêòóðîé x86 èëè æå âî âñòðàèâàåìîé ñèñòåìå, ïðîöåññ çàãðóçêè îêàçûâàåòñÿ â çíà÷èòåëüíîé ñòåïåíè îäèíàêîâûì. 
Ïîñëå òîãî êàê îáðàç ÿäðà îêàçûâàåòñÿ â ïàìÿòè è åìó ïåðåäàåòñÿ óïðàâëåíèå îò çàãðóç÷èêà 2-é ñòóïåíè, íàñòóïàåò ñòàäèÿ ÿäðà. Îäíàêî îáðàç íå ÿâëÿåòñÿ èñïîëíÿåìûì, ýòî ñæàòûé îáðàç ÿäðà. Îáû÷íî ýòî zImage (ñæàòûé îáðàç ðàçìåðîì ìåíåå 512KB) èëè bzImage (áîëüøîé ñæàòûé îáðàç, ðàçìåðîì áîëåå 512KB), êîòîðûé áûë ñæàò ïðè ïîìîùè zlib.  íà÷àëå òàêîãî îáðàçà ðàñïîëàãàåòñÿ ïðîãðàììà, êîòîðàÿ âûïîëíÿåò ìèíèìàëüíóþ íàñòðîéêó àïïàðàòíîãî îáåñïå÷åíèÿ è çàòåì ðàñïàêîâûâàåò ÿäðî, õðàíÿùååñÿ âíóòðè îáðàçà è ïîìåùàåò åãî â âåðõíþþ îáëàñòü ïàìÿòè. Åñëè èìååòñÿ îáðàç íà÷àëüíîãî RAM-äèñêà, òî ïðîãðàììà òàêæå ïåðåìåùàåò åãî â ïàìÿòü è ïîìå÷àåò äëÿ äàëüíåéøåãî èñïîëüçîâàíèÿ, à çàòåì âûçûâàåò ñàìî ÿäðî, ïîñëå ÷åãî íà÷èíàåòñÿ åãî çàãðóçêà. 
Ïðè âûçîâå bzImage (îáðàç äëÿ ARM) âûïîëíåíèå íà÷èíàåòñÿ â./arch/arm/boot/head.Sñ àññåìáëåðíîé ôóíêöèè. Ýòà ïðîãðàììà âûïîëíÿåò îñíîâíóþ íàñòðîéêó àïïàðàòíîãî îáåñïå÷åíèÿ è âûçûâàåò ïðîöåäóðóstartup_32, ðàñïîëàãàþùóþñÿ â ./arch/arm/boot/compressed/head.S. Ïðîöåäóðà íàñòðàèâàåò áàçîâóþ ñðåäó (ñòåê è ò.ï.) è î÷èùàåò BlockStartedbySymbol (BSS). Çàòåì âûïîëíÿåòñÿ äåêîìïðåññèÿ ÿäðà ïðè ïîìîùè âûçîâà C-ôóíêöèèdecompress_kernel(êîòîðàÿ õðàíèòñÿ â ./arch/arm/boot/compressed/misc.c). Ïîñëå äåêîìïðåññèè ÿäðà â ïàìÿòü ïðîèñõîäèò åãî âûçîâ. Ýòî åùå îäíà ôóíêöèÿ startup_32, íî îíà ðàñïîëàãàåòñÿ â ôàéëå ./arch/arm/kernel/head.S. 
 íîâîé ôóíêöèèstartup_32 (êîòîðàÿ íàçûâàåòñÿ swapper èëè process 0) èíèöèàëèçèðóþòñÿ òàáëèöû ñòðàíèö (pagetables) è îáåñïå÷èâàåòñÿ ïîäêëþ÷åíèå ôóíêöèè memorypaging (îòîáðàæåíèå ñòðàíèö). Òàêæå îïðåäåëÿåòñÿ òèï öåíòðàëüíîãî ïðîöåññîðà è ñîïðîöåññîðà äëÿ âû÷èñëåíèé ñ ïëàâàþùåé òî÷êîé (FPU), åñëè îí èìååòñÿ, è äàííàÿ èíôîðìàöèÿ ñîõðàíÿåòñÿ äëÿ ïîñëåäóþùåãî èñïîëüçîâàíèÿ. Äàëåå âûçûâàåòñÿ ôóíêöèÿstart_kernel èç(init/main.c), êîòîðàÿ îñóùåñòâëÿåò ïåðåõîä â òó ÷àñòü ÿäðà Linux, êîòîðàÿ íå çàâèñèò îò îñîáåííîñòåé êîíêðåòíîé àïïàðàòíîé ïëàòôîðìû. Ìîæíî ñêàçàòü, ÷òî ýòî ôóíêöèÿ main äëÿ ÿäðà Linux. 
Ïðè îáðàùåíèè ê start_kernel âûçûâàåòñÿ äëèííûé ñïèñîê ôóíêöèé èíèöèàëèçàöèè, êîòîðûå âûïîëíÿþò íàñòðîéêó ïðåðûâàíèé, ïðîèçâîäÿò äàëüíåéøåå êîíôèãóðèðîâàíèå ïàìÿòè è çàãðóæàþò íà÷àëüíûé RAM-äèñê. Ïîñëå ýòîãî âûçûâàåòñÿ ôóíêöèÿ kernel_thread (èç arch/arm/kernel/process.c), çàïóñêàþùàÿ ôóíêöèþ init, êîòîðàÿ ÿâëÿåòñÿ ïåðâûì ïðîöåññîì, âûïîëíÿþùèìñÿ â ïðîñòðàíñòâå ïîëüçîâàòåëÿ.  çàêëþ÷åíèå çàïóñêàåòñÿ idletask, ïîñëå ÷åãî óïðàâëåíèå ìîæåò âçÿòü íà ñåáÿ ïëàíèðîâùèê (scheduler) (ïîñëå âûçîâà cpu_idle). Åñëè ðàçðåøåíû ïðåðûâàíèÿ, âûòåñíÿþùèé ïëàíèðîâùèê (pre-emptivescheduler) áóäåò ïåðèîäè÷åñêè ïåðåõâàòûâàòü êîíòðîëü äëÿ ïîääåðæêè ìíîãîçàäà÷íîñòè. 
Ïîñëå çàãðóçêè ÿäðà ìîíòèðóåòñÿ êîðíåâàÿ ôàéëîâàÿ ñèñòåìà è çàïóñêàåòñÿ ïåðâîå ïðèëîæåíèå â ïðîñòðàíñòâå ïîëüçîâàòåëÿ. Ýòî ïåðâàÿ èç âûçûâàåìûõ ïðîãðàìì, êîòîðûå ñêîìïèëèðîâàíû ñî ñòàíäàðòíîé áèáëèîòåêîé C. Äî ýòîãî ìîìåíòà ïðîöåññà ñòàíäàðòíûå C-ïðèëîæåíèÿ åùå íå âûïîëíÿëèñü.
1.3.2.  Ïîäãîòîâêà ê êîìïèëÿöèè ÿäðà 
Äëÿ ñáîðêè ÿäðà íåîáõîäèìî óñòàíîâèòü áàçîâûé íàáîð óòèëèò è êîìïèëÿòîð, à òàêæå ñêà÷àòü ñàìî ÿäðî. Íèæå ïðèâåäåíà ïîñëåäîâàòåëüíîñòü äåéñòâèé: 
•  Óñòàíàâëèâàåì íåîáõîäèìûå óòèëèòû èç ðåïîçèòîðèÿ: 
- taras@taras-desktop:~/tescom/example$ sudo apt-get install make flex bison m4 ncurses-devgettext texi2html texinfo zlib1g zlib1g-dev 
 - taras@taras-desktop:~/tescom/example$ sudo apt-get install liblzo2-2 liblzo2-dev libacl1 libacl1-dev libglib2.0-dev autoconfautomakelibtool 
 
•  Ñêà÷èâàåì è ðàñïàêîâûâàåì ÿäðî: 
- taras@taras-desktop:~/tescom/example$ wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.37.6.tar.bz2 
 - taras@taras-desktop:~/tescom/example$ tar xvjf linux-2.6.37.6.tar.bz2 
 
•  Ñêà÷èâàåì è óñòàíàâëèâàåì êîìïèëÿòîð: 
- taras@taras-desktop:~/tescom/example$ wget http://www.codesourcery.com/sgpp/lite/arm/portal/package8741/public/arm-none-linux-gnueabi/arm-2011.03-41-arm-none-linux-gnueabi.bin 
 - taras@taras-desktop:~/tescom/example$ chmod 777 arm-2011.03-41-arm-none-linux-gnueabi.bin 
 - taras@taras-desktop:~/tescom/example$ ./arm-2011.03-41-arm-none-linux-gnueabi.bin 
 
•  Ñêà÷èâàåì áàçîâóþ êîíôèãóðàöèþ ÿäðà äëÿ íàøåé àðõèòåêòóðû: 
- taras@taras-desktop:~/tescom/example$ wget ftp://www.at91.com/pub/linux/2.6.30-at91/at91sam9m10g45ek_defconfig 
 - taras@taras-desktop:~/tescom/example$ cp at91sam9m10g45ek_defconfig ./linux-2.6.37.6/.config 
 
•  Êîíôèãóðèðóåì ÿäðî êîìàíäîé: 
- taras@taras-desktop:~/tescom/example/linux-2.6.37.6$ make ARCH=arm menuconfig 
 - è âûñòàâëÿåì ñëåäóþùèå ïóíêòû ìåíþ: 
 - SystemType ---> 
 - Atmel AT91 System-on-Chip ---> 
 - Atmel AT91 Processor (cpu name) --->AT91SAM9G45 – âûáðàòü 
 - Boot options ---> 
 - Always use the default kernel command string – âûáðàòü 
 - Default kernel command string: mem=64M console=ttyS0,115200 root=/dev/sda1 rootwait 
 - Device Drivers ---> 
 - Input device support ---> 
 - Polled input device skeleton – âûáðàòüêàêâñòðàèâàåìûé 
 - Graphics support ---> 
 - Console display driver support ---> 
 - Framebuffer Console support – âûáðàòüêàêâñòðàèâàåìûé 
 - Map the console to the primary display device – âûáðàòü 
 - Select compiled-in fonts – âûáðàòü 
 - VGA 8x8 font - select this 
 - Bootup logo – âûáðàòü 
 - Bootuplogo ---> 
 - Standard black and white Linux logo – îòêëþ÷èòü 
 - Standard 16-color Linux logo - îòêëþ÷èòü 
 - HID Devices ---> 
 - USB Human Interface Device support – âûáðàòüêàêâñòðàèâàåìûé 
 - File systems ---> 
 - Ext3 journalling file system support – âûáðàòüêàêâñòðàèâàåìûé 
 - The Extended 4 (ext4) filesystem – âûáðàòüêàêâñòðàèâàåìûé 
 
•  Êîìïèëèðóåì ÿäðî: 
taras@taras-desktop:~/tescom/example/linux-2.6.37.6$ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- 
1.4  Êîðíåâàÿ ôàéëîâàÿ ñèñòåìà 
1.4.1 Êîíôèãóðèðîâàíèå è êîìïèëÿöèÿ êîðíåâîé ôàéëîâîé ñèñòåìû
Buildroot ýòî íàáîð èíñòðóìåíòîâ, â îñíîâå êîòîðûõ ëåæèò òðàäèöèîííûé makefile, ïîçâîëÿþùèé ñîáðàòü ñèñòåìó ïîä x86, PowerPC, ARM, AVR, MIPS è ò.ä. Ñèñòåìà ñòðîèòñÿ íà áàçå uClibc – ëåãêîâåñíîãî è ëåãêî ïîðòèðóåìîãî âàðèàíòà áàçîâîé Ñ-áèáëèîòåêè – è BusyBox – àãðåãàòîðà, âêëþ÷àþùåãî â ñåáÿ ôóíêöèîíàë áîëüøèíñòâà óòèëèò òðàäèöèîííîãî îêðóæåíèÿ Linux (ýòî ïîçâîëÿåò ñîêðàòèòü êàê îáúåì êîäà, òàê è âðåìÿ çàãðóçêè ïðîãðàììû â îïåðàòèâíóþ ïàìÿòü). 
Äëÿ ïîñòðîåíèÿ êðîññêîìïèëÿòîðà è ôàéëîâîé ñèñòåìû íóæíî ïðîäåëàòü ñëåäóþùåå: 
•  Ñêà÷èâàåì è ðàñïàêîâûâàåì ÿäðî: 
- taras@taras-desktop:~/tescom/example$ wget http://buildroot.uclibc.org/downloads/buildroot-2011.08.tar.bz2 
 - taras@taras-desktop:~/tescom/example$ tar xvjf buildroot-2011.08.tar.bz2 
 
•  Çàïóñêàåì êîíôèãóðàòîð Buildroot è óñòàíàâëèâàåì ñëåäóþùèå ïóíêòû 
- taras@taras-desktop:~/tescom/example$ cd buildroot-2011.08 
 - taras@taras-desktop:~/tescom/example/ buildroot-2011.08$ make menuconfig 
 - Target Architecture (name) --->arm - âûáðàòü 
 - Target Architecture Variant (name) --->arm926t - âûáðàòü 
 - Toolchain ---> 
 - Kernel Headers (name) ---> 
 - Linux 2.6.37.x kernel headers - âûáðàòü 
 - Enable large file (files > 2 GB) support - âûáðàòü 
 - Enable WCHAR support - âûáðàòü 
 - Enable C++ support - âûáðàòü 
 - Package Selection for the target ---> 
 - Graphic libraries and applications (graphic/text) ---> 
 - Qt - select this 
 - Qt ---> 
 - Library type (name) ---> 
 - Static Library - âûáðàòü 
 - Approve free license - âûáðàòü 
 - Keyboard drivers ---> 
 - tty - âûáðàòü 
 - linux input - âûáðàòü 
 - Text editors and viewers --->nano – âûáðàòü 
 
•  Çàïóñêàåì êîìïèëÿöèþ ôàéëîâîé ñèñòåìû: 
taras@taras-desktop:~/tescom/example/buildroot-2011.08$ make
Ðåçóëüòàòîì áóäåò àðõèâ ñ ôàéëîâîé ñèñòåìîé( output / images / root . tar ) 
1.4.2. Êðîññêîìïèëÿöèÿ ïðèëîæåíèÿ íà îñíîâå Qt. 
Äëÿ ïðèìåðà òàêæå îïèñàí ïðîöåññ êðîññêîîìïèëÿöèè ïðèëîæåíèå íà Qt. ×òîáû íå îïèñûâàòü ñîçäàíèå ïðèëîæåíèÿ âîçüìåì ïðèìåð analogclock èç èñõîäíèêîâ Qt. Äëÿ ñáîðêè íåîáõîäèìî ïðîäåëàòü ñëåäóþùåå:
•  Ïåðåõîäèì â äèðåêòîðèþ ñ ïðîåêòîì: 
- taras@taras-desktop:~/tescom/example/buildroot-2011.08$ cd output/build/qt-4.7.3/examples/widgets/analogclock/
 
•  Ñîçäàåì ôàéë ïðîåêòà, Makefile è çàïóñêàåì ïðîöåññ êîìïèëÿöèè: 
- taras@taras-desktop:~/tescom/example/buildroot-2011.08/output/build/qt-4.7.3/examples/widgets/analogclock$ ../../../bin/qmake -project 
 - taras@taras-desktop:~/tescom/example/buildroot-2011.08/output/build/qt-4.7.3/examples/widgets/analogclock$ ../../../bin/qmake 
 - taras@taras-desktop:~/tescom/example/buildroot-2011.08/output/build/qt-4.7.3/examples/widgets/analogclock$ make
 
Ðåçóëüòàòîì áóäåò ôàéë analogclock â äèðåêòîðèè ñ ïðîåêòîì. 
•  Ïðîøèâêà öåëåâîé ñèñòåìû ñîáðàííûìè îáðàçàìè 
Ïîñëå âñåõ ïðîäåëàííûõ îïåðàöèé áûëè ñîçäàíû áèíàðíûå îáðàçû çàãðóç÷èêà( Bootstrap - v 1.16/ board / at 91 sam 9 m 10 g 45 ek / dataflash / dataflash _ at 91 sam 9 m 10 g 45 ek . bin ), ÿäðà ( linux -2.6.37.6/ arch / arm / boot / zImage ) è àðõèâ ñ ñîäåðæèìûì êîðíåâîé ôàéëîâîé ñèñòåìû( example / buildroot -2011.08/ output / images / root . tar ). 
Äëÿ ïðîøèâêè ìèêðîïðîöåññîðîâ ARM êîìïàíèè Atmel ïðåäíàçíà÷åíà ñïåöèàëüíàÿ óòèëèòà SAM - BA . Äëÿ îòëàäêè ïðîåêòà ÿäðî è çàãðóç÷èê áóäóò ðàçìåùåíû â DataFlash , à êîðíåâàÿ ôàéëîâàÿ ñèñòåìà íà USB Flash íàêîïèòåëå. Ïðèñòóïèì ê ïðîöåññó óñòàíîâêè SAM - BA .
•  Äëÿ íà÷àëà íóæíî ñêà÷àòü, ðàñïàêîâàòü è íàçíà÷èòü ïðàâà SAM - BA : 
- taras@taras-desktop:~/tescom/example$ wget http://www.atmel.com/dyn/resources/prod_documents/sam-ba_2.10.zip 
 - taras@taras-desktop:~/tescom/example$ unzip sam-ba_2.10.zip 
 - taras@taras-desktop:~/tescom/example$ cd sam-ba_cdc_linux/ 
 - taras@taras-desktop:~/tescom/example/sam-ba_cdc_linux$ chmod 777 sam-ba 
 
•  Ïîäêëþ÷èòü îòëàäî÷íóþ ïëàòó ê êîìïüþòåðó ÷åðåç USB è ñîçäàòü ññûëêó íà ñèìâîëüíîå óñòðîéñòâî / dev / ttyACM 0 è çàïóñòèòü ïðîãðàììó: 
- taras@taras-desktop:~/tescom/example/sam-ba_cdc_linux$ sudo ln -s /dev/ttyACM0 /dev/ttyUSB0 
 - taras@taras-desktop:~/tescom/example/sam-ba_cdc_linux$ ./sam-ba 
 
•  Ïîñëå çàïóñêà óòèëèòû íå ýêðàíå ïîÿâèòñÿ îêíî ñ âûáîðîì ñîåäèíåíèÿ è òèïà îòëàäî÷íîé ïëàòû, â íåì íóæíî âûáðàòü ñîåäèíåíèå :/ dev / ttyUSB , ïëàòó: at 91 sam 9 m 10- g 45- ek , êàê ïîêàçàíî íà ðèñ. 1.2. Ïîñëå ýòîãî íàæàòü Connect . 

Ðèñ.1.2. Îêíî âûáîðà ñîåäèíåíèÿ è òèïà îòëàäî÷íîé ïëàòû
•  Ïðè óñïåøíîì ïîäêëþ÷åíèè íà ýêðàíå äîëæíî ïîÿâèòüñÿ ãëàâíîå îêíî ïðîãðàììû.  íåì íóæíî âûáðàòü âêëàäêó DataFlash AT 45 DB / DCB , íà ýòîé âêëàäêå íàéòè ïîëå Scripts è â ñïèñêå âûáðàòü Enable Dataflash  ( SPI 0  CS 0) è íàæàòü Execute , êàê ïîêàçàíî íà ðèñ.1.3.

Ðèñ.1.3. Ýëåìåíòû äëÿ èíèöèàëèçàöèè ïàìÿòè
•  Ïîñëå ýòîãî ìîæíî ïðèñòóïàòü ê ïðîøèâêå çàãðóç÷èêà è ÿäðà.  ñïèñêå ïîëÿ Scripts âûáðàòü Send Boot File è íàæàòü Execute , ïîñëå ýòîãî ïîÿâèòñÿ ìåíþ äëÿ âûáîðà ôàéëà è íóæíî óêàçàòü ðàñïîëîæåíèå áèíàðíîãî ôàéëà çàãðóç÷èêà ( Bootstrap - v 1.16/ board / at 91 sam 9 m 10 g 45 ek / dataflash / dataflash _ at 91 sam 9 m 10 g 45 ek . bin ). Ïîñëå ýòîãî â ïîëå Adddress óñòàíîâèòü 0 x 8400, â ñòðîêå Send File Name íàæàòü íà êíîïêó ñ èçîáðàæåíèÿì ïàïêè è óêàçàòü ïóòü ê îáðàçó ÿäðà( linux -2.6.37.6/ arch / arm / boot / zImage ) è íàæàòü êíîïêó Send File, êàê ïîêàçàíî íà ðèñ.1.4.

Ðèñ.1.4. Ýëåìåíòû óïðàâëåíèÿ SAM - BA äëÿ ïðîøèâêè Dataflash
•  Äëÿ çàïèñè ôàéëîâîé ñèñòåìû äîñòàòî÷íî ñêîïèðîâàòü ñîäåðæèìîå àðõèâà / root . tar íà USB Flash íàêîïèòåëü ñ ôàéëîâîé ñèñòåìîé Ext 2/3/4, ñêîïèðîâàòü ïðèëîæåíèå analogclock â êîðíåâîé êàòàëîã USB Flash . À òàêæå îòðåäàêòèðîâàòü ôàéë / etc / inittab . Äîáàâèâ ñëåäóþùèå ñòðîêè ïîñëå ñòðîêè ttyS0::respawn:/sbin/getty -L ttyS0 115200 vt100: 
# Set up a couple of getty's 
tty1::respawn:/sbin/getty 38400 tty1 
tty2::respawn:/sbin/getty 38400 tty2
Ïîñëå ïîäêëþ÷åíèÿ USB -êëàâèàòóðû è USB Flash íàêîïèòåëÿ, è ïåðåçàãðóçêè ïëàòû íà ýêðàíå äîëæåí ïîÿâèòüñÿ ïèíãâèí (ðèñ. 1.5), à ÷åðåç íåñêîëüêî ñåêóíä ïðèãëàøåíèå ê âõîäó â ñèñòåìó

Ðèñ. 1.5. Linux â ïðîöåññå çàãðóçêè
Äëÿ âõîäà â ñèñòåìó äîñòàòî÷íî ââåñòè èìÿ ïîëüçîâàòåëÿ “ root ” Äëÿ çàïóñêà ïðèëîæåíèÿ Qt íåîáõîäèìî â êîìàíäíîé ñòðîêå íàáðàòü ñëåäóþùåå: 
#/./ analogclock – qws . Ïîñëå çàãðóçêè ïðèëîæåíèÿ íà ýêðàíå ïîÿâèòñÿ îêíî ïðèëîæåíèÿ, êàê íà ðèñ. 1.6. 

Ðèñ. 1.6. Qt ïðèëîæåíèå, çàïóùåííîå íà îòëàäî÷íîé ïëàòå 
ÂÛÂÎÄÛ 
 äàííîì îò÷åòå ïîêàçàíî êàê ñîáðàòü Linux ñ áàçîâûì íàáîðîì óòèëèò è ïðèëîæåíèåì íà îñíîâå Qt äëÿ ARM -àðõèòåêòóðû. Òàêæå îïèñàí ïðîöåññ çàãðóçêè Linux . Âñå ýòî ìîæåò áûòü ïîëåçíûì äëÿ òåõ, êòî òîëüêî íà÷èíàåò ñâîé ïóòü â ñòîðîíó âñòðàèâàåìûõ ñèñòåì. 
 2007 ãîäó îêîëî 98% èç áîëåå ÷åì ìèëëèàðäà ìîáèëüíûõ òåëåôîíîâ, ïðîäàâàåìûõ åæåãîäíî, áûëè îñíàùåíû ïî êðàéíåé ìåðå îäíèì ïðîöåññîðîì ARM. Ïî ñîñòîÿíèþ íà 2009 íà ïðîöåññîðû ARM ïðèõîäèòñÿ äî 90% âñåõ âñòðîåííûõ 32-ðàçðÿäíûõ ïðîöåññîðîâ. ×òî åùå ðàç ãîâîðèò î àêòóàëüíîñòè è ïðàâèëüíîñòè èçó÷åíèÿ ýòîé àðõèòåêòóðû è âûáîðà òåìû ïðàêòè÷åñêîé ðàáîòû.