




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)書(shū)計(jì)算機(jī)科學(xué)與信息工程學(xué)院2012 年 9 月 3 日目錄目錄實(shí)驗(yàn)一實(shí)驗(yàn)一 系統(tǒng)引導(dǎo)實(shí)驗(yàn)系統(tǒng)引導(dǎo)實(shí)驗(yàn).1實(shí)驗(yàn)二實(shí)驗(yàn)二 IRQ 中斷處理中斷處理 .3實(shí)驗(yàn)三實(shí)驗(yàn)三 LINUX 常用命令及工具實(shí)驗(yàn)常用命令及工具實(shí)驗(yàn).7實(shí)驗(yàn)四實(shí)驗(yàn)四 MAKEFILE 實(shí)驗(yàn)實(shí)驗(yàn).9實(shí)驗(yàn)五實(shí)驗(yàn)五 BOOTLOADER 實(shí)驗(yàn)實(shí)驗(yàn) .13實(shí)驗(yàn)六實(shí)驗(yàn)六 LINUX 內(nèi)核編譯實(shí)驗(yàn)內(nèi)核編譯實(shí)驗(yàn).16實(shí)驗(yàn)七實(shí)驗(yàn)七 驅(qū)動(dòng)程序結(jié)構(gòu)實(shí)驗(yàn)驅(qū)動(dòng)程序結(jié)構(gòu)實(shí)驗(yàn).19實(shí)驗(yàn)一實(shí)驗(yàn)一 系統(tǒng)引導(dǎo)實(shí)驗(yàn)系統(tǒng)引導(dǎo)實(shí)驗(yàn)【實(shí)驗(yàn)?zāi)康摹?.了解 PXA270 處理器功能結(jié)構(gòu)2.了解系統(tǒng)的基本硬件組成1.了解 ARM 指令集2.掌握
2、嵌入式系統(tǒng)的一般引導(dǎo)規(guī)律3.掌握常見(jiàn) ARM 開(kāi)發(fā)工具軟件的使用【實(shí)驗(yàn)儀器】PC 機(jī)一臺(tái),ARM10 試驗(yàn)箱一套,以及必要的軟件安裝包【實(shí)驗(yàn)原理】1、程序介紹本章主要通過(guò)一個(gè)簡(jiǎn)短的 Boot 程序向讀者揭示如何編寫(xiě)開(kāi)發(fā)板的啟動(dòng)程序,同時(shí)本程序也可以用來(lái)引導(dǎo)其他章節(jié)的示例程序。本程序主要為了讓讀者能夠清晰了解系統(tǒng)復(fù)位后如何從 0 x0 開(kāi)始引導(dǎo)。本引導(dǎo)程序驅(qū)動(dòng)底板上的八盞 LED 就會(huì)向右點(diǎn)亮,不斷循環(huán)下去。2、系統(tǒng)復(fù)位對(duì)于 PXA270 處理器來(lái)說(shuō),系統(tǒng)復(fù)位后的 PC 指針總是為 0 x0,以本開(kāi)發(fā)板來(lái)說(shuō),片選信號(hào) nCS0所連接的為 FLASH 芯片,boot 程序應(yīng)該被燒寫(xiě)到該 FLASH
3、 芯片上,且第一條指令應(yīng)該放在 0 x0 的地址(注意并不是所有的處理器都從地址 0 x0 開(kāi)始運(yùn)行,有些處理器是從 0 xFFFF0 開(kāi)始運(yùn)行的) 。事實(shí)上,地址 0 x00 x20 之間為中斷向量表,地址 0 x0 為復(fù)位中斷例程的入口點(diǎn),即通過(guò)在 0 x0 放一條無(wú)條件跳轉(zhuǎn)語(yǔ)句,在系統(tǒng)加電或復(fù)位時(shí),在地址 0 x0開(kāi)始跳轉(zhuǎn),從復(fù)位中斷例程開(kāi)始運(yùn)行下去。3、程序進(jìn)入點(diǎn)因?yàn)橐龑?dǎo)程序是自舉的的程序,無(wú)需操作系統(tǒng)加載來(lái)執(zhí)行,所以即使不設(shè)置初始入口點(diǎn)也可以執(zhí)行,但這里是有必要對(duì)程序進(jìn)入點(diǎn)進(jìn)行描述。我們可以將 Boot 程序看成是普通的映像文件,假設(shè)我們現(xiàn)在已經(jīng)生成了映像文件,當(dāng) Boot 映像被操
4、作系統(tǒng)加載時(shí),如何決定映像被執(zhí)行的第一條指令呢?這里引入初始入口點(diǎn)和普通入口點(diǎn)。初始化入口點(diǎn)定義了映像的第一條被執(zhí)行的指令,在編譯程序時(shí)可以添加參數(shù)entry address(或entry offset+object(area) )來(lái)標(biāo)示初始入口點(diǎn),如果沒(méi)有添加該參數(shù),只要源程序中有唯一的偽操作 ENTRY,則程序就被默認(rèn)成初始入口點(diǎn)。即當(dāng)鏡像被燒入 FLASH后,以 ro_base 屬性決定的映像位置的第一條指令就是被定義在 ENTRY 標(biāo)示的段的第一條指令,讀者可能對(duì)此有些模糊,我們這里以給定的程序來(lái)分析。在 BootLoader 代碼里的 boot.s 匯編文件里,可以發(fā)現(xiàn)以下程序:AR
5、EA boot ,CODE ,READONLYENTRYB Reset_HandlerB Undefined_HandlerB SWI_HandlerB Prefetch_HandlerB DataAbort_HandlerNOPB IRQ_HandlerB FIQ_Handler這小段代碼標(biāo)示了一個(gè)名叫 boot 的代碼段,屬性為只讀,而 ENTRY 本來(lái)只表示為一個(gè)普通入口點(diǎn),但在 Boot 代碼中,因?yàn)橹皇褂靡淮?ENTRY,所以 ENTRY 就被定義為初始化入口點(diǎn),這里并不是要求所有的源程序中只能使用一次 ENTRY,相反可以多次使用 ENTRY 來(lái)標(biāo)示普通入口點(diǎn),但多次使用 ENTR
6、Y 后,就無(wú)法讓系統(tǒng)知道鏡像的第一條執(zhí)行的指令在哪里,就必須在編譯時(shí)增加entry address 參數(shù)。讀者可以嘗試一下代碼中都不使用 ENTRY 或多次使用 ENTRY 會(huì)發(fā)生什么現(xiàn)象?;氐缴厦娴拇a中,我們發(fā)現(xiàn)偽操作 ENTRY 下有一條無(wú)條件跳轉(zhuǎn)指令 B,由于 AREA 和 ENTRY 都是偽操作,在不分配成實(shí)質(zhì)的指令,所以,程序的第一條會(huì)被執(zhí)行的指令就是 B 指令,作為 Boot 代碼,初始入口點(diǎn)是不起作用的,因?yàn)樗鼰o(wú)需被加載而運(yùn)行,初始入口點(diǎn)保存在 ELF 頭文件中,該值可被操作系統(tǒng)讀取而跳轉(zhuǎn)到初始入口點(diǎn)執(zhí)行?!緦?shí)驗(yàn)內(nèi)容】1、分析代碼結(jié)合以上說(shuō)明,對(duì)本實(shí)驗(yàn)所提供的匯編源代碼進(jìn)行分析
7、,深入理解針對(duì)具體的硬件實(shí)現(xiàn),軟件是如何配合工作的。2、程序的編譯和下載打開(kāi) ADS,執(zhí)行 ProjectMake ,也可以直接用快捷鍵 F7 進(jìn)行編譯、連接生成映像文件。如圖所示:3、觀察系統(tǒng)運(yùn)行情況,對(duì)系統(tǒng)進(jìn)行源碼調(diào)試。【習(xí)題與思考題】1、簡(jiǎn)述 ELF 文件的內(nèi)部層次結(jié)構(gòu)。2、簡(jiǎn)述連接器的 4 個(gè)參數(shù)ro_base,rw_base,first,entry 的意義。3、簡(jiǎn)述初始化入口點(diǎn)和普通入口點(diǎn)的區(qū)別,分別用在什么場(chǎng)合。實(shí)驗(yàn)二實(shí)驗(yàn)二 IRQIRQ 中斷處理中斷處理【實(shí)驗(yàn)?zāi)康摹?學(xué)習(xí)編寫(xiě)中斷處理程序【實(shí)驗(yàn)原理】1、程序介紹本章例子主要使用按鍵實(shí)現(xiàn)外部中斷,執(zhí)行中斷服務(wù)子程序。系統(tǒng)啟動(dòng)后,按
8、12345678任意鍵,相應(yīng)的八段數(shù)碼管就會(huì)點(diǎn)亮。2、中斷向量表當(dāng)異常中斷發(fā)生時(shí),系統(tǒng)執(zhí)行完當(dāng)前指令后,將跳轉(zhuǎn)到相應(yīng)的異常中斷處理程序處執(zhí)行。處理器能夠準(zhǔn)確無(wú)誤地響應(yīng)中斷,是因?yàn)?ARM 體系結(jié)構(gòu)里有一個(gè)中斷向量表,該中斷向量表將系統(tǒng)能夠響應(yīng)的7 種異常中斷類型的“入口地址”登記在一塊連續(xù)的字節(jié)空間內(nèi),每種異常中斷的“入口地址”占據(jù) 4 個(gè)字節(jié),這里“入口地址”實(shí)質(zhì)是一些跳轉(zhuǎn)指令或者是讓 PC 指針賦值的指令,通常使用 B 或 ldr 指令。簡(jiǎn)單地說(shuō),異常中斷發(fā)生首先會(huì)跳轉(zhuǎn)到中斷向量表,此時(shí)跳轉(zhuǎn)的位置會(huì)由系統(tǒng)根據(jù)中斷類型來(lái)判斷,由于中斷向量表實(shí)質(zhì)也是跳轉(zhuǎn)指令所組成的指令序列,所以系統(tǒng)會(huì)再進(jìn)行一
9、次跳轉(zhuǎn),這次跳轉(zhuǎn)便跳到中斷處理程序(中斷服務(wù)例程)的入口。從第一章開(kāi)始,讀者在學(xué)習(xí) Boot 程序的編寫(xiě)時(shí)便開(kāi)始接觸中斷向量表,Boot 程序的第一條指令 b post 就是中斷向量表里的第一個(gè)單元空間(4 個(gè)字節(jié)) ,這個(gè)單元空間是用作處理復(fù)位異常中斷。由于一條 B 和 Ldr 指令就是 32 位的指令,即占 4 個(gè)字節(jié),所以整個(gè)中斷向量表可以是如下形式:IMPORT Reset_HandlerIMPORT Undef_instrution_HandlerIMPORT SWI_HandlerIMPORT Prefetch_HandlerIMPORT Abort_HandlerIMPORT I
10、RQ_HandlerIMPORT FIQ_HandlerAREA boot ,CODE ,READONLYB Reset_HandlerB Undef_instrution_HandlerB SWI_HandlerB Prefetch_HandlerB Abort_HandlerNOPB IRQ_HandlerB FIQ_Handler或者使用 Ldr 指令來(lái)實(shí)現(xiàn):AREA boot ,CODE ,READONLYLDR PC,Reset_HandlerLDR PC,Undef_instrution_HandlerLDR PC,SWI_HandlerLDR PC,Prefetch_Handle
11、rLDR PC,Abort_HandlerNOPLDR PC,IRQ_HandlerLDR PC,F(xiàn)IQ_Handler這里使用 B 和 LDR 指令的主要區(qū)別是指令跳轉(zhuǎn)范圍,對(duì)于 B 指令,可以跳轉(zhuǎn)的范圍為-32MB 32MB,而 LDR 則可以將一個(gè) 32 位常數(shù)和地址值讀取到 PC 寄存器中,適合于大范圍的跳轉(zhuǎn)。中斷向量表是定位在 0 x0 到 0 x20 之間,從編程的角度來(lái)看,用戶需要對(duì)中斷向量表在可執(zhí)行映像中的位置進(jìn)行定位,即必須將包含中斷向量表的 AREA 定位在映像中的最開(kāi)始位置,而且,該映像必須燒寫(xiě)在ROM 空間 0 x0 的開(kāi)始位置上。3、IRQ 和 FIQ 中斷開(kāi)關(guān)系統(tǒng)復(fù)
12、位后,IRQ 和 FIQ 中斷都是被禁止的,所以即使建立了中斷向量表,當(dāng)有中斷請(qǐng)求也是不會(huì)響應(yīng)的,因此在系統(tǒng)復(fù)位后,必須通過(guò)程序控制來(lái)打開(kāi) IRQ 和 FIQ 中斷。IRQ 和 FIQ 的控制位分別是當(dāng)前程序狀態(tài)寄存器 CPSR 的第 7 和第 6 位,對(duì)這兩個(gè)控制位的修改是不能直接地通過(guò)對(duì) CPSR 進(jìn)行操作,而是首先通過(guò)讀取 CPSR 到通用寄存器中,然后修改,再寫(xiě)入到 CPSR 里。讀取狀態(tài)寄存器到通用寄存器可以通過(guò) MRS 指令,將通用寄存器的值寫(xiě)入到狀態(tài)寄存器可以通過(guò)MSR。這里假設(shè)開(kāi)啟 IRQ 和 FIQ 中斷,程序如下:MRS R0,CPSRAND R0,R0,0 x3FMSR
13、CPSR_C, R0CPSR_C 表示 CPSR7:0控制位域,將 CPSR7和 CPSR6清零便可以開(kāi)啟 IRQ 和 FIQ 中斷處理。通過(guò)這一步設(shè)置,只是打開(kāi)了 IRQ 和 FIQ 中斷的總開(kāi)關(guān),而且,對(duì)于 ARM 體系結(jié)構(gòu)的 CPU 都是必須的。IRQ 和 FIQ 對(duì)應(yīng)于中斷向量表的不同位置,同時(shí),F(xiàn)IQ 叫快速中斷模式,它的優(yōu)先級(jí)比 IRQ 高,執(zhí)行 FIQ 中斷處理可以無(wú)需跳轉(zhuǎn)到中斷服務(wù)例程,因?yàn)?FIQ 位于中斷向量表的最末位置,故 FIQ 中斷服務(wù)例程可以直接安排在 0 x1c 開(kāi)始的位置,所以 FIQ 可以對(duì)中斷請(qǐng)求實(shí)行快速的響應(yīng)。 對(duì)中斷源的具體操作還需對(duì)集成在處理器內(nèi)部的中
14、斷控制器進(jìn)行配置,不同型號(hào)的處理器里的中斷控制器略有不同,這里只針對(duì) Intel PXA270 進(jìn)行討論。4、中斷控制器Intel PXA270 內(nèi)部集成了中斷處理器,該處理器能對(duì) 23 個(gè)中斷源進(jìn)行操作,這種操作包括:通過(guò)設(shè)置寄存器 ICMR 屏蔽中斷源。通過(guò)設(shè)置寄存器 ICLR 對(duì)中斷源分類,即可以讓中斷源發(fā)出的中斷請(qǐng)求以 IRQ 中斷方式或以 FIQ 中斷方式被處理。可以查詢寄存器 ICPR 得知 23 個(gè)中斷源當(dāng)前是否有中斷請(qǐng)求,在 ICPR 寄存器上顯示發(fā)出中斷請(qǐng)求的中斷源不受 ICMR 影響,即 ICMR 即使屏蔽某個(gè)中斷源,只要中斷源發(fā)出中斷請(qǐng)求,ICPR 仍然會(huì)在相應(yīng)的位上顯示
15、“1” ??梢圆樵兗拇嫫?ICIP 得知以 IRQ 方式被處理的中斷源是否發(fā)出中斷請(qǐng)求,該寄存器受到 ICMP 影響。即 ICIP ICPR & ICMR & (ICLR) ??梢圆樵兗拇嫫?ICFP 得知以 FIQ 方式被處理的中斷源是否發(fā)出中斷請(qǐng)求,該寄存器受到 ICMP 影響。即 ICFP ICPR & ICMR & ICLR。5、中斷控制寄存器中斷控制寄存器包括 6 個(gè)寄存器,它們分別是:Interrupt Controller Mask register (ICMR):該寄存器能夠屏蔽中斷源,寄存器上每 1 位對(duì)應(yīng)一個(gè)中斷源,只要在相應(yīng)的位上設(shè)置 0,
16、就能屏蔽響應(yīng)的中斷。系統(tǒng)復(fù)位后,該寄存器全為 0,即所有的中斷源都被屏蔽。Interrupt Controller Pending register (ICPR):該寄存器是一個(gè)只讀的 32 位寄存器,它顯示了所有發(fā)出中斷請(qǐng)求的中斷源。ICPR 不受寄存器 ICMP 影響,即只要中斷源發(fā)出中斷請(qǐng)求,即使 ICMP 屏蔽了中斷源,都會(huì)在 ICPR 相應(yīng)的位上顯示。Interrupt Controller Level register (ICLR):該寄存器能夠決定中斷源以 IRQ 或 FIQ 中斷方式被處理。只要中斷源沒(méi)有被屏蔽,設(shè)置該寄存器后,如果是以 IRQ 中斷方式被處理,則 ICIR 相
17、應(yīng)位會(huì)置 1,如果是以 FIQ 中斷方式被處理,則 ICFR 相應(yīng)位會(huì)置 1。系統(tǒng)復(fù)位后該寄存器全為 0,則表示所有的中斷源都以 IRQ 方式被處理。Interrupt Controller IRQ Pending register (ICIP):該寄存器是只讀的 32 位寄存器,它顯示所有沒(méi)有被屏蔽,且以 IRQ 方式請(qǐng)求的中斷源。Interrupt Controller FIQ Pending register (ICFP):該寄存器是只讀的 32 位寄存器,它顯示所有沒(méi)有被屏蔽,且以 FIQ 方式請(qǐng)求的中斷源。Interrupt Controller Control register (
18、ICCR):該寄存器只包括一個(gè)簡(jiǎn)單的控制位ICCRDIM。當(dāng)處理器處于“IDLE”模式時(shí),如果該控制位被設(shè)為 1,只有非屏蔽的可用中斷源才能將處理器從“IDLE”模式中喚醒。否則,即使屏蔽了中斷源,所有的中斷源仍可以將處理器喚醒。6、中斷控制器的使用在系統(tǒng)初始化的時(shí)候,除了要完成打開(kāi) IRQ 和 FIQ 中斷開(kāi)關(guān),還要對(duì)中斷控制器進(jìn)行設(shè)置。假設(shè)要開(kāi)啟鍵盤(pán)中斷,并以 IRQ 的方式被處理,設(shè)置以下符號(hào):;Interrupt ControllerICMR EQU 0 x40d00004init_ICMR EQU 0 x00000010開(kāi)啟中斷源,設(shè)置屏蔽寄存器 ICMPldr r1, =ICMRl
19、dr r2, =init_ICMRstr r2,r1在 ICMR 里,KEYPAD 代表鍵盤(pán)中斷,鍵盤(pán)的中斷的位是第 5 位。在這位上設(shè) 1,則允許這些中斷源請(qǐng)求。在中斷服務(wù)例程中查詢中斷源請(qǐng)求狀態(tài)ldr r11, = REG_ICIRldr r4, r11mov r5, #0 x40000000mov r7, #5handleIdentifyLoopand r6, r4, r5cmp r6,#0 x0bne interruptIdentifymov r5, r5, LSR #0 x1sub r7, r7, #0 x1cmp r7, #0 x0bne handleIdentifyLoop以上程
20、序通過(guò)對(duì) ICIR 的 5 個(gè)狀態(tài)位進(jìn)行輪詢,當(dāng)某一位為 1 時(shí),則表示中斷源已經(jīng)發(fā)出了中斷請(qǐng)求,然后則跳轉(zhuǎn)到 interruptIdentify 運(yùn)行。如果該 5 個(gè)中斷源沒(méi)有被屏蔽,且都以 IRQ 方式處理,則輪詢寄存器 ICPR 的效果與 ICIP 是一樣的。7、IRQ 異常中斷的響應(yīng)過(guò)程處理器響應(yīng) IRQ 異常中斷時(shí),在執(zhí)行中斷服務(wù)例程的第一條指令前,處理器會(huì)自動(dòng)完成以下操作:保存返回地址:R14_IRQ = 下一條將要執(zhí)行的指令的地址4 個(gè)字節(jié)保存當(dāng)前狀態(tài):SPSR_IRQ = CPSR改變處理器模式:CPSR4:0 = 0b100101) 切換到 ARM 狀態(tài):CPSR5=02)
21、禁止 IRQ 異常中斷:CPSR1=13) 跳轉(zhuǎn)到中斷向量表的 IRQ 向量地址執(zhí)行:PC 0 x018在執(zhí)行完以上操作后,由于在地址 0 x18 處是一條跳轉(zhuǎn)指令,故程序會(huì)跳轉(zhuǎn)到 IRQ 中斷服務(wù)例程。這里需要強(qiáng)調(diào),在 IRQ 中斷服務(wù)例程里,處理器的運(yùn)行模式已經(jīng)改變?yōu)橥獠恐袛嗄J?,因此?duì) R13 和R14,SPSR 的操作實(shí)質(zhì)是外部中斷模式(IRQ)下的 R13 和 R14,SPSR,例如,mov pc,r14,這里操作結(jié)果是將 R14_IRQ 的值賦予 PC 指針寄存器。讀者在編寫(xiě)服務(wù)例程時(shí),唯一需要注意的是保存現(xiàn)場(chǎng),包括保存 CPSR,服務(wù)例程里所使用的寄存器,返回地址,由于 CPSR
22、 和返回地址在進(jìn)入中斷服務(wù)例程前都已經(jīng)由處理器自動(dòng)保存。所以,服務(wù)例程的一般形式可以如下AREA IRQ_Handler,CODE, READONLYSUB LR,LR,4STMFD SP!,寄存器列表,LR.程序主體.LDMFD SP!,寄存器列表,PCEND以上程序?qū)⒎祷氐刂窚p 4 個(gè)字節(jié)的原因是因?yàn)閳?zhí)行完當(dāng)前指令后,準(zhǔn)備執(zhí)行異常中斷處理時(shí),處理器已經(jīng)預(yù)取了 2 個(gè)指令,而正確的返回地址應(yīng)該是預(yù)取后的 PC 地址減 4 個(gè)字節(jié)。再次將LR(R14_IRQ,返回地址)保存在棧中,是為了防止在程序的主體使用 BL 再次跳轉(zhuǎn)時(shí)將保存在 LR寄存器的中斷返回地址沖失。最后使用的指令 LDMFD 恢
23、復(fù)寄存器原來(lái)的數(shù)值,標(biāo)識(shí)符表示將SPSR_IRQ 寄存器內(nèi)容復(fù)制到當(dāng)前程序狀態(tài)寄存器 CPSR 中,那么 CPU 的處理器模式恢復(fù)為原來(lái)的模式,并且也打開(kāi)了 IRQ 中斷開(kāi)關(guān)?!緦?shí)驗(yàn)內(nèi)容】1、分析代碼結(jié)合以上說(shuō)明,對(duì)本實(shí)驗(yàn)所提供的匯編源代碼進(jìn)行分析,深入理解針對(duì)具體的硬件實(shí)現(xiàn),軟件是如何配合工作的。2、程序的編譯和下載打開(kāi) ADS,執(zhí)行 ProjectMake ,也可以直接用快捷鍵 F7 進(jìn)行編譯、連接生成映像文件。編譯、連接生成映像編譯、連接后就生成映像文件,我們可以把它下載到 FLASH 或者 SDRAM 運(yùn)行和調(diào)試。具體辦法請(qǐng)查看文檔-ADS 實(shí)驗(yàn)調(diào)試方法。3、觀察系統(tǒng)運(yùn)行情況,對(duì)系統(tǒng)進(jìn)
24、行源碼調(diào)試。【習(xí)題與思考題】1、ARM 體系結(jié)構(gòu)中有多少種異常中斷,它們分別是在什么情況下發(fā)生,并且它們是如何被組織的。2、查看 ARM 體系結(jié)構(gòu)的資料,結(jié)合本章例子程序,完善中斷向量表,為軟中斷和數(shù)據(jù)訪問(wèn)中止異常中斷編寫(xiě)服務(wù)例程,并在程序中適當(dāng)加入語(yǔ)句令程序產(chǎn)生這兩種中斷。實(shí)驗(yàn)三實(shí)驗(yàn)三 LinuxLinux 常用命令及工具實(shí)驗(yàn)常用命令及工具實(shí)驗(yàn)【實(shí)驗(yàn)?zāi)康摹?.VMWare 軟件的安裝2.VMware 組件工具的安裝和使用3.安裝 RedHat Linux 系統(tǒng)4.熟悉實(shí)驗(yàn)環(huán)境及常用指令的使用5.掌握常用的 Linux 命令的使用和操作方法【實(shí)驗(yàn)儀器】1、PC機(jī)一臺(tái)2、XSBase270 或
25、XSBase255 ARM 實(shí)驗(yàn)開(kāi)發(fā)平臺(tái)一套3、必要的軟件安裝包【實(shí)驗(yàn)內(nèi)容】1、VMWare 軟件的安裝打開(kāi) VMWare 軟件的安裝包,按照提示安裝 VMWare 虛擬機(jī)。2、安裝 RedHat Linux 系統(tǒng)Red Hat 是目前最流行的Linux 操作系統(tǒng),也是我們的實(shí)驗(yàn)系統(tǒng)的平臺(tái),因此將以Red Hat Linux 9.0 為例介紹其安裝過(guò)程。Red Hat Linux 的安裝方法很多,我們采用的是從CD-ROM 安裝。其安裝光盤(pán)共有兩張,第一張可直接從光盤(pán)啟動(dòng),包含大部分的軟件包和一些安裝工具,第二張光盤(pán)則包含許多附加的軟件包。下面是安裝過(guò)程和注意事項(xiàng):1)啟動(dòng)安裝程序用Linux
26、 的第一張光盤(pán),從光驅(qū)引導(dǎo)啟動(dòng)系統(tǒng)。進(jìn)入一個(gè)啟動(dòng)界面,顯示“boot:”提示符,直接回車(chē)(enter),選擇圖形模式進(jìn)行安裝。2)選擇使用的語(yǔ)言3)選擇默認(rèn)的鍵盤(pán)設(shè)置4)選擇默認(rèn)的鼠標(biāo)設(shè)置5)設(shè)置安裝類型Red Hat Linux 提供了個(gè)人桌面、工作站、服務(wù)器和定制等多種安裝類型,根據(jù)具體情況選擇個(gè)人桌面或定制方式。6)進(jìn)行硬盤(pán)分區(qū)對(duì)硬盤(pán)進(jìn)行分區(qū)是一件非常危險(xiǎn)的工作,若沒(méi)有必要的把握,最好先對(duì)重要的數(shù)據(jù)進(jìn)行備份,以防不測(cè)。對(duì)于IDE 硬盤(pán),Red Hat Linux 的驅(qū)動(dòng)器標(biāo)識(shí)符為“hdx”,其中“hd”表明分區(qū)所在設(shè)備的類型,這里是指IDE 硬盤(pán)。“x”為盤(pán)號(hào)(a 為基本盤(pán),b 為基本從
27、屬盤(pán),c 為輔助主盤(pán),d 為輔助從屬盤(pán)),“”代表分區(qū),前四個(gè)分區(qū)用數(shù)字1 到4 表示,它們是主分區(qū)或擴(kuò)展分區(qū),從5 開(kāi)始就是邏輯分區(qū)。對(duì)用戶而言無(wú)論有幾個(gè)分區(qū),分給哪個(gè)目錄使用,它歸根結(jié)底就只有一個(gè)根目錄,一個(gè)獨(dú)立且唯一的文件結(jié)構(gòu)。Red Hat Linux 采用了“裝載”的處理方法,將一個(gè)分區(qū)和一個(gè)目錄聯(lián)系起來(lái),因此每個(gè)分區(qū)都是用來(lái)組成整個(gè)文件系統(tǒng)的一部分。Linux 最少需要兩個(gè)分區(qū),一個(gè)Linux native(文件)分區(qū),一個(gè)Linux swap(交換)分區(qū)。其中Linux native 分區(qū)是存放Linux 系統(tǒng)文件的分區(qū),它只能用EXT2 的分區(qū)類型,在分區(qū)時(shí)應(yīng)該將載入點(diǎn)設(shè)置為“
28、/”目錄。SWAP 分區(qū)則用做交換空間,它主要是把主內(nèi)存上暫時(shí)不用得數(shù)據(jù)存起來(lái),在需要的時(shí)候再調(diào)進(jìn)內(nèi)存內(nèi)。一般建議分區(qū)方案如下:SWAP 分區(qū):SWAP 分區(qū)至少要等于系統(tǒng)上實(shí)際內(nèi)存的容量,一般來(lái)說(shuō)它的大小是內(nèi)存的兩倍。/boot 分區(qū),它包含了操作系統(tǒng)的內(nèi)核和在啟動(dòng)系統(tǒng)過(guò)程中所要用到的文件,建這個(gè)分區(qū)是很有必要的,因?yàn)槟壳按蠖鄶?shù)的PC 機(jī)要受到BIOS 的限制,況且如果有了一個(gè)單獨(dú)的/boot 啟動(dòng)分區(qū),即使主要的根分區(qū)出現(xiàn)了問(wèn)題,計(jì)算機(jī)依然能夠啟動(dòng)。這個(gè)分區(qū)的大小約在50MB100MB 之間。/分區(qū):這是根目錄掛載的位置。系統(tǒng)運(yùn)行所需要的其它文件都在該分區(qū)上,這個(gè)分區(qū)的大小約在1.7GB5
29、GB 之間。假如是初次安裝Linux 系統(tǒng),你最好選擇自動(dòng)分區(qū)的方式。當(dāng)然,如果你對(duì)Linux 較為熟悉,也可以用系統(tǒng)配制的硬盤(pán)管理工具Disk Druid 來(lái)定制所需要的分區(qū),它既可以根據(jù)用戶的要求創(chuàng)建和刪除硬盤(pán)分區(qū),還可以為每個(gè)分區(qū)管理載入點(diǎn)。7)設(shè)置文件系統(tǒng)為EXT28)配置引導(dǎo)裝載程序選擇LILO 作為引導(dǎo)安裝程序。LILO 可以安裝在:第一硬盤(pán)的主引導(dǎo)區(qū)(MBR)或Linux 分區(qū)的引導(dǎo)扇。如果你想使用LILO 來(lái)做雙啟動(dòng)的話,你需要選擇第一種,如果是想用Linux 啟動(dòng)軟盤(pán)或其他系統(tǒng)引導(dǎo)器引導(dǎo)Linux,請(qǐng)選擇第二種方式,即將LILO 安裝在Linux分區(qū)的引導(dǎo)扇區(qū)。9)網(wǎng)絡(luò)配置1
30、0)防火墻配置11)選擇其它支持語(yǔ)言12)時(shí)區(qū)配置13)設(shè)置root 密碼14)選擇軟件包組15)籌建引導(dǎo)盤(pán)16)配置顯卡(可以參考視頻內(nèi)容進(jìn)行安裝)3、VMware 組件工具的安裝和使用安裝 VMware 虛擬機(jī)中的組件工具,實(shí)現(xiàn)文件和 WINXP 的共享。4、掌握常用的 Linux 命令的使用和操作方法Linux 登陸和退出文件命令目錄和層次命令目錄和文件安全性磁盤(pán)存儲(chǔ)命令進(jìn)程命令Vi 編輯文件實(shí)驗(yàn)四實(shí)驗(yàn)四 MakefileMakefile 實(shí)驗(yàn)實(shí)驗(yàn)實(shí)驗(yàn)?zāi)康?、了解Makefile的基本概念和基本結(jié)構(gòu)2、初步掌握編寫(xiě)簡(jiǎn)單Makefile的方法3、了解遞歸Make的編譯過(guò)程4、初步掌握利用G
31、NU Make編譯應(yīng)用程序的方法實(shí)驗(yàn)原理2、了解 Makefile 的基本概念和基本結(jié)構(gòu)在 Linux 或 Unix 環(huán)境下,對(duì)于只含有幾個(gè)源代碼文件的小程序(如 hello.c)的編譯,可以手工鍵入 gcc 命令對(duì)源代碼文件逐個(gè)進(jìn)行編譯;然而在大型的項(xiàng)目開(kāi)發(fā)中,可能涉及幾十到幾百個(gè)源文件,采用手工鍵入的方式進(jìn)行編譯,則非常不方便,而且一旦修改了源代碼,尤其頭文件發(fā)生了的修改,采用手工方式進(jìn)行編譯和維護(hù)的工作量相當(dāng)大,而且容易出錯(cuò)。所以在 Linux 或 Unix 環(huán)境下,人們通常利用 GNU make 工具來(lái)自動(dòng)完成應(yīng)用程序的維護(hù)和編譯工作。實(shí)際上,GNU make 工具通過(guò)一個(gè)稱為 Mak
32、efile 的文件來(lái)完成對(duì)應(yīng)用程序的自動(dòng)維護(hù)和編譯工作。Makefile 是按照某種腳本語(yǔ)法編寫(xiě)的文本文件,而 GNU make 能夠?qū)?Makefile 中指令進(jìn)行解釋并執(zhí)行編譯操作。Makefile 文件定義了一系列的規(guī)則來(lái)指定哪些文件需要先編譯,哪些文件需要后編譯,哪些文件需要重新編譯,甚至于進(jìn)行更復(fù)雜的功能操作。GNU make 工作時(shí)的執(zhí)行步驟如下:讀入所有的 Makefile。讀入被 include 的其它 Makefile。初始化文件中的變量。推導(dǎo)隱晦規(guī)則,并分析所有規(guī)則。為所有的目標(biāo)文件創(chuàng)建依賴關(guān)系鏈。根據(jù)依賴關(guān)系,決定哪些目標(biāo)要重新生成。執(zhí)行生成命令?!緦?shí)驗(yàn)儀器】1、裝有 L
33、inux 操作系統(tǒng)的 PC 機(jī)一臺(tái)2、XSBase270 或 XSBase255 ARM 實(shí)驗(yàn)開(kāi)發(fā)平臺(tái)一套(暫時(shí)不用)【實(shí)驗(yàn)內(nèi)容】一、使用命令行的方式手動(dòng)編譯程序方法1、利用文本編輯器創(chuàng)建 hello.c 文件/hello.c/written by Emdoor#include int main()printf(Welcome Emdoor!n);return 1;2、手動(dòng)編譯 hello 應(yīng)用程序在 hello.c 的目錄的終端下輸入:rootlocal$ gcc c hello.c rootlocal$gcc hello.o o hello通過(guò) ls 命令查看當(dāng)前目錄下是否生成源代碼 he
34、llo.c 的 object 文件 hello.o 和可執(zhí)行文件 hello,運(yùn)行可執(zhí)行文件 hello。查看一下運(yùn)行結(jié)果。rootlocal$./hello3、修改 hello.c 文件,重新手動(dòng)編譯應(yīng)用程序。4、刪除 hello.o 和 hello 文件rootlocal$rm f hello.orootlocal$rm f hello二、利用 GNU make 自動(dòng)編譯應(yīng)用程序方法1、 利用文本編輯器創(chuàng)建一個(gè) makefile 文件,并將其保存到與 hello.c 相同的目錄下。# makefile test for hello program#written by EmdoorCC=g
35、ccCFLAGS=all: hellohello: hello.o$(CC) $(CFLAGS) hello.o o hellohello.o: hello.c$(CC) $(CFLAGS) c hello.c o hello.oclean:rm rf hello *.o2、先后執(zhí)行如下命令rootlocal$makerootlocal$lsrootlocal$./hello查看并記錄所生成的文件和運(yùn)行的結(jié)果。3、執(zhí)行 make clean 命令:rootlocal$make clean4、修改 hello.c 文件,重復(fù)第 2、3 步操作,查看并記錄所生成的文件和運(yùn)行結(jié)果,并與手動(dòng)編譯進(jìn)行比
36、較,寫(xiě)出你的結(jié)論。5、重新編輯 makefile 文件(斜黑體表示修改部分)# makefile test for hello program#written by EmdoorCC=gccCFLAGS=OBJS=hello.oall: hellohello: $(OBJS)$(CC) $(CFLAGS) $ -o $hello.o: hello.c$(CC) $(CFLAGS) c $ -o $clean:rm rf hello *.o6、重復(fù)第 2,3 步操作,查看并記錄所生成的文件和運(yùn)行的結(jié)果。比較這兩種操作,寫(xiě)出你的結(jié)論。同時(shí)指出$ 、$、$在上述 Makefile 中的含義。三、多個(gè)
37、.c 文件的編譯1、創(chuàng)建文件 hello1.c、hello2.c、hello.h 和 makefile/hello1.c/written by Emdoor#include int main()printf(Welcome Emdoor!n);test2();return 1;/hello2.c/written by Emdoorinclude hello2.h#include void test2(void)printf(Welcome Emdoor! hello2n);/hello2.h/written by Emdoorvoid test2(void);# makefile test f
38、or multi files program#written by EmdoorCC=gccCFLAGS=OBJS=hello1.o hello2.oall: hellohello: $(OBJS)$(CC) $(CFLAGS) $ -o $hello1.o: hello1.c$(CC) $(CFLAGS) c $ -o $hello2.o: hello2.c$(CC) $(CFLAGS) c $ -o $clean:rm rf hello *.o2、先后執(zhí)行如下命令rootlocal$makerootlocal$lsrootlocal$./hello查看并記錄所生成的文件和運(yùn)行的結(jié)果, 寫(xiě)出
39、你的結(jié)論。3、修改 makefile 文件(斜黑體表示修改部分)# makefile test for multi files program#written by EmdoorCC=gccCFLAGS=CFILES=$(wildcard *.c)OBJS=$(CFILES:%c=%.o)all: hellohello: $(OBJS)$(CC) $(CFLAGS) o hello $(OBJS).c.o:$(CC) c $ HelpLoad用法load kernel/ramdisk描述把存放在 FLASH 中的映像文件拷貝到 SDRAM 中。在 Autoboot過(guò)程中會(huì)自動(dòng)運(yùn)行,把內(nèi)核映像從
40、 FLASH 加載到 SDRAM 中。參數(shù)Kernel把內(nèi)核映像從 FLASH 拷貝到 SDRAM 中Ramdisk從 FLASH 中拷貝 RAMDISK 到 SDRAM舉例Bboot load kernelbootp用法Bootp描述運(yùn)行 bootp 命令用來(lái)獲取 HOST 主機(jī)發(fā)送的 BOOTP 的數(shù)據(jù)包,解析BOOTP 的數(shù)據(jù)包,獲取本機(jī)的 IP 地址tftp用法Tftp 文件名 address/loader/kernel/root/ramdisk描述通過(guò)以太網(wǎng)下載主機(jī)的數(shù)據(jù)或文件到目標(biāo)平臺(tái)的 SDRAM參數(shù)文件名 - 主機(jī)平臺(tái)需要傳輸?shù)奈募鹟oader - 把傳輸?shù)侥繕?biāo)平臺(tái)的文件放置
41、在 SDRAM 的 loader 區(qū)域kernel - 把傳輸?shù)侥繕?biāo)平臺(tái)的文件放置在 SDRAM 的 kernel 區(qū)域root - 把傳輸?shù)侥繕?biāo)平臺(tái)的文件放置在 SDRAM 的 root 區(qū)域ramdisk - 把傳輸?shù)侥繕?biāo)平臺(tái)的文件放置在 SDRAM 的 ramdisk 區(qū)域address - 把傳輸?shù)侥繕?biāo)平臺(tái)的文件放置在 SDRAM 的指定地址舉例Bboot tftp zImage kernelflash用法Flash loader/kernel/root/ramdisk描述把 SDRAM 中的數(shù)據(jù)燒錄到 FLASH 中特定的地址參數(shù)loader - 把 SDRAM 中的數(shù)據(jù)燒錄到 FL
42、ASH 中的 loader 區(qū)域kernel 把 SDRAM 中的數(shù)據(jù)燒錄到 FALSH 中的 kernel 區(qū)域root 把 SDRAM 中的數(shù)據(jù)燒錄到 FLASH 中的 root 區(qū)域ramdisk 把 SDRAM 中的數(shù)據(jù)燒錄到 FLASH 中的 ramdisk 的區(qū)域舉例Bboot flash kernelerase用法erase loader/kernel/ramdisk/root描述擦除 FALSH 中的相應(yīng)區(qū)域參數(shù)loader 擦除 FALSH 中 loder 區(qū)域kernel 擦除 FLASH 中的 kernel 區(qū)域root 擦除 FLASH 中的 root 區(qū)域ramdis
43、k 擦除 FLASH 中的 ramdisk 區(qū)域舉例bboot erase kernel 實(shí)驗(yàn)六實(shí)驗(yàn)六 LinuxLinux 內(nèi)核編譯實(shí)驗(yàn)內(nèi)核編譯實(shí)驗(yàn)【實(shí)驗(yàn)?zāi)康摹?、了解 Linux 內(nèi)核源代碼的目錄結(jié)構(gòu)及各目錄的相關(guān)內(nèi)容2、了解 Linux 內(nèi)核各配置選項(xiàng)內(nèi)容和作用3、掌握 Linux 內(nèi)核配置文件 config.in 的作用4、掌握 Linux 內(nèi)核的編譯過(guò)程5、掌握將新增內(nèi)核代碼加入到 Linux 內(nèi)核結(jié)構(gòu)中的方法【實(shí)驗(yàn)原理】1內(nèi)核源代碼目錄介紹Linux 內(nèi)核源代碼可以從網(wǎng)上下載(/pub/linux/v2.4) 。一般主機(jī)平臺(tái)的 Linux (
44、如紅旗 Linux)源代碼在根目錄下的/usr/src/linux 目錄下。內(nèi)核源代碼的文件按樹(shù)形結(jié) 構(gòu)進(jìn)行組織的,在源代碼樹(shù)最上層的可以看到如下的一些目錄:(1) 、arch:arch 子目錄包括所有與體系結(jié)構(gòu)相關(guān)的內(nèi)核代碼。arch 的每一個(gè)子目錄都 代表一個(gè) Linux 所支持的體系結(jié)構(gòu)。例如:arm 目錄下就是 arm 體系架構(gòu)的處理器目錄,包 含我們使用的 PXA 處理器。(2) 、include:include 子目錄包括編譯內(nèi)核所需要的頭文件。與 ARM 相關(guān)的頭文件 在 include/asm-arm 子目錄下。(3) 、init:這個(gè)目錄包含內(nèi)核的初始化代碼,但不是系統(tǒng)的引導(dǎo)
45、代碼,其中所包含 main.c和 Version.c 文件是研究 Linux 內(nèi)核的起點(diǎn)。(4) 、mm:該目錄包含所有獨(dú)立于 CPU 體系結(jié)構(gòu)的內(nèi)存管理代碼,如頁(yè)式存儲(chǔ)管理 內(nèi)存的分配和釋放等。與 ARM 體系結(jié)構(gòu)相關(guān)的代碼在 arch/arm/mm 中。(5) 、Kernel:這里包括主要的內(nèi)核代碼,此目錄下的文件實(shí)現(xiàn)大多數(shù) Linux 的內(nèi)核函 數(shù),其中最重要的文件是 sched.c。與 Xscale 體系結(jié)構(gòu)相關(guān)的代碼在 arch/arm-pxa/kernel 目錄 中。(6) 、Drives:此目錄存放系統(tǒng)所有的設(shè)備驅(qū)動(dòng)程序,每種驅(qū)動(dòng)程序各占一個(gè)子目錄。(a) 、/block:塊設(shè)備
46、驅(qū)動(dòng)程序。塊設(shè)備包括 IDE 和 scsi 設(shè)備。(b) 、/char:字符設(shè)備驅(qū)動(dòng)程序。如串口、鼠標(biāo)等。(c) 、/cdrom:包含 Linux 所有的 CD-ROM 代碼。(d) 、/pci:PCI 卡驅(qū)動(dòng)程序代碼,包含 PCI 子系統(tǒng)映射和初始化代碼等。(e) 、/scsi:包含所有的 SCSI 代碼以及 Linux 所支持的所有的 SCSI 設(shè)備驅(qū)動(dòng)程序代碼。(f) 、/net:網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序。(g) 、/sound:聲卡設(shè)備驅(qū)動(dòng)程序。(7) 、lib 目錄放置內(nèi)核的庫(kù)代碼;(8) 、net 目錄包含內(nèi)核與網(wǎng)絡(luò)的相關(guān)的代碼;(9) 、ipc 目錄包含內(nèi)核進(jìn)程通信的代碼;(10) 、f
47、s 目錄是所有的文件系統(tǒng)代碼和各種類型的文件操作代碼,它的每一個(gè)子目錄支持一個(gè)文件系統(tǒng),如 JFFS2;(11) 、scripts 目錄包含用于配置內(nèi)核的腳本文件等。每個(gè)目錄下一般都有 depend 文件 和一個(gè) makefile 文件,他們是編譯時(shí)使用的輔助文件,仔細(xì)閱讀這兩個(gè)文件對(duì)弄清各個(gè)文件 之間的相互依托關(guān)系很有幫助。2內(nèi)核的配置的基本結(jié)構(gòu)Linux 內(nèi)核的配置系統(tǒng)由四個(gè)部分組成(1) 、Makefile:分布在 Linux 內(nèi)核源碼中的 Makefile,定義 Linux 內(nèi)核的編譯規(guī)則;頂層 Makefile 是整個(gè)內(nèi)核配置、編譯的總體控制文件;(2) 、配置文件(config.i
48、n):給用戶提供配置選擇的功能;.config:內(nèi)核配置文件,包 括由用戶選擇的配置選項(xiàng),用來(lái)存放內(nèi)核配置后的結(jié)果;(3) 、配置工具:包括對(duì)配置腳本中使用的配置命令進(jìn)行解釋的配置命令解釋器和配置 用戶界面(基于字符界面:make config;基于 Ncurses 圖形界面:make menuconfig;基于 xWindows 圖形界面:make xconfig)(4) 、Rules.make:規(guī)則文件,被所有的 Makefile 使用。3編譯內(nèi)核的常用命令精簡(jiǎn) Linux 內(nèi)核常用命令包括:Make Config,dep,clean,mrproper,zImage,bzImage,Mod
49、ules,Modules_Install(1) 、Make config:內(nèi)核配置,調(diào)用./scripts/Configure 按照 arch/i386/config.in 來(lái)進(jìn)行 配置。命令執(zhí)行后產(chǎn)生文件.config,其中保存著配置信息。下次在做 make config 時(shí)將產(chǎn)生 新的.config 文件,原文件 config 更名為 config.old(2)、 make dep:尋找依存關(guān)系。產(chǎn)生兩個(gè)文件. depend 和.hdepend,其中.hdepend 表 示每個(gè).h 文件都包含其他哪些嵌入文件。而.depend 文件有多個(gè),在每個(gè)會(huì)產(chǎn)生目標(biāo)文件(.o) 文件的目錄下均有,它
50、表示每個(gè)目標(biāo)文件都依賴于哪些嵌入文件(.h)(3)、make clean:清除以前構(gòu)核所產(chǎn)生的所有的目標(biāo)文件,模塊文件,核心以及一些臨時(shí)文件等,不產(chǎn)生任何文件(4)、 make rmproper:刪除所有以前在構(gòu)核過(guò)程所產(chǎn)生的所有文件,及除了做 make clean 外,還要?jiǎng)h除.config,.depend 等文件,把核心源碼恢復(fù)到最原始的狀態(tài)。下次構(gòu)核時(shí)必須進(jìn)行重新配置;(5)、make,make zImage, make bzImage:(a) 、make:構(gòu)核。通過(guò)各目錄的 Makefile 文件進(jìn)行,會(huì)在各個(gè)目錄下產(chǎn)生一大堆目 標(biāo)文件,如核心代碼沒(méi)有錯(cuò)誤,將產(chǎn)生文件 vmlinux,
51、這就是所構(gòu)的核心。并產(chǎn)生映像文件 system.map 通過(guò)各目錄的 makefile 文件進(jìn)行。.version 文件中的數(shù)加 1,表示版本號(hào)的變化。(b)、makezImage:在make的基礎(chǔ)上產(chǎn)生壓縮的核心映像文件./arch/$(ARCH)/boot/zImage以及./arch/$(ARCH)/boot/compressed 目錄下產(chǎn)生一些臨時(shí)文件。(c)、make bzImage:在 make 的基礎(chǔ)上產(chǎn)生壓縮比例更大的核心映像文件./arch/$(ARCH)/ boot/bzImage 以及./arch/$(ARCH)/boot/compressed 目錄下產(chǎn)生一些臨時(shí)文件。4
52、內(nèi)核編譯過(guò)程(1)make mrproper:刪除所有以前在構(gòu)核過(guò)程所產(chǎn)生的所有文件(2)make menuconfig:內(nèi)核配置(3)make dep:尋找依存關(guān)系(4)make zImage:產(chǎn)生壓縮的核心映像文件內(nèi)核編譯完畢之后,生成 zImage 內(nèi)核映象文件保存在源代碼的 arch/arm/boot/目錄下。5內(nèi)核配置項(xiàng)介紹首先切換 linux 源代碼所在的目錄,并終端輸入 make menuconfig,系統(tǒng)彈出基于 Ncurses 內(nèi)核配置圖形界面,便可進(jìn)行內(nèi)核選項(xiàng)的配置。root$make menuconfig6添加驅(qū)動(dòng)到 linux 內(nèi)核對(duì)于一個(gè)開(kāi)發(fā)者來(lái)說(shuō),將自己開(kāi)發(fā)的內(nèi)核代
53、碼添加到 Linux 內(nèi)核中,需要有三個(gè)步驟。(1)確定把自己的開(kāi)發(fā)代碼放入到內(nèi)核的位置;(2)把自己開(kāi)發(fā)的功能增加到 Linux 內(nèi)核的配置選項(xiàng)中,使用戶能夠選擇此功能;(3)構(gòu)建子目錄 Makefile,根據(jù)用戶的選擇,將相應(yīng)的代碼編譯 Linux 內(nèi)核中。【實(shí)驗(yàn)儀器】1、裝有 Linux 操作系統(tǒng)的 PC 機(jī)一臺(tái);2、XSBase270 或 XSBase255 ARM 實(shí)驗(yàn)開(kāi)發(fā)平臺(tái)一套【實(shí)驗(yàn)內(nèi)容】(1)利用光盤(pán)上提供的 Linux 源代碼,具體分析遞歸性 makefile 的結(jié)構(gòu),畫(huà)出一個(gè)從最頂層 makefile 到最底層所經(jīng)過(guò)的文件路徑和所需要的變量。(2)利用光盤(pán)上提供的 Linu
54、x 源代碼,寫(xiě)出編譯 Linux 內(nèi)核的具體過(guò)程。(3)利用光盤(pán)上提供的 Linux 源代碼,然后用 make menuconfig 命令對(duì)內(nèi)核的配置進(jìn)行修改,記下具體修改的配置選項(xiàng)并保存退出,然后用 diff 命令比較.config 和.oldconfig.old 兩個(gè)新舊配置的差別,同時(shí)與記下的配置選項(xiàng)進(jìn)行比較,根據(jù)比較結(jié)果,寫(xiě)出你的結(jié)論。實(shí)驗(yàn)七實(shí)驗(yàn)七 驅(qū)動(dòng)程序結(jié)構(gòu)實(shí)驗(yàn)驅(qū)動(dòng)程序結(jié)構(gòu)實(shí)驗(yàn)實(shí)驗(yàn)?zāi)康?、了解Linux 驅(qū)動(dòng)程序的結(jié)構(gòu)2、掌握Linux 驅(qū)動(dòng)程序常用結(jié)構(gòu)體和操作函數(shù)的使用方法3、初步掌握Linux 驅(qū)動(dòng)程序的編寫(xiě)方法及過(guò)程4、掌握Linux 驅(qū)動(dòng)程序的加載方法實(shí)驗(yàn)原理1驅(qū)動(dòng)程序介紹
55、驅(qū)動(dòng)程序負(fù)責(zé)將應(yīng)用程序如讀、寫(xiě)等操作正確無(wú)誤的傳遞給相關(guān)的硬件,并使硬件能夠做出正確反應(yīng)的代碼。驅(qū)動(dòng)程序像一個(gè)黑盒子,它隱藏了硬件的工作細(xì)節(jié),應(yīng)用程序只需要通過(guò)一組標(biāo)準(zhǔn)化的接口實(shí)現(xiàn)對(duì)硬件的操作。2Linux設(shè)備驅(qū)動(dòng)程序分類Linux 設(shè)備驅(qū)動(dòng)程序在Linux 的內(nèi)核源代碼中占有很大的比例,源代碼的長(zhǎng)度日益增加,主要是驅(qū)動(dòng)程序的增加。雖然Linux 內(nèi)核的不斷升級(jí),但驅(qū)動(dòng)程序的結(jié)構(gòu)還是相對(duì)穩(wěn)定。Linux 系統(tǒng)的設(shè)備分為字符設(shè)備(char device),塊設(shè)備(block device)和網(wǎng)絡(luò)設(shè)備(network device)三種。字符設(shè)備是指在存取時(shí)沒(méi)有緩存的設(shè)備,而塊設(shè)備的讀寫(xiě)都有緩存來(lái)
56、支持,并且塊設(shè)備必須能夠隨機(jī)存取(random access)。典型的字符設(shè)備包括鼠標(biāo),鍵盤(pán),串行口等。塊設(shè)備主要包括硬盤(pán)軟盤(pán)設(shè)備,CD-ROM等。網(wǎng)絡(luò)設(shè)備在Linux 里做專門(mén)的處理。Linux 的網(wǎng)絡(luò)系統(tǒng)主要是基于BSD unix 的socket 機(jī)制。在系統(tǒng)和驅(qū)動(dòng)程序之間定義有專門(mén)的數(shù)據(jù)結(jié)構(gòu)(sk_buff)進(jìn)行數(shù)據(jù)傳遞。系統(tǒng)有支持對(duì)發(fā)送數(shù)據(jù)和接收數(shù)據(jù)的緩存,提供流量控制機(jī)制,提供對(duì)多協(xié)議的支持。3驅(qū)動(dòng)程序的結(jié)構(gòu)應(yīng)用程序經(jīng)過(guò)系統(tǒng)調(diào)用,進(jìn)入核心層,內(nèi)核要控制硬件需要通過(guò)驅(qū)動(dòng)程序?qū)崿F(xiàn),驅(qū)動(dòng)程序相當(dāng)于內(nèi)核與硬件之間的“系統(tǒng)調(diào)用”。內(nèi)核模塊內(nèi)核模塊是Linux 內(nèi)核的重要組成要素,內(nèi)核模塊能在L
57、inux系統(tǒng)啟動(dòng)之后能夠動(dòng)態(tài)進(jìn)行裝載和卸載,因此不需對(duì)內(nèi)核進(jìn)行重新編譯或重啟系統(tǒng)就可將內(nèi)核的一部分替換掉,Linux 內(nèi)核的所有設(shè)備驅(qū)動(dòng),文件系統(tǒng),網(wǎng)絡(luò)協(xié)議等可做成模塊的形式來(lái)提供。在所有的模塊中需記錄編譯的內(nèi)核版本信息,并與當(dāng)前執(zhí)行的內(nèi)核版本一致。即,模塊具有版本依賴性,如果不一樣就會(huì)出錯(cuò),當(dāng)然可以在模塊程序中的include之前通過(guò)宏定義#define_NO_VERSION_表明不定義模塊的版本信息。內(nèi)核模塊程序與一般應(yīng)用程序之間主要不同之處是,模塊程序沒(méi)有main()函數(shù),模塊程序在裝載時(shí)調(diào)用init_module(void)函數(shù)添加到內(nèi)核中,在卸載時(shí)調(diào)用voidcleanup_modu
58、le( )函數(shù)從內(nèi)核中卸載。另外一個(gè)應(yīng)用程序從頭到尾只執(zhí)行一個(gè)任務(wù),但一個(gè)模塊可以把響應(yīng)未來(lái)請(qǐng)求的事務(wù)登記到內(nèi)核中,然后等待系統(tǒng)調(diào)用。init_module( ) register_capability( )printk( ). . . . .cleanup_module( ) unregister_capability( )insmodrmmodModule Kernelcapabilities圖 7-2內(nèi)核模塊程序結(jié)構(gòu)4主、從設(shè)備號(hào)應(yīng)用程序通過(guò)設(shè)備文件系統(tǒng)(devfs)的名字(或節(jié)點(diǎn))訪問(wèn)硬件設(shè)備,所有的設(shè)備節(jié)點(diǎn)在/dev目錄下。利用mknod命令生成設(shè)備文件系統(tǒng)的節(jié)點(diǎn),但只有超級(jí)用戶才能
59、生成設(shè)備文。Mknod 命令必須要有設(shè)備名和設(shè)備類型,主設(shè)備號(hào)(Major Number),次設(shè)備號(hào)(Minor Number)等3 個(gè)參 數(shù)。主設(shè)備號(hào)用于內(nèi)核區(qū)分設(shè)備驅(qū)動(dòng),次設(shè)備號(hào)用于設(shè)備驅(qū)動(dòng)區(qū)分設(shè)備。一個(gè)設(shè)備驅(qū)動(dòng)可能控制多個(gè)設(shè)備。新的設(shè)備驅(qū)動(dòng)要有新的主設(shè)備號(hào)。在內(nèi)核源代碼的Documentation /devices.txt中定義了所有設(shè)備的主設(shè)備號(hào)。在創(chuàng)建設(shè)備的時(shí)候不要與常用的設(shè)備好沖突。下面/dev/hda1 是設(shè)備名,b 表示block設(shè)備(c表示字符設(shè)備)。127是主設(shè)備號(hào),1是次設(shè)備號(hào)。次設(shè)備號(hào)可以是0 255 之間的值,限制為8bit。rootlocalhost$ mknod
60、/dev/hda1 b 127 1rootlocalhost$ ls al /dev/hda1rootlocalhost$ brw-rw- 1 root disk 3 1 Mar 25 12:00 /dev/hda15驅(qū)動(dòng)程序基本框架如果采用模塊方式編寫(xiě)設(shè)備驅(qū)動(dòng)程序時(shí),通常至少要實(shí)現(xiàn)設(shè)備初始化模塊、設(shè)備打開(kāi)模塊、數(shù)據(jù)讀寫(xiě)與控制模塊、中斷處理模塊(有的驅(qū)動(dòng)程序沒(méi)有)、設(shè)備釋放模塊和設(shè)備卸載模塊等幾個(gè)部分。下面給出一個(gè)典型的設(shè)備驅(qū)動(dòng)程序的基本框架。,從中不難體會(huì)到這幾個(gè)關(guān)鍵部分是如何組織起來(lái)的。/* 打開(kāi)設(shè)備模塊 */static int xxx_open(struct inode *inode, struct file *file
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年心腦血管事件監(jiān)測(cè)培訓(xùn)
- 養(yǎng)老護(hù)理中的輪椅使用
- 災(zāi)害安全知識(shí)教育
- 礦山自救互救培訓(xùn)
- 住院醫(yī)師規(guī)范化培訓(xùn)教學(xué)病例討論教案指南
- 家居品類直播培訓(xùn)
- 下肢血栓的預(yù)防及護(hù)理
- 重癥肺炎血壓管理指南
- 公司基本禮儀培訓(xùn)
- 內(nèi)分泌內(nèi)科問(wèn)診要點(diǎn)與流程
- 2023-2024學(xué)年福建省泉州市小學(xué)語(yǔ)文六年級(jí)期末自測(cè)模擬試卷
- 《中越傳統(tǒng)節(jié)日對(duì)比問(wèn)題研究5100字【論文】》
- GB 29541-2013熱泵熱水機(jī)(器)能效限定值及能效等級(jí)
- 控規(guī)用地代碼
- 2023年上杭縣社區(qū)工作者招聘考試筆試題庫(kù)及答案解析
- 2021年曹楊二中自招數(shù)學(xué)試卷
- 中國(guó)近現(xiàn)代史綱要超星爾雅答案貴州大學(xué)-
- 新能源汽車(chē)底盤(pán)檢修全套課件
- 幼兒園大班數(shù)學(xué)口算練習(xí)題可打印
- 江蘇特種作業(yè)人員體檢表
- 堡壘主機(jī)用戶操作手冊(cè)運(yùn)維管理
評(píng)論
0/150
提交評(píng)論