《嵌入式操作系統(tǒng)》2013年實驗指導書_第1頁
《嵌入式操作系統(tǒng)》2013年實驗指導書_第2頁
《嵌入式操作系統(tǒng)》2013年實驗指導書_第3頁
《嵌入式操作系統(tǒng)》2013年實驗指導書_第4頁
《嵌入式操作系統(tǒng)》2013年實驗指導書_第5頁
已閱讀5頁,還剩20頁未讀 繼續(xù)免費閱讀

付費下載

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)實驗指導書計算機科學與信息工程學院2012 年 9 月 3 日目錄目錄實驗一實驗一 系統(tǒng)引導實驗系統(tǒng)引導實驗.1實驗二實驗二 IRQ 中斷處理中斷處理 .3實驗三實驗三 LINUX 常用命令及工具實驗常用命令及工具實驗.7實驗四實驗四 MAKEFILE 實驗實驗.9實驗五實驗五 BOOTLOADER 實驗實驗 .13實驗六實驗六 LINUX 內(nèi)核編譯實驗內(nèi)核編譯實驗.16實驗七實驗七 驅(qū)動程序結(jié)構(gòu)實驗驅(qū)動程序結(jié)構(gòu)實驗.19實驗一實驗一 系統(tǒng)引導實驗系統(tǒng)引導實驗【實驗?zāi)康摹?.了解 PXA270 處理器功能結(jié)構(gòu)2.了解系統(tǒng)的基本硬件組成1.了解 ARM 指令集2.掌握

2、嵌入式系統(tǒng)的一般引導規(guī)律3.掌握常見 ARM 開發(fā)工具軟件的使用【實驗儀器】PC 機一臺,ARM10 試驗箱一套,以及必要的軟件安裝包【實驗原理】1、程序介紹本章主要通過一個簡短的 Boot 程序向讀者揭示如何編寫開發(fā)板的啟動程序,同時本程序也可以用來引導其他章節(jié)的示例程序。本程序主要為了讓讀者能夠清晰了解系統(tǒng)復位后如何從 0 x0 開始引導。本引導程序驅(qū)動底板上的八盞 LED 就會向右點亮,不斷循環(huán)下去。2、系統(tǒng)復位對于 PXA270 處理器來說,系統(tǒng)復位后的 PC 指針總是為 0 x0,以本開發(fā)板來說,片選信號 nCS0所連接的為 FLASH 芯片,boot 程序應(yīng)該被燒寫到該 FLASH

3、 芯片上,且第一條指令應(yīng)該放在 0 x0 的地址(注意并不是所有的處理器都從地址 0 x0 開始運行,有些處理器是從 0 xFFFF0 開始運行的) 。事實上,地址 0 x00 x20 之間為中斷向量表,地址 0 x0 為復位中斷例程的入口點,即通過在 0 x0 放一條無條件跳轉(zhuǎn)語句,在系統(tǒng)加電或復位時,在地址 0 x0開始跳轉(zhuǎn),從復位中斷例程開始運行下去。3、程序進入點因為引導程序是自舉的的程序,無需操作系統(tǒng)加載來執(zhí)行,所以即使不設(shè)置初始入口點也可以執(zhí)行,但這里是有必要對程序進入點進行描述。我們可以將 Boot 程序看成是普通的映像文件,假設(shè)我們現(xiàn)在已經(jīng)生成了映像文件,當 Boot 映像被操

4、作系統(tǒng)加載時,如何決定映像被執(zhí)行的第一條指令呢?這里引入初始入口點和普通入口點。初始化入口點定義了映像的第一條被執(zhí)行的指令,在編譯程序時可以添加參數(shù)entry address(或entry offset+object(area) )來標示初始入口點,如果沒有添加該參數(shù),只要源程序中有唯一的偽操作 ENTRY,則程序就被默認成初始入口點。即當鏡像被燒入 FLASH后,以 ro_base 屬性決定的映像位置的第一條指令就是被定義在 ENTRY 標示的段的第一條指令,讀者可能對此有些模糊,我們這里以給定的程序來分析。在 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這小段代碼標示了一個名叫 boot 的代碼段,屬性為只讀,而 ENTRY 本來只表示為一個普通入口點,但在 Boot 代碼中,因為只使用一次 ENTRY,所以 ENTRY 就被定義為初始化入口點,這里并不是要求所有的源程序中只能使用一次 ENTRY,相反可以多次使用 ENTRY 來標示普通入口點,但多次使用 ENTR

6、Y 后,就無法讓系統(tǒng)知道鏡像的第一條執(zhí)行的指令在哪里,就必須在編譯時增加entry address 參數(shù)。讀者可以嘗試一下代碼中都不使用 ENTRY 或多次使用 ENTRY 會發(fā)生什么現(xiàn)象?;氐缴厦娴拇a中,我們發(fā)現(xiàn)偽操作 ENTRY 下有一條無條件跳轉(zhuǎn)指令 B,由于 AREA 和 ENTRY 都是偽操作,在不分配成實質(zhì)的指令,所以,程序的第一條會被執(zhí)行的指令就是 B 指令,作為 Boot 代碼,初始入口點是不起作用的,因為它無需被加載而運行,初始入口點保存在 ELF 頭文件中,該值可被操作系統(tǒng)讀取而跳轉(zhuǎn)到初始入口點執(zhí)行?!緦嶒瀮?nèi)容】1、分析代碼結(jié)合以上說明,對本實驗所提供的匯編源代碼進行分析

7、,深入理解針對具體的硬件實現(xiàn),軟件是如何配合工作的。2、程序的編譯和下載打開 ADS,執(zhí)行 ProjectMake ,也可以直接用快捷鍵 F7 進行編譯、連接生成映像文件。如圖所示:3、觀察系統(tǒng)運行情況,對系統(tǒng)進行源碼調(diào)試?!玖曨}與思考題】1、簡述 ELF 文件的內(nèi)部層次結(jié)構(gòu)。2、簡述連接器的 4 個參數(shù)ro_base,rw_base,first,entry 的意義。3、簡述初始化入口點和普通入口點的區(qū)別,分別用在什么場合。實驗二實驗二 IRQIRQ 中斷處理中斷處理【實驗?zāi)康摹?學習編寫中斷處理程序【實驗原理】1、程序介紹本章例子主要使用按鍵實現(xiàn)外部中斷,執(zhí)行中斷服務(wù)子程序。系統(tǒng)啟動后,按

8、12345678任意鍵,相應(yīng)的八段數(shù)碼管就會點亮。2、中斷向量表當異常中斷發(fā)生時,系統(tǒng)執(zhí)行完當前指令后,將跳轉(zhuǎn)到相應(yīng)的異常中斷處理程序處執(zhí)行。處理器能夠準確無誤地響應(yīng)中斷,是因為 ARM 體系結(jié)構(gòu)里有一個中斷向量表,該中斷向量表將系統(tǒng)能夠響應(yīng)的7 種異常中斷類型的“入口地址”登記在一塊連續(xù)的字節(jié)空間內(nèi),每種異常中斷的“入口地址”占據(jù) 4 個字節(jié),這里“入口地址”實質(zhì)是一些跳轉(zhuǎn)指令或者是讓 PC 指針賦值的指令,通常使用 B 或 ldr 指令。簡單地說,異常中斷發(fā)生首先會跳轉(zhuǎn)到中斷向量表,此時跳轉(zhuǎn)的位置會由系統(tǒng)根據(jù)中斷類型來判斷,由于中斷向量表實質(zhì)也是跳轉(zhuǎn)指令所組成的指令序列,所以系統(tǒng)會再進行一

9、次跳轉(zhuǎn),這次跳轉(zhuǎn)便跳到中斷處理程序(中斷服務(wù)例程)的入口。從第一章開始,讀者在學習 Boot 程序的編寫時便開始接觸中斷向量表,Boot 程序的第一條指令 b post 就是中斷向量表里的第一個單元空間(4 個字節(jié)) ,這個單元空間是用作處理復位異常中斷。由于一條 B 和 Ldr 指令就是 32 位的指令,即占 4 個字節(jié),所以整個中斷向量表可以是如下形式: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 指令來實現(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)范圍,對于 B 指令,可以跳轉(zhuǎn)的范圍為-32MB 32MB,而 LDR 則可以將一個 32 位常數(shù)和地址值讀取到 PC 寄存器中,適合于大范圍的跳轉(zhuǎn)。中斷向量表是定位在 0 x0 到 0 x20 之間,從編程的角度來看,用戶需要對中斷向量表在可執(zhí)行映像中的位置進行定位,即必須將包含中斷向量表的 AREA 定位在映像中的最開始位置,而且,該映像必須燒寫在ROM 空間 0 x0 的開始位置上。3、IRQ 和 FIQ 中斷開關(guān)系統(tǒng)復

12、位后,IRQ 和 FIQ 中斷都是被禁止的,所以即使建立了中斷向量表,當有中斷請求也是不會響應(yīng)的,因此在系統(tǒng)復位后,必須通過程序控制來打開 IRQ 和 FIQ 中斷。IRQ 和 FIQ 的控制位分別是當前程序狀態(tài)寄存器 CPSR 的第 7 和第 6 位,對這兩個控制位的修改是不能直接地通過對 CPSR 進行操作,而是首先通過讀取 CPSR 到通用寄存器中,然后修改,再寫入到 CPSR 里。讀取狀態(tài)寄存器到通用寄存器可以通過 MRS 指令,將通用寄存器的值寫入到狀態(tài)寄存器可以通過MSR。這里假設(shè)開啟 IRQ 和 FIQ 中斷,程序如下:MRS R0,CPSRAND R0,R0,0 x3FMSR

13、CPSR_C, R0CPSR_C 表示 CPSR7:0控制位域,將 CPSR7和 CPSR6清零便可以開啟 IRQ 和 FIQ 中斷處理。通過這一步設(shè)置,只是打開了 IRQ 和 FIQ 中斷的總開關(guān),而且,對于 ARM 體系結(jié)構(gòu)的 CPU 都是必須的。IRQ 和 FIQ 對應(yīng)于中斷向量表的不同位置,同時,F(xiàn)IQ 叫快速中斷模式,它的優(yōu)先級比 IRQ 高,執(zhí)行 FIQ 中斷處理可以無需跳轉(zhuǎn)到中斷服務(wù)例程,因為 FIQ 位于中斷向量表的最末位置,故 FIQ 中斷服務(wù)例程可以直接安排在 0 x1c 開始的位置,所以 FIQ 可以對中斷請求實行快速的響應(yīng)。 對中斷源的具體操作還需對集成在處理器內(nèi)部的中

14、斷控制器進行配置,不同型號的處理器里的中斷控制器略有不同,這里只針對 Intel PXA270 進行討論。4、中斷控制器Intel PXA270 內(nèi)部集成了中斷處理器,該處理器能對 23 個中斷源進行操作,這種操作包括:通過設(shè)置寄存器 ICMR 屏蔽中斷源。通過設(shè)置寄存器 ICLR 對中斷源分類,即可以讓中斷源發(fā)出的中斷請求以 IRQ 中斷方式或以 FIQ 中斷方式被處理??梢圆樵兗拇嫫?ICPR 得知 23 個中斷源當前是否有中斷請求,在 ICPR 寄存器上顯示發(fā)出中斷請求的中斷源不受 ICMR 影響,即 ICMR 即使屏蔽某個中斷源,只要中斷源發(fā)出中斷請求,ICPR 仍然會在相應(yīng)的位上顯示

15、“1” ??梢圆樵兗拇嫫?ICIP 得知以 IRQ 方式被處理的中斷源是否發(fā)出中斷請求,該寄存器受到 ICMP 影響。即 ICIP ICPR & ICMR & (ICLR) ??梢圆樵兗拇嫫?ICFP 得知以 FIQ 方式被處理的中斷源是否發(fā)出中斷請求,該寄存器受到 ICMP 影響。即 ICFP ICPR & ICMR & ICLR。5、中斷控制寄存器中斷控制寄存器包括 6 個寄存器,它們分別是:Interrupt Controller Mask register (ICMR):該寄存器能夠屏蔽中斷源,寄存器上每 1 位對應(yīng)一個中斷源,只要在相應(yīng)的位上設(shè)置 0,

16、就能屏蔽響應(yīng)的中斷。系統(tǒng)復位后,該寄存器全為 0,即所有的中斷源都被屏蔽。Interrupt Controller Pending register (ICPR):該寄存器是一個只讀的 32 位寄存器,它顯示了所有發(fā)出中斷請求的中斷源。ICPR 不受寄存器 ICMP 影響,即只要中斷源發(fā)出中斷請求,即使 ICMP 屏蔽了中斷源,都會在 ICPR 相應(yīng)的位上顯示。Interrupt Controller Level register (ICLR):該寄存器能夠決定中斷源以 IRQ 或 FIQ 中斷方式被處理。只要中斷源沒有被屏蔽,設(shè)置該寄存器后,如果是以 IRQ 中斷方式被處理,則 ICIR 相

17、應(yīng)位會置 1,如果是以 FIQ 中斷方式被處理,則 ICFR 相應(yīng)位會置 1。系統(tǒng)復位后該寄存器全為 0,則表示所有的中斷源都以 IRQ 方式被處理。Interrupt Controller IRQ Pending register (ICIP):該寄存器是只讀的 32 位寄存器,它顯示所有沒有被屏蔽,且以 IRQ 方式請求的中斷源。Interrupt Controller FIQ Pending register (ICFP):該寄存器是只讀的 32 位寄存器,它顯示所有沒有被屏蔽,且以 FIQ 方式請求的中斷源。Interrupt Controller Control register (

18、ICCR):該寄存器只包括一個簡單的控制位ICCRDIM。當處理器處于“IDLE”模式時,如果該控制位被設(shè)為 1,只有非屏蔽的可用中斷源才能將處理器從“IDLE”模式中喚醒。否則,即使屏蔽了中斷源,所有的中斷源仍可以將處理器喚醒。6、中斷控制器的使用在系統(tǒng)初始化的時候,除了要完成打開 IRQ 和 FIQ 中斷開關(guān),還要對中斷控制器進行設(shè)置。假設(shè)要開啟鍵盤中斷,并以 IRQ 的方式被處理,設(shè)置以下符號:;Interrupt ControllerICMR EQU 0 x40d00004init_ICMR EQU 0 x00000010開啟中斷源,設(shè)置屏蔽寄存器 ICMPldr r1, =ICMRl

19、dr r2, =init_ICMRstr r2,r1在 ICMR 里,KEYPAD 代表鍵盤中斷,鍵盤的中斷的位是第 5 位。在這位上設(shè) 1,則允許這些中斷源請求。在中斷服務(wù)例程中查詢中斷源請求狀態(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、序通過對 ICIR 的 5 個狀態(tài)位進行輪詢,當某一位為 1 時,則表示中斷源已經(jīng)發(fā)出了中斷請求,然后則跳轉(zhuǎn)到 interruptIdentify 運行。如果該 5 個中斷源沒有被屏蔽,且都以 IRQ 方式處理,則輪詢寄存器 ICPR 的效果與 ICIP 是一樣的。7、IRQ 異常中斷的響應(yīng)過程處理器響應(yīng) IRQ 異常中斷時,在執(zhí)行中斷服務(wù)例程的第一條指令前,處理器會自動完成以下操作:保存返回地址:R14_IRQ = 下一條將要執(zhí)行的指令的地址4 個字節(jié)保存當前狀態(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)指令,故程序會跳轉(zhuǎn)到 IRQ 中斷服務(wù)例程。這里需要強調(diào),在 IRQ 中斷服務(wù)例程里,處理器的運行模式已經(jīng)改變?yōu)橥獠恐袛嗄J?,因此?R13 和R14,SPSR 的操作實質(zhì)是外部中斷模式(IRQ)下的 R13 和 R14,SPSR,例如,mov pc,r14,這里操作結(jié)果是將 R14_IRQ 的值賦予 PC 指針寄存器。讀者在編寫服務(wù)例程時,唯一需要注意的是保存現(xiàn)場,包括保存 CPSR,服務(wù)例程里所使用的寄存器,返回地址,由于 CPSR

22、 和返回地址在進入中斷服務(wù)例程前都已經(jīng)由處理器自動保存。所以,服務(wù)例程的一般形式可以如下AREA IRQ_Handler,CODE, READONLYSUB LR,LR,4STMFD SP!,寄存器列表,LR.程序主體.LDMFD SP!,寄存器列表,PCEND以上程序?qū)⒎祷氐刂窚p 4 個字節(jié)的原因是因為執(zhí)行完當前指令后,準備執(zhí)行異常中斷處理時,處理器已經(jīng)預(yù)取了 2 個指令,而正確的返回地址應(yīng)該是預(yù)取后的 PC 地址減 4 個字節(jié)。再次將LR(R14_IRQ,返回地址)保存在棧中,是為了防止在程序的主體使用 BL 再次跳轉(zhuǎn)時將保存在 LR寄存器的中斷返回地址沖失。最后使用的指令 LDMFD 恢

23、復寄存器原來的數(shù)值,標識符表示將SPSR_IRQ 寄存器內(nèi)容復制到當前程序狀態(tài)寄存器 CPSR 中,那么 CPU 的處理器模式恢復為原來的模式,并且也打開了 IRQ 中斷開關(guān)?!緦嶒瀮?nèi)容】1、分析代碼結(jié)合以上說明,對本實驗所提供的匯編源代碼進行分析,深入理解針對具體的硬件實現(xiàn),軟件是如何配合工作的。2、程序的編譯和下載打開 ADS,執(zhí)行 ProjectMake ,也可以直接用快捷鍵 F7 進行編譯、連接生成映像文件。編譯、連接生成映像編譯、連接后就生成映像文件,我們可以把它下載到 FLASH 或者 SDRAM 運行和調(diào)試。具體辦法請查看文檔-ADS 實驗調(diào)試方法。3、觀察系統(tǒng)運行情況,對系統(tǒng)進

24、行源碼調(diào)試?!玖曨}與思考題】1、ARM 體系結(jié)構(gòu)中有多少種異常中斷,它們分別是在什么情況下發(fā)生,并且它們是如何被組織的。2、查看 ARM 體系結(jié)構(gòu)的資料,結(jié)合本章例子程序,完善中斷向量表,為軟中斷和數(shù)據(jù)訪問中止異常中斷編寫服務(wù)例程,并在程序中適當加入語句令程序產(chǎn)生這兩種中斷。實驗三實驗三 LinuxLinux 常用命令及工具實驗常用命令及工具實驗【實驗?zāi)康摹?.VMWare 軟件的安裝2.VMware 組件工具的安裝和使用3.安裝 RedHat Linux 系統(tǒng)4.熟悉實驗環(huán)境及常用指令的使用5.掌握常用的 Linux 命令的使用和操作方法【實驗儀器】1、PC機一臺2、XSBase270 或

25、XSBase255 ARM 實驗開發(fā)平臺一套3、必要的軟件安裝包【實驗內(nèi)容】1、VMWare 軟件的安裝打開 VMWare 軟件的安裝包,按照提示安裝 VMWare 虛擬機。2、安裝 RedHat Linux 系統(tǒng)Red Hat 是目前最流行的Linux 操作系統(tǒng),也是我們的實驗系統(tǒng)的平臺,因此將以Red Hat Linux 9.0 為例介紹其安裝過程。Red Hat Linux 的安裝方法很多,我們采用的是從CD-ROM 安裝。其安裝光盤共有兩張,第一張可直接從光盤啟動,包含大部分的軟件包和一些安裝工具,第二張光盤則包含許多附加的軟件包。下面是安裝過程和注意事項:1)啟動安裝程序用Linux

26、 的第一張光盤,從光驅(qū)引導啟動系統(tǒng)。進入一個啟動界面,顯示“boot:”提示符,直接回車(enter),選擇圖形模式進行安裝。2)選擇使用的語言3)選擇默認的鍵盤設(shè)置4)選擇默認的鼠標設(shè)置5)設(shè)置安裝類型Red Hat Linux 提供了個人桌面、工作站、服務(wù)器和定制等多種安裝類型,根據(jù)具體情況選擇個人桌面或定制方式。6)進行硬盤分區(qū)對硬盤進行分區(qū)是一件非常危險的工作,若沒有必要的把握,最好先對重要的數(shù)據(jù)進行備份,以防不測。對于IDE 硬盤,Red Hat Linux 的驅(qū)動器標識符為“hdx”,其中“hd”表明分區(qū)所在設(shè)備的類型,這里是指IDE 硬盤?!皒”為盤號(a 為基本盤,b 為基本從

27、屬盤,c 為輔助主盤,d 為輔助從屬盤),“”代表分區(qū),前四個分區(qū)用數(shù)字1 到4 表示,它們是主分區(qū)或擴展分區(qū),從5 開始就是邏輯分區(qū)。對用戶而言無論有幾個分區(qū),分給哪個目錄使用,它歸根結(jié)底就只有一個根目錄,一個獨立且唯一的文件結(jié)構(gòu)。Red Hat Linux 采用了“裝載”的處理方法,將一個分區(qū)和一個目錄聯(lián)系起來,因此每個分區(qū)都是用來組成整個文件系統(tǒng)的一部分。Linux 最少需要兩個分區(qū),一個Linux native(文件)分區(qū),一個Linux swap(交換)分區(qū)。其中Linux native 分區(qū)是存放Linux 系統(tǒng)文件的分區(qū),它只能用EXT2 的分區(qū)類型,在分區(qū)時應(yīng)該將載入點設(shè)置為“

28、/”目錄。SWAP 分區(qū)則用做交換空間,它主要是把主內(nèi)存上暫時不用得數(shù)據(jù)存起來,在需要的時候再調(diào)進內(nèi)存內(nèi)。一般建議分區(qū)方案如下:SWAP 分區(qū):SWAP 分區(qū)至少要等于系統(tǒng)上實際內(nèi)存的容量,一般來說它的大小是內(nèi)存的兩倍。/boot 分區(qū),它包含了操作系統(tǒng)的內(nèi)核和在啟動系統(tǒng)過程中所要用到的文件,建這個分區(qū)是很有必要的,因為目前大多數(shù)的PC 機要受到BIOS 的限制,況且如果有了一個單獨的/boot 啟動分區(qū),即使主要的根分區(qū)出現(xiàn)了問題,計算機依然能夠啟動。這個分區(qū)的大小約在50MB100MB 之間。/分區(qū):這是根目錄掛載的位置。系統(tǒng)運行所需要的其它文件都在該分區(qū)上,這個分區(qū)的大小約在1.7GB5

29、GB 之間。假如是初次安裝Linux 系統(tǒng),你最好選擇自動分區(qū)的方式。當然,如果你對Linux 較為熟悉,也可以用系統(tǒng)配制的硬盤管理工具Disk Druid 來定制所需要的分區(qū),它既可以根據(jù)用戶的要求創(chuàng)建和刪除硬盤分區(qū),還可以為每個分區(qū)管理載入點。7)設(shè)置文件系統(tǒng)為EXT28)配置引導裝載程序選擇LILO 作為引導安裝程序。LILO 可以安裝在:第一硬盤的主引導區(qū)(MBR)或Linux 分區(qū)的引導扇。如果你想使用LILO 來做雙啟動的話,你需要選擇第一種,如果是想用Linux 啟動軟盤或其他系統(tǒng)引導器引導Linux,請選擇第二種方式,即將LILO 安裝在Linux分區(qū)的引導扇區(qū)。9)網(wǎng)絡(luò)配置1

30、0)防火墻配置11)選擇其它支持語言12)時區(qū)配置13)設(shè)置root 密碼14)選擇軟件包組15)籌建引導盤16)配置顯卡(可以參考視頻內(nèi)容進行安裝)3、VMware 組件工具的安裝和使用安裝 VMware 虛擬機中的組件工具,實現(xiàn)文件和 WINXP 的共享。4、掌握常用的 Linux 命令的使用和操作方法Linux 登陸和退出文件命令目錄和層次命令目錄和文件安全性磁盤存儲命令進程命令Vi 編輯文件實驗四實驗四 MakefileMakefile 實驗實驗實驗?zāi)康?、了解Makefile的基本概念和基本結(jié)構(gòu)2、初步掌握編寫簡單Makefile的方法3、了解遞歸Make的編譯過程4、初步掌握利用G

31、NU Make編譯應(yīng)用程序的方法實驗原理2、了解 Makefile 的基本概念和基本結(jié)構(gòu)在 Linux 或 Unix 環(huán)境下,對于只含有幾個源代碼文件的小程序(如 hello.c)的編譯,可以手工鍵入 gcc 命令對源代碼文件逐個進行編譯;然而在大型的項目開發(fā)中,可能涉及幾十到幾百個源文件,采用手工鍵入的方式進行編譯,則非常不方便,而且一旦修改了源代碼,尤其頭文件發(fā)生了的修改,采用手工方式進行編譯和維護的工作量相當大,而且容易出錯。所以在 Linux 或 Unix 環(huán)境下,人們通常利用 GNU make 工具來自動完成應(yīng)用程序的維護和編譯工作。實際上,GNU make 工具通過一個稱為 Mak

32、efile 的文件來完成對應(yīng)用程序的自動維護和編譯工作。Makefile 是按照某種腳本語法編寫的文本文件,而 GNU make 能夠?qū)?Makefile 中指令進行解釋并執(zhí)行編譯操作。Makefile 文件定義了一系列的規(guī)則來指定哪些文件需要先編譯,哪些文件需要后編譯,哪些文件需要重新編譯,甚至于進行更復雜的功能操作。GNU make 工作時的執(zhí)行步驟如下:讀入所有的 Makefile。讀入被 include 的其它 Makefile。初始化文件中的變量。推導隱晦規(guī)則,并分析所有規(guī)則。為所有的目標文件創(chuàng)建依賴關(guān)系鏈。根據(jù)依賴關(guān)系,決定哪些目標要重新生成。執(zhí)行生成命令。【實驗儀器】1、裝有 L

33、inux 操作系統(tǒng)的 PC 機一臺2、XSBase270 或 XSBase255 ARM 實驗開發(fā)平臺一套(暫時不用)【實驗內(nèi)容】一、使用命令行的方式手動編譯程序方法1、利用文本編輯器創(chuàng)建 hello.c 文件/hello.c/written by Emdoor#include int main()printf(Welcome Emdoor!n);return 1;2、手動編譯 hello 應(yīng)用程序在 hello.c 的目錄的終端下輸入:rootlocal$ gcc c hello.c rootlocal$gcc hello.o o hello通過 ls 命令查看當前目錄下是否生成源代碼 he

34、llo.c 的 object 文件 hello.o 和可執(zhí)行文件 hello,運行可執(zhí)行文件 hello。查看一下運行結(jié)果。rootlocal$./hello3、修改 hello.c 文件,重新手動編譯應(yīng)用程序。4、刪除 hello.o 和 hello 文件rootlocal$rm f hello.orootlocal$rm f hello二、利用 GNU make 自動編譯應(yīng)用程序方法1、 利用文本編輯器創(chuàng)建一個 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查看并記錄所生成的文件和運行的結(jié)果。3、執(zhí)行 make clean 命令:rootlocal$make clean4、修改 hello.c 文件,重復第 2、3 步操作,查看并記錄所生成的文件和運行結(jié)果,并與手動編譯進行比

36、較,寫出你的結(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、重復第 2,3 步操作,查看并記錄所生成的文件和運行的結(jié)果。比較這兩種操作,寫出你的結(jié)論。同時指出$ 、$、$在上述 Makefile 中的含義。三、多個

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查看并記錄所生成的文件和運行的結(jié)果, 寫出

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過程中會自動運行,把內(nèi)核映像從

40、 FLASH 加載到 SDRAM 中。參數(shù)Kernel把內(nèi)核映像從 FLASH 拷貝到 SDRAM 中Ramdisk從 FLASH 中拷貝 RAMDISK 到 SDRAM舉例Bboot load kernelbootp用法Bootp描述運行 bootp 命令用來獲取 HOST 主機發(fā)送的 BOOTP 的數(shù)據(jù)包,解析BOOTP 的數(shù)據(jù)包,獲取本機的 IP 地址tftp用法Tftp 文件名 address/loader/kernel/root/ramdisk描述通過以太網(wǎng)下載主機的數(shù)據(jù)或文件到目標平臺的 SDRAM參數(shù)文件名 - 主機平臺需要傳輸?shù)奈募鹟oader - 把傳輸?shù)侥繕似脚_的文件放置

41、在 SDRAM 的 loader 區(qū)域kernel - 把傳輸?shù)侥繕似脚_的文件放置在 SDRAM 的 kernel 區(qū)域root - 把傳輸?shù)侥繕似脚_的文件放置在 SDRAM 的 root 區(qū)域ramdisk - 把傳輸?shù)侥繕似脚_的文件放置在 SDRAM 的 ramdisk 區(qū)域address - 把傳輸?shù)侥繕似脚_的文件放置在 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 實驗六實驗六 LinuxLinux 內(nèi)核編譯實驗內(nèi)核編譯實驗【實驗?zāi)康摹?、了解 Linux 內(nèi)核源代碼的目錄結(jié)構(gòu)及各目錄的相關(guān)內(nèi)容2、了解 Linux 內(nèi)核各配置選項內(nèi)容和作用3、掌握 Linux 內(nèi)核配置文件 config.in 的作用4、掌握 Linux 內(nèi)核的編譯過程5、掌握將新增內(nèi)核代碼加入到 Linux 內(nèi)核結(jié)構(gòu)中的方法【實驗原理】1內(nèi)核源代碼目錄介紹Linux 內(nèi)核源代碼可以從網(wǎng)上下載(/pub/linux/v2.4) 。一般主機平臺的 Linux (

44、如紅旗 Linux)源代碼在根目錄下的/usr/src/linux 目錄下。內(nèi)核源代碼的文件按樹形結(jié) 構(gòu)進行組織的,在源代碼樹最上層的可以看到如下的一些目錄:(1) 、arch:arch 子目錄包括所有與體系結(jié)構(gòu)相關(guān)的內(nèi)核代碼。arch 的每一個子目錄都 代表一個 Linux 所支持的體系結(jié)構(gòu)。例如:arm 目錄下就是 arm 體系架構(gòu)的處理器目錄,包 含我們使用的 PXA 處理器。(2) 、include:include 子目錄包括編譯內(nèi)核所需要的頭文件。與 ARM 相關(guān)的頭文件 在 include/asm-arm 子目錄下。(3) 、init:這個目錄包含內(nèi)核的初始化代碼,但不是系統(tǒng)的引導

45、代碼,其中所包含 main.c和 Version.c 文件是研究 Linux 內(nèi)核的起點。(4) 、mm:該目錄包含所有獨立于 CPU 體系結(jié)構(gòu)的內(nèi)存管理代碼,如頁式存儲管理 內(nèi)存的分配和釋放等。與 ARM 體系結(jié)構(gòu)相關(guān)的代碼在 arch/arm/mm 中。(5) 、Kernel:這里包括主要的內(nèi)核代碼,此目錄下的文件實現(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ū)動程序,每種驅(qū)動程序各占一個子目錄。(a) 、/block:塊設(shè)備

46、驅(qū)動程序。塊設(shè)備包括 IDE 和 scsi 設(shè)備。(b) 、/char:字符設(shè)備驅(qū)動程序。如串口、鼠標等。(c) 、/cdrom:包含 Linux 所有的 CD-ROM 代碼。(d) 、/pci:PCI 卡驅(qū)動程序代碼,包含 PCI 子系統(tǒng)映射和初始化代碼等。(e) 、/scsi:包含所有的 SCSI 代碼以及 Linux 所支持的所有的 SCSI 設(shè)備驅(qū)動程序代碼。(f) 、/net:網(wǎng)絡(luò)設(shè)備驅(qū)動程序。(g) 、/sound:聲卡設(shè)備驅(qū)動程序。(7) 、lib 目錄放置內(nèi)核的庫代碼;(8) 、net 目錄包含內(nèi)核與網(wǎng)絡(luò)的相關(guān)的代碼;(9) 、ipc 目錄包含內(nèi)核進程通信的代碼;(10) 、f

47、s 目錄是所有的文件系統(tǒng)代碼和各種類型的文件操作代碼,它的每一個子目錄支持一個文件系統(tǒng),如 JFFS2;(11) 、scripts 目錄包含用于配置內(nèi)核的腳本文件等。每個目錄下一般都有 depend 文件 和一個 makefile 文件,他們是編譯時使用的輔助文件,仔細閱讀這兩個文件對弄清各個文件 之間的相互依托關(guān)系很有幫助。2內(nèi)核的配置的基本結(jié)構(gòu)Linux 內(nèi)核的配置系統(tǒng)由四個部分組成(1) 、Makefile:分布在 Linux 內(nèi)核源碼中的 Makefile,定義 Linux 內(nèi)核的編譯規(guī)則;頂層 Makefile 是整個內(nèi)核配置、編譯的總體控制文件;(2) 、配置文件(config.i

48、n):給用戶提供配置選擇的功能;.config:內(nèi)核配置文件,包 括由用戶選擇的配置選項,用來存放內(nèi)核配置后的結(jié)果;(3) 、配置工具:包括對配置腳本中使用的配置命令進行解釋的配置命令解釋器和配置 用戶界面(基于字符界面:make config;基于 Ncurses 圖形界面:make menuconfig;基于 xWindows 圖形界面:make xconfig)(4) 、Rules.make:規(guī)則文件,被所有的 Makefile 使用。3編譯內(nèi)核的常用命令精簡 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 來進行 配置。命令執(zhí)行后產(chǎn)生文件.config,其中保存著配置信息。下次在做 make config 時將產(chǎn)生 新的.config 文件,原文件 config 更名為 config.old(2)、 make dep:尋找依存關(guān)系。產(chǎn)生兩個文件. depend 和.hdepend,其中.hdepend 表 示每個.h 文件都包含其他哪些嵌入文件。而.depend 文件有多個,在每個會產(chǎn)生目標文件(.o) 文件的目錄下均有,它

50、表示每個目標文件都依賴于哪些嵌入文件(.h)(3)、make clean:清除以前構(gòu)核所產(chǎn)生的所有的目標文件,模塊文件,核心以及一些臨時文件等,不產(chǎn)生任何文件(4)、 make rmproper:刪除所有以前在構(gòu)核過程所產(chǎn)生的所有文件,及除了做 make clean 外,還要刪除.config,.depend 等文件,把核心源碼恢復到最原始的狀態(tài)。下次構(gòu)核時必須進行重新配置;(5)、make,make zImage, make bzImage:(a) 、make:構(gòu)核。通過各目錄的 Makefile 文件進行,會在各個目錄下產(chǎn)生一大堆目 標文件,如核心代碼沒有錯誤,將產(chǎn)生文件 vmlinux,

51、這就是所構(gòu)的核心。并產(chǎn)生映像文件 system.map 通過各目錄的 makefile 文件進行。.version 文件中的數(shù)加 1,表示版本號的變化。(b)、makezImage:在make的基礎(chǔ)上產(chǎn)生壓縮的核心映像文件./arch/$(ARCH)/boot/zImage以及./arch/$(ARCH)/boot/compressed 目錄下產(chǎn)生一些臨時文件。(c)、make bzImage:在 make 的基礎(chǔ)上產(chǎn)生壓縮比例更大的核心映像文件./arch/$(ARCH)/ boot/bzImage 以及./arch/$(ARCH)/boot/compressed 目錄下產(chǎn)生一些臨時文件。4

52、內(nèi)核編譯過程(1)make mrproper:刪除所有以前在構(gòu)核過程所產(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)核配置項介紹首先切換 linux 源代碼所在的目錄,并終端輸入 make menuconfig,系統(tǒng)彈出基于 Ncurses 內(nèi)核配置圖形界面,便可進行內(nèi)核選項的配置。root$make menuconfig6添加驅(qū)動到 linux 內(nèi)核對于一個開發(fā)者來說,將自己開發(fā)的內(nèi)核代

53、碼添加到 Linux 內(nèi)核中,需要有三個步驟。(1)確定把自己的開發(fā)代碼放入到內(nèi)核的位置;(2)把自己開發(fā)的功能增加到 Linux 內(nèi)核的配置選項中,使用戶能夠選擇此功能;(3)構(gòu)建子目錄 Makefile,根據(jù)用戶的選擇,將相應(yīng)的代碼編譯 Linux 內(nèi)核中。【實驗儀器】1、裝有 Linux 操作系統(tǒng)的 PC 機一臺;2、XSBase270 或 XSBase255 ARM 實驗開發(fā)平臺一套【實驗內(nèi)容】(1)利用光盤上提供的 Linux 源代碼,具體分析遞歸性 makefile 的結(jié)構(gòu),畫出一個從最頂層 makefile 到最底層所經(jīng)過的文件路徑和所需要的變量。(2)利用光盤上提供的 Linu

54、x 源代碼,寫出編譯 Linux 內(nèi)核的具體過程。(3)利用光盤上提供的 Linux 源代碼,然后用 make menuconfig 命令對內(nèi)核的配置進行修改,記下具體修改的配置選項并保存退出,然后用 diff 命令比較.config 和.oldconfig.old 兩個新舊配置的差別,同時與記下的配置選項進行比較,根據(jù)比較結(jié)果,寫出你的結(jié)論。實驗七實驗七 驅(qū)動程序結(jié)構(gòu)實驗驅(qū)動程序結(jié)構(gòu)實驗實驗?zāi)康?、了解Linux 驅(qū)動程序的結(jié)構(gòu)2、掌握Linux 驅(qū)動程序常用結(jié)構(gòu)體和操作函數(shù)的使用方法3、初步掌握Linux 驅(qū)動程序的編寫方法及過程4、掌握Linux 驅(qū)動程序的加載方法實驗原理1驅(qū)動程序介紹

55、驅(qū)動程序負責將應(yīng)用程序如讀、寫等操作正確無誤的傳遞給相關(guān)的硬件,并使硬件能夠做出正確反應(yīng)的代碼。驅(qū)動程序像一個黑盒子,它隱藏了硬件的工作細節(jié),應(yīng)用程序只需要通過一組標準化的接口實現(xiàn)對硬件的操作。2Linux設(shè)備驅(qū)動程序分類Linux 設(shè)備驅(qū)動程序在Linux 的內(nèi)核源代碼中占有很大的比例,源代碼的長度日益增加,主要是驅(qū)動程序的增加。雖然Linux 內(nèi)核的不斷升級,但驅(qū)動程序的結(jié)構(gòu)還是相對穩(wěn)定。Linux 系統(tǒng)的設(shè)備分為字符設(shè)備(char device),塊設(shè)備(block device)和網(wǎng)絡(luò)設(shè)備(network device)三種。字符設(shè)備是指在存取時沒有緩存的設(shè)備,而塊設(shè)備的讀寫都有緩存來

56、支持,并且塊設(shè)備必須能夠隨機存取(random access)。典型的字符設(shè)備包括鼠標,鍵盤,串行口等。塊設(shè)備主要包括硬盤軟盤設(shè)備,CD-ROM等。網(wǎng)絡(luò)設(shè)備在Linux 里做專門的處理。Linux 的網(wǎng)絡(luò)系統(tǒng)主要是基于BSD unix 的socket 機制。在系統(tǒng)和驅(qū)動程序之間定義有專門的數(shù)據(jù)結(jié)構(gòu)(sk_buff)進行數(shù)據(jù)傳遞。系統(tǒng)有支持對發(fā)送數(shù)據(jù)和接收數(shù)據(jù)的緩存,提供流量控制機制,提供對多協(xié)議的支持。3驅(qū)動程序的結(jié)構(gòu)應(yīng)用程序經(jīng)過系統(tǒng)調(diào)用,進入核心層,內(nèi)核要控制硬件需要通過驅(qū)動程序?qū)崿F(xiàn),驅(qū)動程序相當于內(nèi)核與硬件之間的“系統(tǒng)調(diào)用”。內(nèi)核模塊內(nèi)核模塊是Linux 內(nèi)核的重要組成要素,內(nèi)核模塊能在L

57、inux系統(tǒng)啟動之后能夠動態(tài)進行裝載和卸載,因此不需對內(nèi)核進行重新編譯或重啟系統(tǒng)就可將內(nèi)核的一部分替換掉,Linux 內(nèi)核的所有設(shè)備驅(qū)動,文件系統(tǒng),網(wǎng)絡(luò)協(xié)議等可做成模塊的形式來提供。在所有的模塊中需記錄編譯的內(nèi)核版本信息,并與當前執(zhí)行的內(nèi)核版本一致。即,模塊具有版本依賴性,如果不一樣就會出錯,當然可以在模塊程序中的include之前通過宏定義#define_NO_VERSION_表明不定義模塊的版本信息。內(nèi)核模塊程序與一般應(yīng)用程序之間主要不同之處是,模塊程序沒有main()函數(shù),模塊程序在裝載時調(diào)用init_module(void)函數(shù)添加到內(nèi)核中,在卸載時調(diào)用voidcleanup_modu

58、le( )函數(shù)從內(nèi)核中卸載。另外一個應(yīng)用程序從頭到尾只執(zhí)行一個任務(wù),但一個模塊可以把響應(yī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è)備號應(yīng)用程序通過設(shè)備文件系統(tǒng)(devfs)的名字(或節(jié)點)訪問硬件設(shè)備,所有的設(shè)備節(jié)點在/dev目錄下。利用mknod命令生成設(shè)備文件系統(tǒng)的節(jié)點,但只有超級用戶才能

59、生成設(shè)備文。Mknod 命令必須要有設(shè)備名和設(shè)備類型,主設(shè)備號(Major Number),次設(shè)備號(Minor Number)等3 個參 數(shù)。主設(shè)備號用于內(nèi)核區(qū)分設(shè)備驅(qū)動,次設(shè)備號用于設(shè)備驅(qū)動區(qū)分設(shè)備。一個設(shè)備驅(qū)動可能控制多個設(shè)備。新的設(shè)備驅(qū)動要有新的主設(shè)備號。在內(nèi)核源代碼的Documentation /devices.txt中定義了所有設(shè)備的主設(shè)備號。在創(chuàng)建設(shè)備的時候不要與常用的設(shè)備好沖突。下面/dev/hda1 是設(shè)備名,b 表示block設(shè)備(c表示字符設(shè)備)。127是主設(shè)備號,1是次設(shè)備號。次設(shè)備號可以是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ū)動程序基本框架如果采用模塊方式編寫設(shè)備驅(qū)動程序時,通常至少要實現(xiàn)設(shè)備初始化模塊、設(shè)備打開模塊、數(shù)據(jù)讀寫與控制模塊、中斷處理模塊(有的驅(qū)動程序沒有)、設(shè)備釋放模塊和設(shè)備卸載模塊等幾個部分。下面給出一個典型的設(shè)備驅(qū)動程序的基本框架。,從中不難體會到這幾個關(guān)鍵部分是如何組織起來的。/* 打開設(shè)備模塊 */static int xxx_open(struct inode *inode, struct file *file

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論