Ñòâîðåííÿ ïî÷àòêîâîãî çàâàíòàæóâà÷à îïåðàö³éíî¿ ñèñòåìè òà ïîòðóâàííÿ 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-ðàçðÿäíûõ ïðîöåññîðîâ. ×òî åùå ðàç ãîâîðèò î àêòóàëüíîñòè è ïðàâèëüíîñòè èçó÷åíèÿ ýòîé àðõèòåêòóðû è âûáîðà òåìû ïðàêòè÷åñêîé ðàáîòû.