版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、基于基于ARM和和linux的開發(fā)的開發(fā)2022-5-1華中科技大學(xué)華中科技大學(xué) 武漢創(chuàng)維特武漢創(chuàng)維特2提綱Linux簡介Linux驅(qū)動(dòng)程序設(shè)計(jì)Linux內(nèi)核移植Linux開發(fā)過程第八章 基于ARM和Linux的開發(fā)Linux上的圖形系統(tǒng)Linux開發(fā)環(huán)境建立Linux應(yīng)用程序設(shè)計(jì)3LinuxLinux簡介qLinux與與UNIX系統(tǒng)兼容,開放源代碼。系統(tǒng)兼容,開放源代碼。qLinux原本被設(shè)計(jì)為桌面系統(tǒng),現(xiàn)在廣泛應(yīng)用于服務(wù)器領(lǐng)原本被設(shè)計(jì)為桌面系統(tǒng),現(xiàn)在廣泛應(yīng)用于服務(wù)器領(lǐng)域。而更大的影響在于它正逐漸應(yīng)用于嵌入式設(shè)備。域。而更大的影響在于它正逐漸應(yīng)用于嵌入式設(shè)備。Linux可以說是最早的嵌入式可
2、以說是最早的嵌入式Linux發(fā)行版本。它是為沒有發(fā)行版本。它是為沒有MMU的的處理器而設(shè)計(jì)的,進(jìn)而發(fā)展了一個(gè)完整的開發(fā)平臺(tái),包括編處理器而設(shè)計(jì)的,進(jìn)而發(fā)展了一個(gè)完整的開發(fā)平臺(tái),包括編譯、調(diào)試等工具。譯、調(diào)試等工具。4LinuxLinux簡介qLinux具有如下特性:具有如下特性:開源開源免費(fèi)免費(fèi)高度可裁剪:通常內(nèi)核高度可裁剪:通常內(nèi)核小于小于 512KBytes,文件系統(tǒng)可,文件系統(tǒng)可從幾十從幾十KBytes到幾到幾Mbytes不等,視應(yīng)用程序大小而定。不等,視應(yīng)用程序大小而定。q具有大量的開源的具有大量的開源的linux應(yīng)用程序和驅(qū)動(dòng)程序,并可應(yīng)用程序和驅(qū)動(dòng)程序,并可以方便地移植到各種平臺(tái),
3、包括以方便地移植到各種平臺(tái),包括ARM平臺(tái)平臺(tái)5Linux與uC/OS-II的區(qū)別 功能性Linux簡介qLinux包含一整套的編譯、調(diào)試等開發(fā)工具、內(nèi)核源包含一整套的編譯、調(diào)試等開發(fā)工具、內(nèi)核源代碼、各種文件系統(tǒng)、圖形接口、各種協(xié)議、驅(qū)動(dòng)程序代碼、各種文件系統(tǒng)、圖形接口、各種協(xié)議、驅(qū)動(dòng)程序以及豐富的應(yīng)用程序。以及豐富的應(yīng)用程序。q而而uC/OS-II確切的來說只是一個(gè)確切的來說只是一個(gè)微內(nèi)核微內(nèi)核,僅僅包含多,僅僅包含多任務(wù)調(diào)度、簡單內(nèi)存管理等基本的多任務(wù)操作系統(tǒng)元素,任務(wù)調(diào)度、簡單內(nèi)存管理等基本的多任務(wù)操作系統(tǒng)元素,且多任務(wù)調(diào)度算法和內(nèi)存管理等都比較簡單。對(duì)于想實(shí)現(xiàn)且多任務(wù)調(diào)度算法和內(nèi)存管
4、理等都比較簡單。對(duì)于想實(shí)現(xiàn)GUI、FS、協(xié)議等都必須另外購買或者移植,對(duì)于設(shè)備驅(qū)、協(xié)議等都必須另外購買或者移植,對(duì)于設(shè)備驅(qū)動(dòng)程序沒有提供專門統(tǒng)一的接口。動(dòng)程序沒有提供專門統(tǒng)一的接口。6Linux與uC/OS-II的區(qū)別 開發(fā)工具Linux簡介qLinux發(fā)布中包含了編譯器和調(diào)試器等工具,它們都發(fā)布中包含了編譯器和調(diào)試器等工具,它們都采用采用GCC編譯器編譯器,匯編語法一致。,匯編語法一致。quC/OS-II沒有指定編譯器,在不同的平臺(tái)下使用該沒有指定編譯器,在不同的平臺(tái)下使用該平臺(tái)下的編譯器,而各個(gè)編譯器,其匯編語法不同,因平臺(tái)下的編譯器,而各個(gè)編譯器,其匯編語法不同,因此,在不同類型平臺(tái)下,
5、匯編程序不一致。此,在不同類型平臺(tái)下,匯編程序不一致。7Linux與uC/OS-II的區(qū)別 開發(fā)資源Linux簡介q在開發(fā)上,在開發(fā)上,Linux采用統(tǒng)一的采用統(tǒng)一的API調(diào)用,接口文檔齊調(diào)用,接口文檔齊全,書籍、網(wǎng)上資源也比較多。全,書籍、網(wǎng)上資源也比較多。quC/OS-II雖沒有標(biāo)準(zhǔn)的雖沒有標(biāo)準(zhǔn)的API接口,但是其內(nèi)核非常簡接口,但是其內(nèi)核非常簡單、簡潔,且書籍、網(wǎng)上資源也非常豐富。單、簡潔,且書籍、網(wǎng)上資源也非常豐富。8Linux與uC/OS-II的區(qū)別 移植性Linux簡介qLinux發(fā)布中包含了多種平臺(tái)下的移植,可以發(fā)布中包含了多種平臺(tái)下的移植,可以通過配通過配置內(nèi)核選擇體系結(jié)構(gòu)和裁
6、剪內(nèi)核置內(nèi)核選擇體系結(jié)構(gòu)和裁剪內(nèi)核。quC/OS-II的不同平臺(tái)下的移植通過不同的移植代碼的不同平臺(tái)下的移植通過不同的移植代碼獨(dú)立發(fā)布,沒有一個(gè)統(tǒng)一的界面,通過宏定義進(jìn)行內(nèi)核獨(dú)立發(fā)布,沒有一個(gè)統(tǒng)一的界面,通過宏定義進(jìn)行內(nèi)核裁剪。裁剪。9Linux與uC/OS-II的區(qū)別 實(shí)時(shí)性Linux簡介qLinux內(nèi)核不關(guān)心實(shí)時(shí)性問題內(nèi)核不關(guān)心實(shí)時(shí)性問題,可以通過和,可以通過和RTLinux配合來實(shí)現(xiàn)實(shí)時(shí)。配合來實(shí)現(xiàn)實(shí)時(shí)。RTLinux處理實(shí)時(shí)任務(wù),非實(shí)時(shí)任務(wù)由處理實(shí)時(shí)任務(wù),非實(shí)時(shí)任務(wù)由linux完成完成RTLinux是為是為linux提供實(shí)時(shí)性的方法,同樣也適用提供實(shí)時(shí)性的方法,同樣也適用于于Linux
7、。通過。通過RTLinux的的patch,可以滿足,可以滿足Linux對(duì)實(shí)時(shí)對(duì)實(shí)時(shí)性的需求性的需求quC/OS-II采用占先式內(nèi)核,實(shí)時(shí)性好采用占先式內(nèi)核,實(shí)時(shí)性好10Linux映像(image)文件結(jié)構(gòu)Linux開發(fā)過程qLinux映像由映像由內(nèi)核內(nèi)核(kernel)和和文件系統(tǒng)文件系統(tǒng)(fs)組成。組成。q可以將可以將kernel和和fs統(tǒng)一編譯到一個(gè)映像統(tǒng)一編譯到一個(gè)映像(image)文件中,也文件中,也可以將可以將kernel和和fs獨(dú)立地放置于不同的映像文件中獨(dú)立地放置于不同的映像文件中(燒寫到(燒寫到FLASH的不同區(qū)域),這需要通過修改的不同區(qū)域),這需要通過修改Makefile
8、文件和內(nèi)核文件和內(nèi)核中的文件系統(tǒng)加載代碼實(shí)現(xiàn)。中的文件系統(tǒng)加載代碼實(shí)現(xiàn)。q本系統(tǒng)中本系統(tǒng)中kernel和和fs分別位于不同的映像文件中。分分別位于不同的映像文件中。分別為(別為(ramdisk.gz和和zImage)qLinux支持支持壓縮核心壓縮核心(zImage),它是對(duì)原核心映像文件,它是對(duì)原核心映像文件(linux.bin)進(jìn)行壓縮,并在壓縮后的文件頭部添加一段解壓縮進(jìn)行壓縮,并在壓縮后的文件頭部添加一段解壓縮代碼。在該程序運(yùn)行時(shí),先運(yùn)行這段解壓縮代碼將程序解壓代碼。在該程序運(yùn)行時(shí),先運(yùn)行這段解壓縮代碼將程序解壓縮到縮到Linux核心運(yùn)行地址,完成后,跳轉(zhuǎn)到核心運(yùn)行。核心運(yùn)行地址,完成
9、后,跳轉(zhuǎn)到核心運(yùn)行。11Linux內(nèi)核組成Linux開發(fā)過程q初始化程序段初始化程序段(init段段) 約約32KBytes。q數(shù)據(jù)段數(shù)據(jù)段(data) 50100KBytes左右。左右。q代碼段代碼段(text) 300KBytes左右左右 q如果如果kernel和和fs編譯在一起,內(nèi)核映像還包含文件系統(tǒng)編譯在一起,內(nèi)核映像還包含文件系統(tǒng)(romfs) 80KBytesq未初始化數(shù)據(jù)段未初始化數(shù)據(jù)段(bss) 100150KBytes左右。左右。12Linux開發(fā)步驟Linux開發(fā)過程qBOOTLOADER開發(fā)開發(fā)qLinux開發(fā)環(huán)境建立開發(fā)環(huán)境建立qLinux內(nèi)核移植內(nèi)核移植q應(yīng)用程序開發(fā)
10、應(yīng)用程序開發(fā)13支持Linux開發(fā)的BOOTLOADERLinux開發(fā)過程q引導(dǎo)引導(dǎo)Linuxq燒寫燒寫Linux內(nèi)核映像和文件系統(tǒng)內(nèi)核映像和文件系統(tǒng)q初始化硬件初始化硬件14GNU交叉編譯Linux開發(fā)環(huán)境建立qLinux采用采用GNU交叉編譯器交叉編譯器qGNU的交叉編譯器,包括以下組件:的交叉編譯器,包括以下組件:1. Gcc交叉編譯器,即在宿主機(jī)上開發(fā)編譯目標(biāo)上可交叉編譯器,即在宿主機(jī)上開發(fā)編譯目標(biāo)上可運(yùn)行的二進(jìn)制文件;運(yùn)行的二進(jìn)制文件;2. Binutils輔助工具,包括輔助工具,包括objdump、objcopy等;等;3. Gdb調(diào)試器。調(diào)試器。q對(duì)于對(duì)于ARM可以采用如下兩個(gè)版
11、本的編譯器:可以采用如下兩個(gè)版本的編譯器:arm-elf-arm-linux-15arm-elf- 交叉編譯器Linux開發(fā)環(huán)境建立qarm-elf-gccqarm-elf-ldqarm-elf-asqarm-elf-objdumpqarm-elf-objcopyqarm-elf-gdb16arm-linux- 交叉編譯器(推薦使用)Linux開發(fā)環(huán)境建立qarm-linux-gccqarm-linux-ldqarm-linux-asqarm-linux-objdumpqarm-linux-objcopyqarm-linux-gdb17選擇Linux開發(fā)環(huán)境Linux開發(fā)環(huán)境建立qWindow
12、s環(huán)境環(huán)境 + CygwinqWindows環(huán)境環(huán)境 + VMWare虛擬機(jī)(安裝虛擬機(jī)(安裝RedHat 9.0)qLinux環(huán)境,推薦環(huán)境,推薦RedHat 9.0q單機(jī)模式(一臺(tái)計(jì)算機(jī))單機(jī)模式(一臺(tái)計(jì)算機(jī))q雙機(jī)模式(兩臺(tái)計(jì)算機(jī))雙機(jī)模式(兩臺(tái)計(jì)算機(jī))qWindows + Linux18在linux環(huán)境下進(jìn)行Linux開發(fā)Linux開發(fā)環(huán)境建立q必須采用支持必須采用支持GDB的調(diào)試器(如的調(diào)試器(如ADT1000A)才能)才能進(jìn)行調(diào)試,否則只能通過進(jìn)行調(diào)試,否則只能通過BOOTLOADER進(jìn)行簡單的程進(jìn)行簡單的程序燒寫運(yùn)行等序燒寫運(yùn)行等q調(diào)試信息的打印可以通過串口完成,使用調(diào)試信息的打
13、印可以通過串口完成,使用linux下的下的minicom超級(jí)終端程序(類似于超級(jí)終端程序(類似于Windows上的超級(jí)終端工上的超級(jí)終端工具)接收并顯示目標(biāo)板傳送的打印信息具)接收并顯示目標(biāo)板傳送的打印信息qLinux的程序編輯、編譯、調(diào)試都在的程序編輯、編譯、調(diào)試都在Linux環(huán)境進(jìn)行環(huán)境進(jìn)行qLinux串口驅(qū)動(dòng)完成后,可以通過內(nèi)核打印函數(shù)串口驅(qū)動(dòng)完成后,可以通過內(nèi)核打印函數(shù)printk向串口打印信息,這是向串口打印信息,這是Linux內(nèi)核調(diào)試過程中最有內(nèi)核調(diào)試過程中最有效的手段效的手段19在Windows + Cygwin環(huán)境下進(jìn)行Linux開發(fā)Linux開發(fā)環(huán)境建立qLinux內(nèi)核配置和
14、編譯等在內(nèi)核配置和編譯等在Cygwin環(huán)境下運(yùn)行,程序環(huán)境下運(yùn)行,程序編輯和調(diào)試都在編輯和調(diào)試都在Windows環(huán)境下進(jìn)行環(huán)境下進(jìn)行,必須采用支持,必須采用支持Windows下進(jìn)行下進(jìn)行l(wèi)inux調(diào)試的調(diào)試器(如調(diào)試的調(diào)試器(如ADT1000A)才)才能進(jìn)行調(diào)試,否則只能通過能進(jìn)行調(diào)試,否則只能通過BOOTLOADER進(jìn)行簡單的進(jìn)行簡單的程序燒寫運(yùn)行等程序燒寫運(yùn)行等q調(diào)試信息的打印可以通過串口完成,使用調(diào)試信息的打印可以通過串口完成,使用Windows上的超級(jí)終端工具接收并顯示目標(biāo)板傳送的打印信息上的超級(jí)終端工具接收并顯示目標(biāo)板傳送的打印信息qCygwin是運(yùn)行于是運(yùn)行于Windows中的一個(gè)
15、應(yīng)用程序,它可中的一個(gè)應(yīng)用程序,它可以使得以使得Linux環(huán)境下的應(yīng)用程序可以在環(huán)境下的應(yīng)用程序可以在Cygwin環(huán)境下進(jìn)環(huán)境下進(jìn)行編譯,即可以在行編譯,即可以在Windows進(jìn)行編譯。進(jìn)行編譯。20在Windows + VMWare虛擬機(jī)環(huán)境下進(jìn)行Linux開發(fā)Linux開發(fā)環(huán)境建立q如果需要使用只支持如果需要使用只支持Windows環(huán)境下調(diào)試的調(diào)試器,環(huán)境下調(diào)試的調(diào)試器,可以通過在可以通過在VMWare中安裝中安裝linux虛擬機(jī),在該虛擬機(jī)中虛擬機(jī),在該虛擬機(jī)中進(jìn)行編輯、編譯進(jìn)行編輯、編譯Linux,然后通過網(wǎng)絡(luò)(,然后通過網(wǎng)絡(luò)(ftp、nfs、ssh)等手段傳送到等手段傳送到Windo
16、ws中,進(jìn)行調(diào)試,中,進(jìn)行調(diào)試,這樣編譯和調(diào)試這樣編譯和調(diào)試可以分別在可以分別在linux和和windows環(huán)境下但是是在一臺(tái)電腦中環(huán)境下但是是在一臺(tái)電腦中完成完成,它的缺點(diǎn)是系統(tǒng)要求較高,運(yùn)行速度慢。,它的缺點(diǎn)是系統(tǒng)要求較高,運(yùn)行速度慢。q也可以在兩臺(tái)電腦中分別安裝也可以在兩臺(tái)電腦中分別安裝linux和和windows,分別,分別實(shí)現(xiàn)編譯和調(diào)試。實(shí)現(xiàn)編譯和調(diào)試。qVMWare是運(yùn)行于是運(yùn)行于Windows中的一個(gè)應(yīng)用程序,是中的一個(gè)應(yīng)用程序,是一個(gè)虛擬機(jī),可以在其上安裝多個(gè)操作系統(tǒng),相當(dāng)于在一個(gè)虛擬機(jī),可以在其上安裝多個(gè)操作系統(tǒng),相當(dāng)于在Windows上安裝一個(gè)虛擬的操作系統(tǒng)。上安裝一個(gè)虛擬
17、的操作系統(tǒng)。21Linux內(nèi)核移植Linux內(nèi)核移植qLinux內(nèi)核的移植可以分為內(nèi)核的移植可以分為板級(jí)移植板級(jí)移植和和片級(jí)移植片級(jí)移植。q對(duì)于對(duì)于Linux發(fā)行版本中已經(jīng)支持的發(fā)行版本中已經(jīng)支持的CPU通常只需要針對(duì)板級(jí)通常只需要針對(duì)板級(jí)硬件進(jìn)行適當(dāng)?shù)男薷募纯?,這種移植叫做板級(jí)移植。硬件進(jìn)行適當(dāng)?shù)男薷募纯?,這種移植叫做板級(jí)移植。q而對(duì)于而對(duì)于Linux發(fā)行版本中沒有支持的發(fā)行版本中沒有支持的CPU則需要添加相應(yīng)則需要添加相應(yīng)CPU的內(nèi)核移植,這種移植叫做片級(jí)移植。的內(nèi)核移植,這種移植叫做片級(jí)移植。q片級(jí)移植相對(duì)板級(jí)移植來說要復(fù)雜許多,本系統(tǒng)采用的片級(jí)移植相對(duì)板級(jí)移植來說要復(fù)雜許多,本系統(tǒng)采用
18、的Linux 發(fā)行版本中已經(jīng)包含發(fā)行版本中已經(jīng)包含S3C2410X ARM920T處理器的移植處理器的移植包,因此,只需要在其上進(jìn)行包,因此,只需要在其上進(jìn)行Linux板級(jí)移植的基本過程和方法。板級(jí)移植的基本過程和方法。22Linux內(nèi)核的目錄結(jié)構(gòu)Linux內(nèi)核移植linuxDocumentationarchdriversfsincludeinitmmnommulibnetscript幫助文檔體系結(jié)構(gòu)相關(guān)源代碼驅(qū)動(dòng)程序文件系統(tǒng)頭文件kernel初始化Linux內(nèi)存管理常用函數(shù)網(wǎng)絡(luò)協(xié)議源代碼腳本文件23Linux內(nèi)核的arch目錄Linux內(nèi)核移植armnommubootkernellibmac
19、h-s3c2410vmlinux.lds壓縮內(nèi)核啟動(dòng)引導(dǎo)代碼內(nèi)核起始代碼常用函數(shù)s3c2410平臺(tái)相關(guān)代碼核心的連接腳本文件q與架構(gòu)和平臺(tái)相關(guān)的源代碼都放在與架構(gòu)和平臺(tái)相關(guān)的源代碼都放在archarch目錄下,對(duì)目錄下,對(duì)于于ARMARM的的LinuxLinux,包含于,包含于archarch目錄下的目錄下的armarm子目錄中。子目錄中。24Linux內(nèi)核的arch目錄Linux內(nèi)核移植q當(dāng)使用壓縮核心時(shí),當(dāng)使用壓縮核心時(shí),bootboot目錄下包含壓縮和解壓核心的源目錄下包含壓縮和解壓核心的源代碼和代碼和MakefileMakefile文件。文件。qkernelkernel目錄的目錄的en
20、try-armventry-armv.S.S中為未壓縮內(nèi)核的起始執(zhí)行文中為未壓縮內(nèi)核的起始執(zhí)行文件,內(nèi)核從其第一條指令處執(zhí)行。件,內(nèi)核從其第一條指令處執(zhí)行。qvmlinux.ldsvmlinux.lds文件為核心的連接腳本文件,壓縮核心解壓文件為核心的連接腳本文件,壓縮核心解壓后必須解壓縮到該文件指定的地址。后必須解壓縮到該文件指定的地址。25Linux內(nèi)核移植Linux內(nèi)核移植q配置內(nèi)核配置內(nèi)核q編譯內(nèi)核編譯內(nèi)核q下載、運(yùn)行、調(diào)試內(nèi)核下載、運(yùn)行、調(diào)試內(nèi)核26配置Linux內(nèi)核Linux內(nèi)核移植qmake configmake configqmake menuconfigmake menuco
21、nfigqmake xconfigmake xconfig27make configLinux內(nèi)核移植28make menuconfigLinux內(nèi)核移植29make xconfigLinux內(nèi)核移植30Linux常用配置選項(xiàng)Linux內(nèi)核移植q系統(tǒng)及其存儲(chǔ)器配置系統(tǒng)及其存儲(chǔ)器配置q網(wǎng)絡(luò)支持網(wǎng)絡(luò)支持q顯示器支持顯示器支持q觸摸屏支持觸摸屏支持31系統(tǒng)及其存儲(chǔ)器配置Linux內(nèi)核移植q在在System TypeSystem Type菜單中菜單中中進(jìn)行配置中進(jìn)行配置選擇系統(tǒng)類型處理器型號(hào)選擇處理器其它特性(USB支持等)32網(wǎng)絡(luò)支持Linux內(nèi)核移植q在在Networking optionsNet
22、working options以及以及Network device Network device supportsupport中進(jìn)行配置中進(jìn)行配置 選擇支持TCP/IP協(xié)議33網(wǎng)絡(luò)支持Linux內(nèi)核移植q在在Network device supportNetwork device support配置中,添加選配置中,添加選項(xiàng)項(xiàng)Network device supportNetwork device support,并在,并在Ethernet(10 or Ethernet(10 or 100Mbit)100Mbit)中選擇中選擇Other ISA cardsOther ISA cards,如下圖
23、所示,如下圖所示選擇選擇NE2000/NE1000 supportNE2000/NE1000 support采用RTL8019網(wǎng)卡芯片,為NE2000兼容網(wǎng)卡芯片,因此,選擇該網(wǎng)卡34顯示器支持Linux內(nèi)核移植q在在Character devices以及以及Console drivers中中進(jìn)行配置。進(jìn)行配置。q在在Character devicesCharacter devices配置中,添加選項(xiàng)配置中,添加選項(xiàng)Virtual Virtual terminalterminal配置,如下圖所示。配置,如下圖所示。 Virtual terminal支持35顯示器支持Linux內(nèi)核移植q在在Co
24、nsole drivers中添加中添加Support Frame buffer devices配置配置采用256色STN顯示器,因此必須選擇8bpp支持36觸摸屏支持Linux內(nèi)核移植q在在Character devices的的Support S3C2410 TouchScreen子菜單中進(jìn)行配置子菜單中進(jìn)行配置選擇s3c2410觸摸屏支持37編譯Linux內(nèi)核Linux內(nèi)核移植q建立依賴關(guān)系建立依賴關(guān)系make depmake depq編譯內(nèi)核編譯內(nèi)核make make 編譯內(nèi)核編譯內(nèi)核make zImage make zImage 編譯壓縮核心(編譯壓縮核心(zImagezImage)編譯
25、生成地編譯生成地LinuxLinux映像文件映像文件zImagezImage通常保存在通常保存在arch/arm/boot/arch/arm/boot/目錄下目錄下38下載、運(yùn)行和調(diào)試內(nèi)核Linux內(nèi)核移植q通過調(diào)試器下載內(nèi)核并運(yùn)行通過調(diào)試器下載內(nèi)核并運(yùn)行q通過通過BOOTLOADERBOOTLOADER下載內(nèi)核到下載內(nèi)核到SDRAMSDRAM中運(yùn)行中運(yùn)行q通過通過BOOTLOADERBOOTLOADER將內(nèi)核燒寫到將內(nèi)核燒寫到FLASHFLASH中,然后運(yùn)行中,然后運(yùn)行LinuxLinux39Linux調(diào)試手段Linux內(nèi)核移植q在在LinuxLinux開發(fā)中,由于可能沒有標(biāo)準(zhǔn)鍵盤和顯示器支
26、持,因開發(fā)中,由于可能沒有標(biāo)準(zhǔn)鍵盤和顯示器支持,因此,通常通過串口將顯示信息發(fā)送到主機(jī),由主機(jī)端超級(jí)終端此,通常通過串口將顯示信息發(fā)送到主機(jī),由主機(jī)端超級(jí)終端工具接收,以完成顯示功能。同時(shí)在超級(jí)終端中可以輸入數(shù)據(jù),工具接收,以完成顯示功能。同時(shí)在超級(jí)終端中可以輸入數(shù)據(jù),然后由然后由LinuxLinux接收,以完成標(biāo)準(zhǔn)鍵盤功能。接收,以完成標(biāo)準(zhǔn)鍵盤功能。q調(diào)試過程中也可以通過串口將調(diào)試信息打印到超級(jí)終端,調(diào)試過程中也可以通過串口將調(diào)試信息打印到超級(jí)終端,這是這是LinuxLinux最有效和最簡單的方法。最有效和最簡單的方法。40Linux內(nèi)核移植主要過程1Linux內(nèi)核移植q對(duì)于板級(jí)移植,內(nèi)核移
27、植主要包括如下幾個(gè)部分:對(duì)于板級(jí)移植,內(nèi)核移植主要包括如下幾個(gè)部分:q內(nèi)核配置,包括板級(jí)包配置,如內(nèi)核配置,包括板級(jí)包配置,如S3C44B0X-MBA44S3C44B0X-MBA44q體系結(jié)構(gòu)相關(guān)代碼修改,根據(jù)板級(jí)包的配置,修改相應(yīng)體系結(jié)構(gòu)相關(guān)代碼修改,根據(jù)板級(jí)包的配置,修改相應(yīng)的體系結(jié)構(gòu)相關(guān)代碼,包括:的體系結(jié)構(gòu)相關(guān)代碼,包括:壓縮核心啟動(dòng)代碼:壓縮核心啟動(dòng)代碼:linuxlinux/arch/arm/boot/arch/arm/boot/內(nèi)核啟動(dòng)代碼:內(nèi)核啟動(dòng)代碼:linuxlinux/arch/arm/kernel/arch/arm/kernel/板級(jí)相關(guān)代碼:板級(jí)相關(guān)代碼:linuxl
28、inux/arch/arm/mach-s3c2410/arch/arm/mach-s3c2410/q連接腳本連接腳本核心連接腳本:核心連接腳本:linux/arch/arm/vmlinux.ldslinux/arch/arm/vmlinux.lds壓縮核心連接腳本:壓縮核心連接腳本:linux/arch/arm/boot/compressed/linux.ldslinux/arch/arm/boot/compressed/linux.lds41Linux內(nèi)核移植主要過程2Linux內(nèi)核移植q加載文件系統(tǒng)加載文件系統(tǒng)ramdiskramdiskq編寫驅(qū)動(dòng)程序編寫驅(qū)動(dòng)程序驅(qū)動(dòng)程序目錄:驅(qū)動(dòng)程序目錄
29、:linuxlinux/drivers/drivers/網(wǎng)卡驅(qū)動(dòng)程序:網(wǎng)卡驅(qū)動(dòng)程序:linux/drivers/net/nelinux/drivers/net/ne.c.cLCDLCD驅(qū)動(dòng)程序:驅(qū)動(dòng)程序:linuxlinux/drivers/video/s3c2410fb.c/drivers/video/s3c2410fb.c觸摸屏驅(qū)動(dòng)程序:觸摸屏驅(qū)動(dòng)程序:linux/drivers/char/s3c2410-tslinux/drivers/char/s3c2410-ts.c.c42Linux啟動(dòng)過程1Linux內(nèi)核移植解壓縮核心核心打印信息內(nèi)核命令行存儲(chǔ)器43Linux啟動(dòng)過程2Linux內(nèi)
30、核移植IIC總線初始化Frame Buffer顯示初始化44Linux啟動(dòng)過程3Linux內(nèi)核移植Linux控制臺(tái)45Linux文件系統(tǒng)Linux內(nèi)核移植q文件系統(tǒng)指文件存在的物理空間。在文件系統(tǒng)指文件存在的物理空間。在LinuxLinux系統(tǒng)中,每個(gè)分系統(tǒng)中,每個(gè)分區(qū)都是一個(gè)文件系統(tǒng),都有自己的目錄層次結(jié)構(gòu)。區(qū)都是一個(gè)文件系統(tǒng),都有自己的目錄層次結(jié)構(gòu)。qLinuxLinux的最重要特征之一就是支持多種文件系統(tǒng),這樣它的最重要特征之一就是支持多種文件系統(tǒng),這樣它更加靈活,并可以和許多其它種操作系統(tǒng)共存。更加靈活,并可以和許多其它種操作系統(tǒng)共存。qVirtual File SystemVirtu
31、al File System(虛擬文件系統(tǒng))使得(虛擬文件系統(tǒng))使得LinuxLinux可以支可以支持多個(gè)不同的文件系統(tǒng)。由于系統(tǒng)已將持多個(gè)不同的文件系統(tǒng)。由于系統(tǒng)已將LinuxLinux文件系統(tǒng)的所有文件系統(tǒng)的所有細(xì)節(jié)進(jìn)行了轉(zhuǎn)換,所以細(xì)節(jié)進(jìn)行了轉(zhuǎn)換,所以LinuxLinux核心的其它部分及系統(tǒng)中運(yùn)行的核心的其它部分及系統(tǒng)中運(yùn)行的程序?qū)⒖吹浇y(tǒng)一的文件系統(tǒng)。程序?qū)⒖吹浇y(tǒng)一的文件系統(tǒng)。qLinuxLinux的虛擬文件系統(tǒng)允許用戶同時(shí)能透明地安裝許多不的虛擬文件系統(tǒng)允許用戶同時(shí)能透明地安裝許多不同的文件系統(tǒng)。虛擬文件系統(tǒng)是為同的文件系統(tǒng)。虛擬文件系統(tǒng)是為LinuxLinux用戶提供快速且高效用戶提供
32、快速且高效的文件訪問服務(wù)而設(shè)計(jì)的。的文件訪問服務(wù)而設(shè)計(jì)的。 46常用Linux文件系統(tǒng)Linux內(nèi)核移植qLinuxLinux系統(tǒng)核心可以支持十多種文件系統(tǒng)類型:系統(tǒng)核心可以支持十多種文件系統(tǒng)類型:JFSJFS、 extext、ext2ext2、ext3ext3、ISO9660ISO9660、XFSXFS、MinxMinx、MSDOSMSDOS、UMSDOSUMSDOS、VFATVFAT、NTFSNTFS、HPFSHPFS、NFSNFS、SMBSMB、SysVSysV、PROCPROC、romfsromfs等。等。47Linux內(nèi)核移植的若干問題1Linux內(nèi)核移植q源程序閱讀問題源程序閱讀問
33、題1 1qLinuxLinux內(nèi)核源代碼非常多,且結(jié)構(gòu)復(fù)雜,內(nèi)核源代碼非常多,且結(jié)構(gòu)復(fù)雜,LinuxLinux內(nèi)核內(nèi)核有接近有接近1000010000個(gè)文件,個(gè)文件,40000004000000行代碼。行代碼。q因此,閱讀因此,閱讀LinuxLinux時(shí)必須借助一些工具時(shí)必須借助一些工具Source insightSource insightUltraeditUltraedit等等qLinuxLinux內(nèi)核使用內(nèi)核使用GNU CGNU C,它在,它在ANSI CANSI C基礎(chǔ)上進(jìn)行了一些基礎(chǔ)上進(jìn)行了一些擴(kuò)充,因此在許多編程習(xí)慣上與擴(kuò)充,因此在許多編程習(xí)慣上與ANSI CANSI C不同。不同
34、。q大量使用大量使用宏定義宏定義,且許多宏定義非常復(fù)雜,這也在一,且許多宏定義非常復(fù)雜,這也在一定程度上增加了難度。定程度上增加了難度。48Linux內(nèi)核移植的若干問題1Linux內(nèi)核移植q源程序閱讀問題源程序閱讀問題2 2qLinuxLinux中并不是所有代碼都編譯進(jìn)去,對(duì)于一個(gè)體系結(jié)構(gòu),中并不是所有代碼都編譯進(jìn)去,對(duì)于一個(gè)體系結(jié)構(gòu),只有很少部分的代碼參與編譯,因此,必須掌握只有很少部分的代碼參與編譯,因此,必須掌握LinuxLinux發(fā)布中發(fā)布中各目錄的意義才能進(jìn)一步清楚是否參與編譯。各目錄的意義才能進(jìn)一步清楚是否參與編譯。q還可以通過查看還可以通過查看.o.o文件的方式查看當(dāng)前參與編譯的
35、文件的方式查看當(dāng)前參與編譯的是哪個(gè)文件,通常是哪個(gè)文件,通常xxx.cxxx.c文件生成的目標(biāo)文件為文件生成的目標(biāo)文件為xxx.oxxx.o,只有生成了只有生成了.o.o的文件才參與編譯,的文件才參與編譯,注意:這適合于大部注意:這適合于大部分情況,但是不是絕對(duì)的分情況,但是不是絕對(duì)的。qLinuxLinux中大量使用中大量使用條件編譯條件編譯,閱讀代碼時(shí)需要弄清楚,閱讀代碼時(shí)需要弄清楚,到底哪部分代碼參與編譯。到底哪部分代碼參與編譯。#ifdef #ifdef xxxxxx#elif#elif#endif#endif49Linux內(nèi)核移植的若干問題2Linux內(nèi)核移植qGNU CGNU Cq
36、從從C+C+中吸收了中吸收了inlineinline和和constconst等關(guān)鍵字。等關(guān)鍵字。qANSI CANSI C代碼與代碼與GNU CGNU C中的保留關(guān)鍵字沖突通過雙下劃中的保留關(guān)鍵字沖突通過雙下劃線線(_)(_)解決:如解決:如inlineinline等價(jià)于等價(jià)于_inline_inline_、asmasm等價(jià)于等價(jià)于_asmasm_q結(jié)構(gòu)體的初始化結(jié)構(gòu)體的初始化50Linux內(nèi)核移植的若干問題2Linux內(nèi)核移植qGNU CGNU C結(jié)構(gòu)體初始化結(jié)構(gòu)體初始化結(jié)構(gòu)體聲明ANSI C結(jié)構(gòu)體初始化,必須按順序GNU C結(jié)構(gòu)體初始化,無需按順序51Linux應(yīng)用程序Linux應(yīng)用程序設(shè)
37、計(jì)q編寫程序編寫程序q編寫編寫MakefileMakefile文件文件q編譯編譯q運(yùn)行運(yùn)行52編寫Makefile文件Linux應(yīng)用程序設(shè)計(jì)指定編譯器生成的執(zhí)行文件和鏈接過程中的目標(biāo)文件 編譯和鏈接的參數(shù) 編譯命令 拷貝helloworld映像文件到/tftpboot/examples中清除53Linux應(yīng)用程序運(yùn)行1Linux應(yīng)用程序設(shè)計(jì)q應(yīng)用程序運(yùn)行可以采用如下兩種方式:應(yīng)用程序運(yùn)行可以采用如下兩種方式:q在在LinuxLinux內(nèi)核啟動(dòng)起來,并且有辦法從主機(jī)獲取文件時(shí),內(nèi)核啟動(dòng)起來,并且有辦法從主機(jī)獲取文件時(shí),可以在可以在LinuxLinux控制臺(tái)直接從主機(jī)獲取編譯后的應(yīng)用程序。控制臺(tái)直
38、接從主機(jī)獲取編譯后的應(yīng)用程序。可以通過可以通過ftpftp、nfsnfs、sshssh等方式達(dá)到。等方式達(dá)到。q也可以在編譯應(yīng)用程序后將該應(yīng)用程序拷貝到也可以在編譯應(yīng)用程序后將該應(yīng)用程序拷貝到ramdiskramdisk中,然后重新制作中,然后重新制作ramdiskramdisk,并更新,并更新ramdiskramdisk文件系統(tǒng),文件系統(tǒng),此時(shí)新的程序?qū)⒃谖募到y(tǒng)中。此時(shí)新的程序?qū)⒃谖募到y(tǒng)中。54Linux應(yīng)用程序運(yùn)行3Linux應(yīng)用程序設(shè)計(jì)q重新編譯內(nèi)核時(shí),通常將應(yīng)用程序添加到重新編譯內(nèi)核時(shí),通常將應(yīng)用程序添加到LinuxLinux文件系統(tǒng)文件系統(tǒng)的的binbin目錄,該目錄有全局路徑。
39、且該文件目錄,該目錄有全局路徑。且該文件應(yīng)該具有執(zhí)行屬性應(yīng)該具有執(zhí)行屬性,可以通過如下命令修改:可以通過如下命令修改:chmod 777 leddemochmod 777 leddemo在新內(nèi)核啟動(dòng)后,直接在命令行輸入文件名即可運(yùn)行。在新內(nèi)核啟動(dòng)后,直接在命令行輸入文件名即可運(yùn)行。q當(dāng)直接在當(dāng)直接在LinuxLinux控制臺(tái)中從主機(jī)上獲取應(yīng)用程序時(shí),必須控制臺(tái)中從主機(jī)上獲取應(yīng)用程序時(shí),必須保存到可寫的位置,且通過如下命令執(zhí)行該程序:保存到可寫的位置,且通過如下命令執(zhí)行該程序:././leddemoleddemo55配置Linux應(yīng)用程序啟動(dòng)后自動(dòng)運(yùn)行Linux應(yīng)用程序設(shè)計(jì)q如果需要在系統(tǒng)啟動(dòng)以
40、后自動(dòng)運(yùn)行如果需要在系統(tǒng)啟動(dòng)以后自動(dòng)運(yùn)行helloworldhelloworld程序,需要程序,需要編輯編輯ramdiskramdisk中的啟動(dòng)腳本文件,該文件為中的啟動(dòng)腳本文件,該文件為root/rd/etc/init.d/rcSroot/rd/etc/init.d/rcS使用使用vivi編輯器編輯,在該文件最后添加如下腳本:編輯器編輯,在該文件最后添加如下腳本:/ /bin/helloworldbin/helloworld該腳本將啟動(dòng)后運(yùn)行該腳本將啟動(dòng)后運(yùn)行helloworldhelloworld ,直到程序退出?;颍钡匠绦蛲顺??;? /bin/ helloworldbin/ hello
41、world & &它將在它將在后臺(tái)運(yùn)行后臺(tái)運(yùn)行helloworldhelloworld,不影響其他的程序運(yùn)行。,不影響其他的程序運(yùn)行。56linux驅(qū)動(dòng)程序Linux驅(qū)動(dòng)程序設(shè)計(jì)qLinuxLinux下對(duì)外設(shè)的訪問只能通過驅(qū)動(dòng)程序進(jìn)行下對(duì)外設(shè)的訪問只能通過驅(qū)動(dòng)程序進(jìn)行qLinuxLinux具有統(tǒng)一的驅(qū)動(dòng)程序接口,以文件操作的方式管理驅(qū)具有統(tǒng)一的驅(qū)動(dòng)程序接口,以文件操作的方式管理驅(qū)動(dòng)程序動(dòng)程序,如:,如:openopen、readread、writewrite、ioctlioctlq驅(qū)動(dòng)程序是內(nèi)核的一部分,可以使用中斷、驅(qū)動(dòng)程序是內(nèi)核的一部分,可以使用中斷、DMADMA等操作等操
42、作q驅(qū)動(dòng)程序需要在用戶態(tài)和內(nèi)核態(tài)之間傳遞數(shù)據(jù)驅(qū)動(dòng)程序需要在用戶態(tài)和內(nèi)核態(tài)之間傳遞數(shù)據(jù)57Linux驅(qū)動(dòng)程序Linux驅(qū)動(dòng)程序設(shè)計(jì)qLinuxLinux屏蔽了應(yīng)用層對(duì)外設(shè)的直接訪問屏蔽了應(yīng)用層對(duì)外設(shè)的直接訪問,不能在用戶態(tài)直,不能在用戶態(tài)直接進(jìn)行如下操作:接進(jìn)行如下操作:* *(unsigned char unsigned char * *)0 x02000006) =0 x3e;)0 x02000006) =0 x3e;qLinuxLinux下用戶態(tài)無法處理中斷下用戶態(tài)無法處理中斷qLinuxLinux下對(duì)外設(shè)的訪問推薦采用驅(qū)動(dòng)程序進(jìn)行,在內(nèi)核態(tài)下對(duì)外設(shè)的訪問推薦采用驅(qū)動(dòng)程序進(jìn)行,在內(nèi)核態(tài)編寫
43、驅(qū)動(dòng)程序(包括直接對(duì)外設(shè)操作、處理中斷等),用戶編寫驅(qū)動(dòng)程序(包括直接對(duì)外設(shè)操作、處理中斷等),用戶態(tài)通過標(biāo)準(zhǔn)驅(qū)動(dòng)程序調(diào)用方法進(jìn)行操作。態(tài)通過標(biāo)準(zhǔn)驅(qū)動(dòng)程序調(diào)用方法進(jìn)行操作。58Linux驅(qū)動(dòng)程序編譯方式Linux驅(qū)動(dòng)程序設(shè)計(jì)qLinuxLinux中驅(qū)動(dòng)程序的使用可以按照兩種方式編譯:中驅(qū)動(dòng)程序的使用可以按照兩種方式編譯:q一種是一種是靜態(tài)編譯進(jìn)內(nèi)核靜態(tài)編譯進(jìn)內(nèi)核q另一種是編譯成模塊以供另一種是編譯成模塊以供動(dòng)態(tài)加載動(dòng)態(tài)加載q由于由于LinuxLinux不支持模塊動(dòng)態(tài)加載不支持模塊動(dòng)態(tài)加載,而且嵌入式,而且嵌入式LinuxLinux不能不能夠象桌面夠象桌面LinuxLinux那樣靈活的使用那樣靈
44、活的使用insmod/rmmodinsmod/rmmod加載卸載設(shè)備驅(qū)加載卸載設(shè)備驅(qū)動(dòng)程序,因而通常在動(dòng)程序,因而通常在LinuxLinux中將設(shè)備驅(qū)動(dòng)程序靜態(tài)編譯進(jìn)內(nèi)核。中將設(shè)備驅(qū)動(dòng)程序靜態(tài)編譯進(jìn)內(nèi)核。59Linux下設(shè)備驅(qū)動(dòng)程序分類Linux驅(qū)動(dòng)程序設(shè)計(jì)q字符設(shè)備字符設(shè)備:是指存取時(shí)沒有緩存的設(shè)備。典型的字符設(shè):是指存取時(shí)沒有緩存的設(shè)備。典型的字符設(shè)備包括鼠標(biāo),鍵盤,串行口等。備包括鼠標(biāo),鍵盤,串行口等。q塊設(shè)備塊設(shè)備:塊設(shè)備的讀寫都有緩存來支持,并且塊設(shè)備必:塊設(shè)備的讀寫都有緩存來支持,并且塊設(shè)備必須能夠隨機(jī)存取須能夠隨機(jī)存取(random(randomaccess) access) 。
45、典型的塊設(shè)備主要包括。典型的塊設(shè)備主要包括硬盤軟盤設(shè)備,硬盤軟盤設(shè)備,CD-ROMCD-ROM等。等。q網(wǎng)絡(luò)設(shè)備網(wǎng)絡(luò)設(shè)備:LinuxLinux的網(wǎng)絡(luò)系統(tǒng)主要是基于的網(wǎng)絡(luò)系統(tǒng)主要是基于BSDBSDunixunix的的socketsocket機(jī)制。在系統(tǒng)和驅(qū)動(dòng)程序之間定義有專門的數(shù)據(jù)結(jié)構(gòu)機(jī)制。在系統(tǒng)和驅(qū)動(dòng)程序之間定義有專門的數(shù)據(jù)結(jié)構(gòu)( (sksk_buff)_buff)進(jìn)行數(shù)據(jù)的傳遞。系統(tǒng)里支持對(duì)發(fā)送數(shù)據(jù)和接收數(shù)進(jìn)行數(shù)據(jù)的傳遞。系統(tǒng)里支持對(duì)發(fā)送數(shù)據(jù)和接收數(shù)據(jù)的緩存,提供流量控制機(jī)制,提供對(duì)多協(xié)議的支持。據(jù)的緩存,提供流量控制機(jī)制,提供對(duì)多協(xié)議的支持。60Linux下設(shè)備驅(qū)動(dòng)程序組成Linux驅(qū)動(dòng)程
46、序設(shè)計(jì)q自動(dòng)配置和初始化子程序自動(dòng)配置和初始化子程序:負(fù)責(zé)檢測(cè)所要驅(qū)動(dòng)的硬件設(shè)備是否存在和是否能正常工負(fù)責(zé)檢測(cè)所要驅(qū)動(dòng)的硬件設(shè)備是否存在和是否能正常工作。如果該設(shè)備正常,則對(duì)這個(gè)設(shè)備及其相關(guān)的、設(shè)備作。如果該設(shè)備正常,則對(duì)這個(gè)設(shè)備及其相關(guān)的、設(shè)備驅(qū)動(dòng)程序需要的軟件狀態(tài)進(jìn)行初始化。這部分驅(qū)動(dòng)程序驅(qū)動(dòng)程序需要的軟件狀態(tài)進(jìn)行初始化。這部分驅(qū)動(dòng)程序僅在初始化的時(shí)候被調(diào)用一次。僅在初始化的時(shí)候被調(diào)用一次。q服務(wù)于服務(wù)于I/OI/O請(qǐng)求的子程序請(qǐng)求的子程序:調(diào)用這部分是由于系統(tǒng)調(diào)用的結(jié)果。這部分程序在執(zhí)行調(diào)用這部分是由于系統(tǒng)調(diào)用的結(jié)果。這部分程序在執(zhí)行的時(shí)候,系統(tǒng)仍認(rèn)為是和進(jìn)行調(diào)用的進(jìn)程屬于同一個(gè)進(jìn)的時(shí)候
47、,系統(tǒng)仍認(rèn)為是和進(jìn)行調(diào)用的進(jìn)程屬于同一個(gè)進(jìn)程,只是由用戶態(tài)變成了核心態(tài),具有進(jìn)行此系統(tǒng)調(diào)用程,只是由用戶態(tài)變成了核心態(tài),具有進(jìn)行此系統(tǒng)調(diào)用的用戶程序的運(yùn)行環(huán)境,因此可以在其中調(diào)用的用戶程序的運(yùn)行環(huán)境,因此可以在其中調(diào)用sleep()sleep()等與進(jìn)程運(yùn)行環(huán)境有關(guān)的函數(shù)。等與進(jìn)程運(yùn)行環(huán)境有關(guān)的函數(shù)。q中斷服務(wù)子程序中斷服務(wù)子程序:61Linux下設(shè)備驅(qū)動(dòng)程序I/O設(shè)備入口點(diǎn)1Linux驅(qū)動(dòng)程序設(shè)計(jì)q在系統(tǒng)內(nèi)部,在系統(tǒng)內(nèi)部,I/OI/O設(shè)備的存取通過一組固定的入口點(diǎn)來進(jìn)設(shè)備的存取通過一組固定的入口點(diǎn)來進(jìn)行,這組入口點(diǎn)是由每個(gè)設(shè)備的設(shè)備驅(qū)動(dòng)程序提供的。一般行,這組入口點(diǎn)是由每個(gè)設(shè)備的設(shè)備驅(qū)動(dòng)程序
48、提供的。一般來說,字符型設(shè)備驅(qū)動(dòng)程序能夠提供如下幾個(gè)入口點(diǎn):來說,字符型設(shè)備驅(qū)動(dòng)程序能夠提供如下幾個(gè)入口點(diǎn):qopenopen:打開設(shè)備準(zhǔn)備:打開設(shè)備準(zhǔn)備I/OI/O操作。對(duì)字符特別設(shè)備文件進(jìn)行操作。對(duì)字符特別設(shè)備文件進(jìn)行打開操作,都會(huì)調(diào)用設(shè)備的打開操作,都會(huì)調(diào)用設(shè)備的openopen入口點(diǎn)。入口點(diǎn)。openopen子程序必須對(duì)子程序必須對(duì)將要進(jìn)行的將要進(jìn)行的I/OI/O操作做好必要的準(zhǔn)備工作,如清除緩沖區(qū)等。操作做好必要的準(zhǔn)備工作,如清除緩沖區(qū)等。如果設(shè)備是獨(dú)占的,即同一時(shí)刻只能有一個(gè)程序訪問此設(shè)備,如果設(shè)備是獨(dú)占的,即同一時(shí)刻只能有一個(gè)程序訪問此設(shè)備,則則openopen子程序必須設(shè)置一些
49、標(biāo)志以表示設(shè)備處于忙狀態(tài)。子程序必須設(shè)置一些標(biāo)志以表示設(shè)備處于忙狀態(tài)。qcloseclose:關(guān)閉一個(gè)設(shè)備。當(dāng)最后一次使用設(shè)備終結(jié)后,調(diào):關(guān)閉一個(gè)設(shè)備。當(dāng)最后一次使用設(shè)備終結(jié)后,調(diào)用用closeclose子程序。獨(dú)占設(shè)備必須標(biāo)記設(shè)備可再次使用。子程序。獨(dú)占設(shè)備必須標(biāo)記設(shè)備可再次使用。qReadRead:從設(shè)備上讀數(shù)據(jù)。對(duì)于有緩沖區(qū)的:從設(shè)備上讀數(shù)據(jù)。對(duì)于有緩沖區(qū)的I/OI/O操作,一般操作,一般是從緩沖區(qū)里讀數(shù)據(jù)。對(duì)字符特別設(shè)備文件進(jìn)行讀操作將調(diào)是從緩沖區(qū)里讀數(shù)據(jù)。對(duì)字符特別設(shè)備文件進(jìn)行讀操作將調(diào)用用readread子程序。子程序。62Linux下設(shè)備驅(qū)動(dòng)程序I/O設(shè)備入口點(diǎn)2Linux驅(qū)動(dòng)程
50、序設(shè)計(jì)qwritewrite:往設(shè)備上寫數(shù)據(jù)。對(duì)于有緩沖區(qū)的:往設(shè)備上寫數(shù)據(jù)。對(duì)于有緩沖區(qū)的I/OI/O操作,一操作,一般是把數(shù)據(jù)寫入緩沖區(qū)里。對(duì)字符特別設(shè)備文件進(jìn)行寫操作般是把數(shù)據(jù)寫入緩沖區(qū)里。對(duì)字符特別設(shè)備文件進(jìn)行寫操作將調(diào)用將調(diào)用writewrite子程序。子程序。qioctlioctl:執(zhí)行讀、寫之外的操作。:執(zhí)行讀、寫之外的操作。qselectselect:檢查設(shè)備,看數(shù)據(jù)是否可讀或設(shè)備是否可用于:檢查設(shè)備,看數(shù)據(jù)是否可讀或設(shè)備是否可用于寫數(shù)據(jù)。寫數(shù)據(jù)。selectselect系統(tǒng)調(diào)用在檢查與設(shè)備特別文件相關(guān)的文件系統(tǒng)調(diào)用在檢查與設(shè)備特別文件相關(guān)的文件描述符時(shí)使用描述符時(shí)使用sele
51、ctselect入口點(diǎn)。如果設(shè)備驅(qū)動(dòng)程序沒有提供上入口點(diǎn)。如果設(shè)備驅(qū)動(dòng)程序沒有提供上述入口點(diǎn)中的某一個(gè),系統(tǒng)會(huì)用缺省的子程序來代替。對(duì)于述入口點(diǎn)中的某一個(gè),系統(tǒng)會(huì)用缺省的子程序來代替。對(duì)于不同的系統(tǒng),也還有一些其它的入口點(diǎn)。不同的系統(tǒng),也還有一些其它的入口點(diǎn)。63Linux下設(shè)備注冊(cè)1Linux驅(qū)動(dòng)程序設(shè)計(jì)q設(shè)備驅(qū)動(dòng)程序所提供的入口點(diǎn),在設(shè)備驅(qū)動(dòng)程序初始化設(shè)備驅(qū)動(dòng)程序所提供的入口點(diǎn),在設(shè)備驅(qū)動(dòng)程序初始化的時(shí)候向系統(tǒng)進(jìn)行登記,以便系統(tǒng)在適當(dāng)?shù)臅r(shí)候調(diào)用。的時(shí)候向系統(tǒng)進(jìn)行登記,以便系統(tǒng)在適當(dāng)?shù)臅r(shí)候調(diào)用。LinuxLinux系統(tǒng)里,通過調(diào)用系統(tǒng)里,通過調(diào)用register_chrdevregister
52、_chrdev向系統(tǒng)注冊(cè)字符型設(shè)備驅(qū)向系統(tǒng)注冊(cè)字符型設(shè)備驅(qū)動(dòng)程序。動(dòng)程序。register_chrdevregister_chrdev定義為:定義為:# #include linux/fsinclude .h#include linux/errno#include .hint register_chrdev(unsigned int major, const char int register_chrdev(unsigned int major, const char * *name,name, struct struct file_operations file_operations * *
53、fops);fops);q其中,其中,majormajor是為設(shè)備驅(qū)動(dòng)程序向系統(tǒng)申請(qǐng)的主設(shè)備號(hào),是為設(shè)備驅(qū)動(dòng)程序向系統(tǒng)申請(qǐng)的主設(shè)備號(hào),如果為如果為0 0則系統(tǒng)為此驅(qū)動(dòng)程序動(dòng)態(tài)地分配一個(gè)主設(shè)備號(hào)。則系統(tǒng)為此驅(qū)動(dòng)程序動(dòng)態(tài)地分配一個(gè)主設(shè)備號(hào)。namename是設(shè)備名。是設(shè)備名。fopsfops是該驅(qū)動(dòng)各個(gè)的入口點(diǎn)的文件操作結(jié)構(gòu)指針。是該驅(qū)動(dòng)各個(gè)的入口點(diǎn)的文件操作結(jié)構(gòu)指針。64Linux下設(shè)備注冊(cè)2Linux驅(qū)動(dòng)程序設(shè)計(jì)q此函數(shù)返回此函數(shù)返回0 0表示成功。返回表示成功。返回-EINVAL-EINVAL表示申請(qǐng)的主設(shè)備表示申請(qǐng)的主設(shè)備號(hào)非法,一般來說是主設(shè)備號(hào)大于系統(tǒng)所允許的最大設(shè)備號(hào)。號(hào)非法,一般來
54、說是主設(shè)備號(hào)大于系統(tǒng)所允許的最大設(shè)備號(hào)。返回返回-EBUSY-EBUSY表示所申請(qǐng)的主設(shè)備號(hào)正在被其它設(shè)備驅(qū)動(dòng)程序表示所申請(qǐng)的主設(shè)備號(hào)正在被其它設(shè)備驅(qū)動(dòng)程序使用。如果是動(dòng)態(tài)分配主設(shè)備號(hào)成功,此函數(shù)將返回所分配使用。如果是動(dòng)態(tài)分配主設(shè)備號(hào)成功,此函數(shù)將返回所分配的主設(shè)備號(hào)。如果的主設(shè)備號(hào)。如果register_chrdevregister_chrdev操作成功,設(shè)備名就會(huì)出操作成功,設(shè)備名就會(huì)出現(xiàn)在現(xiàn)在/proc/devices/proc/devices文件里。文件里。q初始化部分一般還負(fù)責(zé)給設(shè)備驅(qū)動(dòng)程序申請(qǐng)系統(tǒng)資源,初始化部分一般還負(fù)責(zé)給設(shè)備驅(qū)動(dòng)程序申請(qǐng)系統(tǒng)資源,包括內(nèi)存、中斷、時(shí)鐘、包括內(nèi)存
55、、中斷、時(shí)鐘、I/OI/O端口等,這些資源也可以在端口等,這些資源也可以在openopen子程序或別的地方申請(qǐng)。在這些資源不用的時(shí)候,應(yīng)該釋放子程序或別的地方申請(qǐng)。在這些資源不用的時(shí)候,應(yīng)該釋放它們,以利于資源的共享。它們,以利于資源的共享。65Linux下中斷處理Linux驅(qū)動(dòng)程序設(shè)計(jì)q在在LinuxLinux系統(tǒng)里,對(duì)中斷的處理是屬于系統(tǒng)核心的部分,系統(tǒng)里,對(duì)中斷的處理是屬于系統(tǒng)核心的部分,因此如果設(shè)備與系統(tǒng)之間以中斷方式進(jìn)行數(shù)據(jù)交換的話,就因此如果設(shè)備與系統(tǒng)之間以中斷方式進(jìn)行數(shù)據(jù)交換的話,就必須把該設(shè)備的驅(qū)動(dòng)程序作為系統(tǒng)核心的一部分。設(shè)備驅(qū)動(dòng)必須把該設(shè)備的驅(qū)動(dòng)程序作為系統(tǒng)核心的一部分。設(shè)
56、備驅(qū)動(dòng)程序通過調(diào)用程序通過調(diào)用request_irqrequest_irq函數(shù)來申請(qǐng)中斷,通過函數(shù)來申請(qǐng)中斷,通過free_irqfree_irq來來釋放中斷。釋放中斷。66Linux下內(nèi)存分配、釋放Linux驅(qū)動(dòng)程序設(shè)計(jì)q作為系統(tǒng)核心的一部分,作為系統(tǒng)核心的一部分,設(shè)備驅(qū)動(dòng)程序在申請(qǐng)和釋放內(nèi)設(shè)備驅(qū)動(dòng)程序在申請(qǐng)和釋放內(nèi)存時(shí)不是調(diào)用存時(shí)不是調(diào)用mallocmalloc和和freefree,而代之以調(diào)用,而代之以調(diào)用kmallockmalloc和和kfreekfree,它們被定義為:它們被定義為:# #include linuxinclude /kernel.hvoid void * * kmal
57、loc(unsigned int len, int kmalloc(unsigned int len, int priority); priority);void kfree(void void kfree(void * * obj obj););q參數(shù)參數(shù)lenlen為希望申請(qǐng)的字節(jié)數(shù),為希望申請(qǐng)的字節(jié)數(shù),objobj為要釋放的內(nèi)存指針。為要釋放的內(nèi)存指針。prioritypriority為分配內(nèi)存操作的優(yōu)先級(jí),即在沒有足夠空閑內(nèi)存為分配內(nèi)存操作的優(yōu)先級(jí),即在沒有足夠空閑內(nèi)存時(shí)如何操作,一般用時(shí)如何操作,一般用GFP_KERNELGFP_KERNEL。67Linux下內(nèi)存分配、釋放Linux
58、驅(qū)動(dòng)程序設(shè)計(jì)q使用一個(gè)沒有申請(qǐng)的使用一個(gè)沒有申請(qǐng)的I/OI/O端口不會(huì)使端口不會(huì)使CPUCPU產(chǎn)生異常,也就產(chǎn)生異常,也就不會(huì)導(dǎo)致諸如不會(huì)導(dǎo)致諸如“segmentation fault”segmentation fault”一類的錯(cuò)誤發(fā)生。任一類的錯(cuò)誤發(fā)生。任何進(jìn)程都可以訪問任何一個(gè)何進(jìn)程都可以訪問任何一個(gè)I/OI/O端口。此時(shí)系統(tǒng)無法保證對(duì)端口。此時(shí)系統(tǒng)無法保證對(duì)I/OI/O端口的操作不會(huì)發(fā)生沖突,甚至?xí)虼硕瓜到y(tǒng)崩潰。端口的操作不會(huì)發(fā)生沖突,甚至?xí)虼硕瓜到y(tǒng)崩潰。q因此,在使用因此,在使用I/OI/O端口前,應(yīng)該檢查此端口前,應(yīng)該檢查此I/OI/O端口是否已有端口是否已有別的程序在使用
59、,若沒有,再把此端口標(biāo)記為正在使用,在別的程序在使用,若沒有,再把此端口標(biāo)記為正在使用,在使用完以后釋放它。使用完以后釋放它。intint check_regioncheck_region(unsigned int from, unsigned int(unsigned int from, unsigned int extent); extent);void void request_regionrequest_region(unsigned int from, unsigned int(unsigned int from, unsigned int extent, extent, const
60、 char const char * *name);name);void void release_regionrelease_region(unsigned int from, unsigned int(unsigned int from, unsigned int extent); extent);68Linux下開關(guān)中斷函數(shù)Linux驅(qū)動(dòng)程序設(shè)計(jì)q在設(shè)備驅(qū)動(dòng)程序里,通過如下函數(shù)實(shí)現(xiàn)打開和關(guān)閉中斷在設(shè)備驅(qū)動(dòng)程序里,通過如下函數(shù)實(shí)現(xiàn)打開和關(guān)閉中斷功能:功能:# #include asminclude /system.h#define #define clicli() _asm_ _volatile_ (cl
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 酒店管理晉升路徑
- 酒店管理工作目標(biāo)
- All Touch移動(dòng)信息化管理平臺(tái)介紹課件
- 2025-2030全球動(dòng)畫工作室行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025年全球及中國超細(xì)玻璃棉行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 2025-2030全球機(jī)器人電子皮膚行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025年全球及中國光伏增效膜行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 2025年全球及中國近紅外(NIR)超透鏡行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 2025年全球及中國3D感知數(shù)智化解決方案行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 2025-2030全球數(shù)字布局軟件行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 食堂項(xiàng)目組織架構(gòu)圖
- 食材配送公司機(jī)構(gòu)設(shè)置及崗位職責(zé)
- 2023年版一級(jí)建造師-水利工程實(shí)務(wù)電子教材
- 房地產(chǎn)工程管理 -中建八局機(jī)電工程質(zhì)量通病治理辦法
- GB/T 6403.4-2008零件倒圓與倒角
- GB/T 2518-2019連續(xù)熱鍍鋅和鋅合金鍍層鋼板及鋼帶
- 企業(yè)合規(guī)管理-課件
- 火電廠安全工作規(guī)程
- GB∕T 33047.1-2016 塑料 聚合物熱重法(TG) 第1部分:通則
- 特發(fā)性肺纖維化IPF
- FIDIC國際合同條款中英文對(duì)照.doc
評(píng)論
0/150
提交評(píng)論