




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、2021-11-21湘潭大學鄧清勇基于ARM和linux的開發2提綱Linux簡介Linux驅動程序設計Linux內核移植Linux開發過程 基于ARM和Linux的開發Linux上的圖形系統Linux開發環境建立Linux應用程序設計3LinuxLinux簡介qLinux與與UNIX系統兼容,開放源代碼。系統兼容,開放源代碼。qLinux原本被設計為桌面系統,現在廣泛應用于服務器領原本被設計為桌面系統,現在廣泛應用于服務器領域。而更大的影響在于它正逐漸應用于嵌入式設備。域。而更大的影響在于它正逐漸應用于嵌入式設備。Linux可以說是最早的嵌入式可以說是最早的嵌入式Linux發行版本。它是為沒
2、有發行版本。它是為沒有MMU的的處理器而設計的,進而發展了一個完整的開發平臺,包括編處理器而設計的,進而發展了一個完整的開發平臺,包括編譯、調試等工具。譯、調試等工具。4LinuxLinux簡介qLinux具有如下特性:具有如下特性:開源開源免費免費高度可裁剪:通常內核高度可裁剪:通常內核小于小于 512KBytes,文件系統可,文件系統可從幾十從幾十KBytes到幾到幾Mbytes不等,視應用程序大小而定。不等,視應用程序大小而定。q具有大量的開源的具有大量的開源的linux應用程序和驅動程序,并可應用程序和驅動程序,并可以方便地移植到各種平臺,包括以方便地移植到各種平臺,包括ARM平臺平臺
3、5Linux與uC/OS-II的區別 功能性Linux簡介qLinux包含一整套的編譯、調試等開發工具、內核源包含一整套的編譯、調試等開發工具、內核源代碼、各種文件系統、圖形接口、各種協議、驅動程序代碼、各種文件系統、圖形接口、各種協議、驅動程序以及豐富的應用程序。以及豐富的應用程序。q而而uC/OS-II確切的來說只是一個確切的來說只是一個微內核微內核,僅僅包含多,僅僅包含多任務調度、簡單內存管理等基本的多任務操作系統元素,任務調度、簡單內存管理等基本的多任務操作系統元素,且多任務調度算法和內存管理等都比較簡單。對于想實現且多任務調度算法和內存管理等都比較簡單。對于想實現GUI、FS、協議等
4、都必須另外購買或者移植,對于設備驅、協議等都必須另外購買或者移植,對于設備驅動程序沒有提供專門統一的接口。動程序沒有提供專門統一的接口。6Linux與uC/OS-II的區別 開發工具Linux簡介qLinux發布中包含了編譯器和調試器等工具,它們都發布中包含了編譯器和調試器等工具,它們都采用采用GCC編譯器編譯器,匯編語法一致。,匯編語法一致。quC/OS-II沒有指定編譯器,在不同的平臺下使用該沒有指定編譯器,在不同的平臺下使用該平臺下的編譯器,而各個編譯器,其匯編語法不同,因平臺下的編譯器,而各個編譯器,其匯編語法不同,因此,在不同類型平臺下,匯編程序不一致。此,在不同類型平臺下,匯編程序
5、不一致。7Linux與uC/OS-II的區別 開發資源Linux簡介q在開發上,在開發上,Linux采用統一的采用統一的API調用,接口文檔齊調用,接口文檔齊全,書籍、網上資源也比較多。全,書籍、網上資源也比較多。quC/OS-II雖沒有標準的雖沒有標準的API接口,但是其內核非常簡接口,但是其內核非常簡單、簡潔,且書籍、網上資源也非常豐富。單、簡潔,且書籍、網上資源也非常豐富。8Linux與uC/OS-II的區別 移植性Linux簡介qLinux發布中包含了多種平臺下的移植,可以發布中包含了多種平臺下的移植,可以通過配通過配置內核選擇體系結構和裁剪內核置內核選擇體系結構和裁剪內核。quC/O
6、S-II的不同平臺下的移植通過不同的移植代碼的不同平臺下的移植通過不同的移植代碼獨立發布,沒有一個統一的界面,通過宏定義進行內核獨立發布,沒有一個統一的界面,通過宏定義進行內核裁剪。裁剪。9Linux與uC/OS-II的區別 實時性Linux簡介qLinux內核不關心實時性問題內核不關心實時性問題,可以通過和,可以通過和RTLinux配合來實現實時。配合來實現實時。RTLinux處理實時任務,非實時任務由處理實時任務,非實時任務由linux完成完成RTLinux是為是為linux提供實時性的方法,同樣也適用提供實時性的方法,同樣也適用于于Linux。通過。通過RTLinux的的patch,可以
7、滿足,可以滿足Linux對實時對實時性的需求性的需求quC/OS-II采用占先式內核,實時性好采用占先式內核,實時性好10Linux映像(image)文件結構Linux開發過程qLinux映像由映像由內核內核(kernel)和和文件系統文件系統(fs)組成。組成。q可以將可以將kernel和和fs統一編譯到一個映像統一編譯到一個映像(image)文件中,也文件中,也可以將可以將kernel和和fs獨立地放置于不同的映像文件中獨立地放置于不同的映像文件中(燒寫到(燒寫到FLASH的不同區域),這需要通過修改的不同區域),這需要通過修改Makefile文件和內核文件和內核中的文件系統加載代碼實現。
8、中的文件系統加載代碼實現。q本系統中本系統中kernel和和fs分別位于不同的映像文件中。分分別位于不同的映像文件中。分別為(別為(ramdisk.gz和和zImage)qLinux支持支持壓縮核心壓縮核心(zImage),它是對原核心映像文件,它是對原核心映像文件(linux.bin)進行壓縮,并在壓縮后的文件頭部添加一段解壓縮進行壓縮,并在壓縮后的文件頭部添加一段解壓縮代碼。在該程序運行時,先運行這段解壓縮代碼將程序解壓代碼。在該程序運行時,先運行這段解壓縮代碼將程序解壓縮到縮到Linux核心運行地址,完成后,跳轉到核心運行。核心運行地址,完成后,跳轉到核心運行。11Linux內核組成Li
9、nux開發過程q初始化程序段初始化程序段(init段段) 約約32KBytes。q數據段數據段(data) 50100KBytes左右。左右。q代碼段代碼段(text) 300KBytes左右左右 q如果如果kernel和和fs編譯在一起,內核映像還包含文件系統編譯在一起,內核映像還包含文件系統(romfs) 80KBytesq未初始化數據段未初始化數據段(bss) 100150KBytes左右。左右。12Linux開發步驟Linux開發過程qBOOTLOADER開發開發qLinux開發環境建立開發環境建立qLinux內核移植內核移植q應用程序開發應用程序開發13支持Linux開發的BOOTL
10、OADERLinux開發過程q引導引導Linuxq燒寫燒寫Linux內核映像和文件系統內核映像和文件系統q初始化硬件初始化硬件14GNU交叉編譯Linux開發環境建立qLinux采用采用GNU交叉編譯器交叉編譯器qGNU的交叉編譯器,包括以下組件:的交叉編譯器,包括以下組件:1. Gcc交叉編譯器,即在宿主機上開發編譯目標上可交叉編譯器,即在宿主機上開發編譯目標上可運行的二進制文件;運行的二進制文件;2. Binutils輔助工具,包括輔助工具,包括objdump、objcopy等;等;3. Gdb調試器。調試器。q對于對于ARM可以采用如下兩個版本的編譯器:可以采用如下兩個版本的編譯器:ar
11、m-elf-arm-linux-15arm-elf- 交叉編譯器Linux開發環境建立qarm-elf-gccqarm-elf-ldqarm-elf-asqarm-elf-objdumpqarm-elf-objcopyqarm-elf-gdb16arm-linux- 交叉編譯器(推薦使用)Linux開發環境建立qarm-linux-gccqarm-linux-ldqarm-linux-asqarm-linux-objdumpqarm-linux-objcopyqarm-linux-gdb17選擇Linux開發環境Linux開發環境建立qWindows環境環境 + CygwinqWindows環
12、境環境 + VMWare虛擬機(安裝虛擬機(安裝RedHat 9.0)qLinux環境,推薦環境,推薦RedHat 9.0q單機模式(一臺計算機)單機模式(一臺計算機)q雙機模式(兩臺計算機)雙機模式(兩臺計算機)qWindows + Linux18在linux環境下進行Linux開發Linux開發環境建立q必須采用支持必須采用支持GDB的調試器(如的調試器(如ADT1000A)才能)才能進行調試,否則只能通過進行調試,否則只能通過BOOTLOADER進行簡單的程進行簡單的程序燒寫運行等序燒寫運行等q調試信息的打印可以通過串口完成,使用調試信息的打印可以通過串口完成,使用linux下的下的mi
13、nicom超級終端程序(類似于超級終端程序(類似于Windows上的超級終端工上的超級終端工具)接收并顯示目標板傳送的打印信息具)接收并顯示目標板傳送的打印信息qLinux的程序編輯、編譯、調試都在的程序編輯、編譯、調試都在Linux環境進行環境進行qLinux串口驅動完成后,可以通過內核打印函數串口驅動完成后,可以通過內核打印函數printk向串口打印信息,這是向串口打印信息,這是Linux內核調試過程中最有內核調試過程中最有效的手段效的手段19在Windows + Cygwin環境下進行Linux開發Linux開發環境建立qLinux內核配置和編譯等在內核配置和編譯等在Cygwin環境下運
14、行,程序環境下運行,程序編輯和調試都在編輯和調試都在Windows環境下進行環境下進行,必須采用支持,必須采用支持Windows下進行下進行linux調試的調試器(如調試的調試器(如ADT1000A)才)才能進行調試,否則只能通過能進行調試,否則只能通過BOOTLOADER進行簡單的進行簡單的程序燒寫運行等程序燒寫運行等q調試信息的打印可以通過串口完成,使用調試信息的打印可以通過串口完成,使用Windows上的超級終端工具接收并顯示目標板傳送的打印信息上的超級終端工具接收并顯示目標板傳送的打印信息qCygwin是運行于是運行于Windows中的一個應用程序,它可中的一個應用程序,它可以使得以使
15、得Linux環境下的應用程序可以在環境下的應用程序可以在Cygwin環境下進環境下進行編譯,即可以在行編譯,即可以在Windows進行編譯。進行編譯。20在Windows + VMWare虛擬機環境下進行Linux開發Linux開發環境建立q如果需要使用只支持如果需要使用只支持Windows環境下調試的調試器,環境下調試的調試器,可以通過在可以通過在VMWare中安裝中安裝linux虛擬機,在該虛擬機中虛擬機,在該虛擬機中進行編輯、編譯進行編輯、編譯Linux,然后通過網絡(,然后通過網絡(ftp、nfs、ssh)等手段傳送到等手段傳送到Windows中,進行調試,中,進行調試,這樣編譯和調試
16、這樣編譯和調試可以分別在可以分別在linux和和windows環境下但是是在一臺電腦中環境下但是是在一臺電腦中完成完成,它的缺點是系統要求較高,運行速度慢。,它的缺點是系統要求較高,運行速度慢。q也可以在兩臺電腦中分別安裝也可以在兩臺電腦中分別安裝linux和和windows,分別,分別實現編譯和調試。實現編譯和調試。qVMWare是運行于是運行于Windows中的一個應用程序,是中的一個應用程序,是一個虛擬機,可以在其上安裝多個操作系統,相當于在一個虛擬機,可以在其上安裝多個操作系統,相當于在Windows上安裝一個虛擬的操作系統。上安裝一個虛擬的操作系統。21Linux內核移植Linux內
17、核移植qLinux內核的移植可以分為內核的移植可以分為板級移植板級移植和和片級移植片級移植。q對于對于Linux發行版本中已經支持的發行版本中已經支持的CPU通常只需要針對板級通常只需要針對板級硬件進行適當的修改即可,這種移植叫做板級移植。硬件進行適當的修改即可,這種移植叫做板級移植。q而對于而對于Linux發行版本中沒有支持的發行版本中沒有支持的CPU則需要添加相應則需要添加相應CPU的內核移植,這種移植叫做片級移植。的內核移植,這種移植叫做片級移植。q片級移植相對板級移植來說要復雜許多,本系統采用的片級移植相對板級移植來說要復雜許多,本系統采用的Linux 發行版本中已經包含發行版本中已經
18、包含S3C2410X ARM920T處理器的移植處理器的移植包,因此,只需要在其上進行包,因此,只需要在其上進行Linux板級移植的基本過程和方法。板級移植的基本過程和方法。22Linux內核的目錄結構Linux內核移植linuxDocumentationarchdriversfsincludeinitmmnommulibnetscript幫助文檔體系結構相關源代碼驅動程序文件系統頭文件kernel初始化Linux內存管理常用函數網絡協議源代碼腳本文件23Linux內核的arch目錄Linux內核移植armnommubootkernellibmach-s3c2410vmlinux.lds壓縮內
19、核啟動引導代碼內核起始代碼常用函數s3c2410平臺相關代碼核心的連接腳本文件q與架構和平臺相關的源代碼都放在與架構和平臺相關的源代碼都放在archarch目錄下,對目錄下,對于于ARMARM的的LinuxLinux,包含于,包含于archarch目錄下的目錄下的armarm子目錄中。子目錄中。24Linux內核的arch目錄Linux內核移植q當使用壓縮核心時,當使用壓縮核心時,bootboot目錄下包含壓縮和解壓核心的源目錄下包含壓縮和解壓核心的源代碼和代碼和MakefileMakefile文件。文件。qkernelkernel目錄的目錄的entry-armv.Sentry-armv.S中
20、為未壓縮內核的起始執行文中為未壓縮內核的起始執行文件,內核從其第一條指令處執行。件,內核從其第一條指令處執行。qvmlinux.ldsvmlinux.lds文件為核心的連接腳本文件,壓縮核心解壓文件為核心的連接腳本文件,壓縮核心解壓后必須解壓縮到該文件指定的地址。后必須解壓縮到該文件指定的地址。25Linux內核移植Linux內核移植q配置內核配置內核q編譯內核編譯內核q下載、運行、調試內核下載、運行、調試內核26配置Linux內核Linux內核移植qmake configmake configqmake menuconfigmake menuconfigqmake xconfigmake x
21、config27make configLinux內核移植28make menuconfigLinux內核移植29make xconfigLinux內核移植30Linux常用配置選項Linux內核移植q系統及其存儲器配置系統及其存儲器配置q網絡支持網絡支持q顯示器支持顯示器支持q觸摸屏支持觸摸屏支持31系統及其存儲器配置Linux內核移植q在在System TypeSystem Type菜單中中進行配置菜單中中進行配置選擇系統類型處理器型號選擇處理器其它特性(USB支持等)32網絡支持Linux內核移植q在在Networking optionsNetworking options以及以及Netw
22、ork device supportNetwork device support中進行配置中進行配置 選擇支持TCP/IP協議33網絡支持Linux內核移植q在在Network device supportNetwork device support配置中,添加選配置中,添加選項項Network device supportNetwork device support,并在,并在Ethernet(10 or Ethernet(10 or 100Mbit)100Mbit)中選擇中選擇Other ISA cardsOther ISA cards,如下圖所示選擇,如下圖所示選擇NE2000/NE10
23、00 supportNE2000/NE1000 support采用RTL8019網卡芯片,為NE2000兼容網卡芯片,因此,選擇該網卡34顯示器支持Linux內核移植q在在Character devices以及以及Console drivers中中進行配置。進行配置。q在在Character devicesCharacter devices配置中,添加選項配置中,添加選項Virtual Virtual terminalterminal配置,如下圖所示。配置,如下圖所示。 Virtual terminal支持35顯示器支持Linux內核移植q在在Console drivers中添加中添加Supp
24、ort Frame buffer devices配置配置采用256色STN顯示器,因此必須選擇8bpp支持36觸摸屏支持Linux內核移植q在在Character devices的的Support S3C2410 TouchScreen子菜單中進行配置子菜單中進行配置選擇s3c2410觸摸屏支持37編譯Linux內核Linux內核移植q建立依賴關系建立依賴關系make depmake depq編譯內核編譯內核make make 編譯內核編譯內核make zImage make zImage 編譯壓縮核心(編譯壓縮核心(zImagezImage)編譯生成地編譯生成地LinuxLinux映像文件映
25、像文件zImagezImage通常保存在通常保存在arch/arm/boot/arch/arm/boot/目錄下目錄下38下載、運行和調試內核Linux內核移植q通過調試器下載內核并運行通過調試器下載內核并運行q通過通過BOOTLOADERBOOTLOADER下載內核到下載內核到SDRAMSDRAM中運行中運行q通過通過BOOTLOADERBOOTLOADER將內核燒寫到將內核燒寫到FLASHFLASH中,然后運行中,然后運行LinuxLinux39Linux調試手段Linux內核移植q在在LinuxLinux開發中,由于可能沒有標準鍵盤和顯示器支持,因開發中,由于可能沒有標準鍵盤和顯示器支持
26、,因此,通常通過串口將顯示信息發送到主機,由主機端超級終端此,通常通過串口將顯示信息發送到主機,由主機端超級終端工具接收,以完成顯示功能。同時在超級終端中可以輸入數據,工具接收,以完成顯示功能。同時在超級終端中可以輸入數據,然后由然后由LinuxLinux接收,以完成標準鍵盤功能。接收,以完成標準鍵盤功能。q調試過程中也可以通過串口將調試信息打印到超級終端,調試過程中也可以通過串口將調試信息打印到超級終端,這是這是LinuxLinux最有效和最簡單的方法。最有效和最簡單的方法。40Linux內核移植主要過程1Linux內核移植q對于板級移植,內核移植主要包括如下幾個部分:對于板級移植,內核移植
27、主要包括如下幾個部分:q內核配置,包括板級包配置,如內核配置,包括板級包配置,如S3C44B0X-MBA44S3C44B0X-MBA44q體系結構相關代碼修改,根據板級包的配置,修改相應體系結構相關代碼修改,根據板級包的配置,修改相應的體系結構相關代碼,包括:的體系結構相關代碼,包括:壓縮核心啟動代碼:壓縮核心啟動代碼:linux/arch/arm/boot/linux/arch/arm/boot/內核啟動代碼:內核啟動代碼:linux/arch/arm/kernel/linux/arch/arm/kernel/板級相關代碼:板級相關代碼:linux/arch/arm/mach-s3c2410
28、/linux/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內核移植主要過程2Linux內核移植q加載文件系統加載文件系統ramdiskramdiskq編寫驅動程序編寫驅動程序驅動程序目錄:驅動程序目錄:linux/drivers/linux
29、/drivers/網卡驅動程序:網卡驅動程序:linux/drivers/net/ne.clinux/drivers/net/ne.cLCDLCD驅動程序:驅動程序:linux/drivers/video/s3c2410fb.clinux/drivers/video/s3c2410fb.c觸摸屏驅動程序:觸摸屏驅動程序:linux/drivers/char/s3c2410-ts.clinux/drivers/char/s3c2410-ts.c42Linux啟動過程1Linux內核移植解壓縮核心核心打印信息內核命令行存儲器43Linux啟動過程2Linux內核移植IIC總線初始化Frame Bu
30、ffer顯示初始化44Linux啟動過程3Linux內核移植Linux控制臺45Linux文件系統Linux內核移植q文件系統指文件存在的物理空間。在文件系統指文件存在的物理空間。在LinuxLinux系統中,每個分系統中,每個分區都是一個文件系統,都有自己的目錄層次結構。區都是一個文件系統,都有自己的目錄層次結構。qLinuxLinux的最重要特征之一就是支持多種文件系統,這樣它的最重要特征之一就是支持多種文件系統,這樣它更加靈活,并可以和許多其它種操作系統共存。更加靈活,并可以和許多其它種操作系統共存。qVirtual File SystemVirtual File System(虛擬文件
31、系統)使得(虛擬文件系統)使得LinuxLinux可以支可以支持多個不同的文件系統。由于系統已將持多個不同的文件系統。由于系統已將LinuxLinux文件系統的所有文件系統的所有細節進行了轉換,所以細節進行了轉換,所以LinuxLinux核心的其它部分及系統中運行的核心的其它部分及系統中運行的程序將看到統一的文件系統。程序將看到統一的文件系統。qLinuxLinux的虛擬文件系統允許用戶同時能透明地安裝許多不的虛擬文件系統允許用戶同時能透明地安裝許多不同的文件系統。虛擬文件系統是為同的文件系統。虛擬文件系統是為LinuxLinux用戶提供快速且高效用戶提供快速且高效的文件訪問服務而設計的。的文
32、件訪問服務而設計的。 46常用Linux文件系統Linux內核移植qLinuxLinux系統核心可以支持十多種文件系統類型:系統核心可以支持十多種文件系統類型:JFSJFS、 extext、ext2ext2、ext3ext3、ISO9660ISO9660、XFSXFS、MinxMinx、MSDOSMSDOS、UMSDOSUMSDOS、VFATVFAT、NTFSNTFS、HPFSHPFS、NFSNFS、SMBSMB、SysVSysV、PROCPROC、romfsromfs等。等。47Linux內核移植的若干問題1Linux內核移植q源程序閱讀問題源程序閱讀問題1 1qLinuxLinux內核源代
33、碼非常多,且結構復雜,內核源代碼非常多,且結構復雜,LinuxLinux內核內核有接近有接近1000010000個文件,個文件,40000004000000行代碼。行代碼。q因此,閱讀因此,閱讀LinuxLinux時必須借助一些工具時必須借助一些工具Source insightSource insightUltraeditUltraedit等等qLinuxLinux內核使用內核使用GNU CGNU C,它在,它在ANSI CANSI C基礎上進行了一些基礎上進行了一些擴充,因此在許多編程習慣上與擴充,因此在許多編程習慣上與ANSI CANSI C不同。不同。q大量使用大量使用宏定義宏定義,且許
34、多宏定義非常復雜,這也在一,且許多宏定義非常復雜,這也在一定程度上增加了難度。定程度上增加了難度。48Linux內核移植的若干問題1Linux內核移植q源程序閱讀問題源程序閱讀問題2 2qLinuxLinux中并不是所有代碼都編譯進去,對于一個體系結構,中并不是所有代碼都編譯進去,對于一個體系結構,只有很少部分的代碼參與編譯,因此,必須掌握只有很少部分的代碼參與編譯,因此,必須掌握LinuxLinux發布中發布中各目錄的意義才能進一步清楚是否參與編譯。各目錄的意義才能進一步清楚是否參與編譯。q還可以通過查看還可以通過查看.o.o文件的方式查看當前參與編譯的文件的方式查看當前參與編譯的是哪個文件
35、,通常是哪個文件,通常xxx.cxxx.c文件生成的目標文件為文件生成的目標文件為xxx.oxxx.o,只有生成了只有生成了.o.o的文件才參與編譯,的文件才參與編譯,注意:這適合于大部注意:這適合于大部分情況,但是不是絕對的分情況,但是不是絕對的。qLinuxLinux中大量使用中大量使用條件編譯條件編譯,閱讀代碼時需要弄清楚,閱讀代碼時需要弄清楚,到底哪部分代碼參與編譯。到底哪部分代碼參與編譯。#ifdef xxx#ifdef xxx#elif#elif#endif#endif49Linux內核移植的若干問題2Linux內核移植qGNU CGNU Cq從從C+C+中吸收了中吸收了inlin
36、einline和和constconst等關鍵字。等關鍵字。qANSI CANSI C代碼與代碼與GNU CGNU C中的保留關鍵字沖突通過雙下劃中的保留關鍵字沖突通過雙下劃線線(_)(_)解決:如解決:如inlineinline等價于等價于_inline_inline_、asmasm等價于等價于_asm_asm_q結構體的初始化結構體的初始化50Linux內核移植的若干問題2Linux內核移植qGNU CGNU C結構體初始化結構體初始化結構體聲明ANSI C結構體初始化,必須按順序GNU C結構體初始化,無需按順序51Linux應用程序Linux應用程序設計q編寫程序編寫程序q編寫編寫Mak
37、efileMakefile文件文件q編譯編譯q運行運行52編寫Makefile文件Linux應用程序設計指定編譯器生成的執行文件和鏈接過程中的目標文件 編譯和鏈接的參數 編譯命令 拷貝helloworld映像文件到/tftpboot/examples中清除53Linux應用程序運行1Linux應用程序設計q應用程序運行可以采用如下兩種方式:應用程序運行可以采用如下兩種方式:q在在LinuxLinux內核啟動起來,并且有辦法從主機獲取文件時,內核啟動起來,并且有辦法從主機獲取文件時,可以在可以在LinuxLinux控制臺直接從主機獲取編譯后的應用程序。控制臺直接從主機獲取編譯后的應用程序。可以通
38、過可以通過ftpftp、nfsnfs、sshssh等方式達到。等方式達到。q也可以在編譯應用程序后將該應用程序拷貝到也可以在編譯應用程序后將該應用程序拷貝到ramdiskramdisk中,然后重新制作中,然后重新制作ramdiskramdisk,并更新,并更新ramdiskramdisk文件系統,文件系統,此時新的程序將在文件系統中。此時新的程序將在文件系統中。54Linux應用程序運行3Linux應用程序設計q重新編譯內核時,通常將應用程序添加到重新編譯內核時,通常將應用程序添加到LinuxLinux文件系統文件系統的的binbin目錄,該目錄有全局路徑。且該文件目錄,該目錄有全局路徑。且該
39、文件應該具有執行屬性應該具有執行屬性,可以通過如下命令修改:可以通過如下命令修改:chmod 777 leddemochmod 777 leddemo在新內核啟動后,直接在命令行輸入文件名即可運行。在新內核啟動后,直接在命令行輸入文件名即可運行。q當直接在當直接在LinuxLinux控制臺中從主機上獲取應用程序時,必須控制臺中從主機上獲取應用程序時,必須保存到可寫的位置,且通過如下命令執行該程序:保存到可寫的位置,且通過如下命令執行該程序:./leddemo./leddemo55配置Linux應用程序啟動后自動運行Linux應用程序設計q如果需要在系統啟動以后自動運行如果需要在系統啟動以后自動
40、運行helloworldhelloworld程序,需要程序,需要編輯編輯ramdiskramdisk中的啟動腳本文件,該文件為中的啟動腳本文件,該文件為root/rd/etc/init.d/rcSroot/rd/etc/init.d/rcS使用使用vivi編輯器編輯,在該文件最后添加如下腳本:編輯器編輯,在該文件最后添加如下腳本:/bin/helloworld/bin/helloworld該腳本將啟動后運行該腳本將啟動后運行helloworld helloworld ,直到程序退出。或,直到程序退出。或/bin/ helloworld &/bin/ helloworld &它將
41、在它將在后臺運行后臺運行helloworldhelloworld,不影響其他的程序運行。,不影響其他的程序運行。56linux驅動程序Linux驅動程序設計qLinuxLinux下對外設的訪問只能通過驅動程序進行下對外設的訪問只能通過驅動程序進行qLinuxLinux具有統一的驅動程序接口,以文件操作的方式管理驅具有統一的驅動程序接口,以文件操作的方式管理驅動程序動程序,如:,如:openopen、readread、writewrite、ioctlioctlq驅動程序是內核的一部分,可以使用中斷、驅動程序是內核的一部分,可以使用中斷、DMADMA等操作等操作q驅動程序需要在用戶態和內核態之間傳
42、遞數據驅動程序需要在用戶態和內核態之間傳遞數據57Linux驅動程序Linux驅動程序設計qLinuxLinux屏蔽了應用層對外設的直接訪問屏蔽了應用層對外設的直接訪問,不能在用戶態直,不能在用戶態直接進行如下操作:接進行如下操作:* *(unsigned char (unsigned char * *)0 x02000006) =0 x3e;)0 x02000006) =0 x3e;qLinuxLinux下用戶態無法處理中斷下用戶態無法處理中斷qLinuxLinux下對外設的訪問推薦采用驅動程序進行,在內核態下對外設的訪問推薦采用驅動程序進行,在內核態編寫驅動程序(包括直接對外設操作、處理中
43、斷等),用戶編寫驅動程序(包括直接對外設操作、處理中斷等),用戶態通過標準驅動程序調用方法進行操作。態通過標準驅動程序調用方法進行操作。58Linux驅動程序編譯方式Linux驅動程序設計qLinuxLinux中驅動程序的使用可以按照兩種方式編譯:中驅動程序的使用可以按照兩種方式編譯:q一種是一種是靜態編譯進內核靜態編譯進內核q另一種是編譯成模塊以供另一種是編譯成模塊以供動態加載動態加載q由于由于LinuxLinux不支持模塊動態加載不支持模塊動態加載,而且嵌入式,而且嵌入式LinuxLinux不能不能夠象桌面夠象桌面LinuxLinux那樣靈活的使用那樣靈活的使用insmod/rmmodin
44、smod/rmmod加載卸載設備驅加載卸載設備驅動程序,因而通常在動程序,因而通常在LinuxLinux中將設備驅動程序靜態編譯進內核。中將設備驅動程序靜態編譯進內核。59Linux下設備驅動程序分類Linux驅動程序設計q字符設備字符設備:是指存取時沒有緩存的設備。典型的字符設:是指存取時沒有緩存的設備。典型的字符設備包括鼠標,鍵盤,串行口等。備包括鼠標,鍵盤,串行口等。q塊設備塊設備:塊設備的讀寫都有緩存來支持,并且塊設備必:塊設備的讀寫都有緩存來支持,并且塊設備必須能夠隨機存取須能夠隨機存取(random(randomaccess) access) 。典型的塊設備主要包括。典型的塊設備主
45、要包括硬盤軟盤設備,硬盤軟盤設備,CD-ROMCD-ROM等。等。q網絡設備網絡設備:LinuxLinux的網絡系統主要是基于的網絡系統主要是基于BSDBSDunixunix的的socketsocket機制。在系統和驅動程序之間定義有專門的數據結構機制。在系統和驅動程序之間定義有專門的數據結構(sk_buff)(sk_buff)進行數據的傳遞。系統里支持對發送數據和接收數進行數據的傳遞。系統里支持對發送數據和接收數據的緩存,提供流量控制機制,提供對多協議的支持。據的緩存,提供流量控制機制,提供對多協議的支持。60Linux下設備驅動程序組成Linux驅動程序設計q自動配置和初始化子程序自動配置
46、和初始化子程序:負責檢測所要驅動的硬件設備是否存在和是否能正常工負責檢測所要驅動的硬件設備是否存在和是否能正常工作。如果該設備正常,則對這個設備及其相關的、設備作。如果該設備正常,則對這個設備及其相關的、設備驅動程序需要的軟件狀態進行初始化。這部分驅動程序驅動程序需要的軟件狀態進行初始化。這部分驅動程序僅在初始化的時候被調用一次。僅在初始化的時候被調用一次。q服務于服務于I/OI/O請求的子程序請求的子程序:調用這部分是由于系統調用的結果。這部分程序在執行調用這部分是由于系統調用的結果。這部分程序在執行的時候,系統仍認為是和進行調用的進程屬于同一個進的時候,系統仍認為是和進行調用的進程屬于同一
47、個進程,只是由用戶態變成了核心態,具有進行此系統調用程,只是由用戶態變成了核心態,具有進行此系統調用的用戶程序的運行環境,因此可以在其中調用的用戶程序的運行環境,因此可以在其中調用sleep()sleep()等與進程運行環境有關的函數。等與進程運行環境有關的函數。q中斷服務子程序中斷服務子程序:61Linux下設備驅動程序I/O設備入口點1Linux驅動程序設計q在系統內部,在系統內部,I/OI/O設備的存取通過一組固定的入口點來進設備的存取通過一組固定的入口點來進行,這組入口點是由每個設備的設備驅動程序提供的。一般行,這組入口點是由每個設備的設備驅動程序提供的。一般來說,字符型設備驅動程序能
48、夠提供如下幾個入口點:來說,字符型設備驅動程序能夠提供如下幾個入口點:qopenopen:打開設備準備:打開設備準備I/OI/O操作。對字符特別設備文件進行操作。對字符特別設備文件進行打開操作,都會調用設備的打開操作,都會調用設備的openopen入口點。入口點。openopen子程序必須對子程序必須對將要進行的將要進行的I/OI/O操作做好必要的準備工作,如清除緩沖區等。操作做好必要的準備工作,如清除緩沖區等。如果設備是獨占的,即同一時刻只能有一個程序訪問此設備,如果設備是獨占的,即同一時刻只能有一個程序訪問此設備,則則openopen子程序必須設置一些標志以表示設備處于忙狀態。子程序必須設
49、置一些標志以表示設備處于忙狀態。qcloseclose:關閉一個設備。當最后一次使用設備終結后,調:關閉一個設備。當最后一次使用設備終結后,調用用closeclose子程序。獨占設備必須標記設備可再次使用。子程序。獨占設備必須標記設備可再次使用。qReadRead:從設備上讀數據。對于有緩沖區的:從設備上讀數據。對于有緩沖區的I/OI/O操作,一般操作,一般是從緩沖區里讀數據。對字符特別設備文件進行讀操作將調是從緩沖區里讀數據。對字符特別設備文件進行讀操作將調用用readread子程序。子程序。62Linux下設備驅動程序I/O設備入口點2Linux驅動程序設計qwritewrite:往設備上
50、寫數據。對于有緩沖區的:往設備上寫數據。對于有緩沖區的I/OI/O操作,一操作,一般是把數據寫入緩沖區里。對字符特別設備文件進行寫操作般是把數據寫入緩沖區里。對字符特別設備文件進行寫操作將調用將調用writewrite子程序。子程序。qioctlioctl:執行讀、寫之外的操作。:執行讀、寫之外的操作。qselectselect:檢查設備,看數據是否可讀或設備是否可用于:檢查設備,看數據是否可讀或設備是否可用于寫數據。寫數據。selectselect系統調用在檢查與設備特別文件相關的文件系統調用在檢查與設備特別文件相關的文件描述符時使用描述符時使用selectselect入口點。如果設備驅動程
51、序沒有提供上入口點。如果設備驅動程序沒有提供上述入口點中的某一個,系統會用缺省的子程序來代替。對于述入口點中的某一個,系統會用缺省的子程序來代替。對于不同的系統,也還有一些其它的入口點。不同的系統,也還有一些其它的入口點。63Linux下設備注冊1Linux驅動程序設計q設備驅動程序所提供的入口點,在設備驅動程序初始化設備驅動程序所提供的入口點,在設備驅動程序初始化的時候向系統進行登記,以便系統在適當的時候調用。的時候向系統進行登記,以便系統在適當的時候調用。LinuxLinux系統里,通過調用系統里,通過調用register_chrdevregister_chrdev向系統注冊字符型設備驅向
52、系統注冊字符型設備驅動程序。動程序。register_chrdevregister_chrdev定義為:定義為:#include #include #include #include int register_chrdev(unsigned int major, const char int register_chrdev(unsigned int major, const char * *name,name, struct file_operations struct file_operations * *fops);fops);q其中,其中,majormajor是為設備驅動程序向系統申請的
53、主設備號,是為設備驅動程序向系統申請的主設備號,如果為如果為0 0則系統為此驅動程序動態地分配一個主設備號。則系統為此驅動程序動態地分配一個主設備號。namename是設備名。是設備名。fopsfops是該驅動各個的入口點的文件操作結構指針。是該驅動各個的入口點的文件操作結構指針。64Linux下設備注冊2Linux驅動程序設計q此函數返回此函數返回0 0表示成功。返回表示成功。返回-EINVAL-EINVAL表示申請的主設備表示申請的主設備號非法,一般來說是主設備號大于系統所允許的最大設備號。號非法,一般來說是主設備號大于系統所允許的最大設備號。返回返回-EBUSY-EBUSY表示所申請的主
54、設備號正在被其它設備驅動程序表示所申請的主設備號正在被其它設備驅動程序使用。如果是動態分配主設備號成功,此函數將返回所分配使用。如果是動態分配主設備號成功,此函數將返回所分配的主設備號。如果的主設備號。如果register_chrdevregister_chrdev操作成功,設備名就會出操作成功,設備名就會出現在現在/proc/devices/proc/devices文件里。文件里。q初始化部分一般還負責給設備驅動程序申請系統資源,初始化部分一般還負責給設備驅動程序申請系統資源,包括內存、中斷、時鐘、包括內存、中斷、時鐘、I/OI/O端口等,這些資源也可以在端口等,這些資源也可以在openop
55、en子程序或別的地方申請。在這些資源不用的時候,應該釋放子程序或別的地方申請。在這些資源不用的時候,應該釋放它們,以利于資源的共享。它們,以利于資源的共享。65Linux下中斷處理Linux驅動程序設計q在在LinuxLinux系統里,對中斷的處理是屬于系統核心的部分,系統里,對中斷的處理是屬于系統核心的部分,因此如果設備與系統之間以中斷方式進行數據交換的話,就因此如果設備與系統之間以中斷方式進行數據交換的話,就必須把該設備的驅動程序作為系統核心的一部分。設備驅動必須把該設備的驅動程序作為系統核心的一部分。設備驅動程序通過調用程序通過調用request_irqrequest_irq函數來申請中
56、斷,通過函數來申請中斷,通過free_irqfree_irq來來釋放中斷。釋放中斷。66Linux下內存分配、釋放Linux驅動程序設計q作為系統核心的一部分,作為系統核心的一部分,設備驅動程序在申請和釋放內設備驅動程序在申請和釋放內存時不是調用存時不是調用mallocmalloc和和freefree,而代之以調用,而代之以調用kmallockmalloc和和kfreekfree,它們被定義為:它們被定義為:#include #include void void * * kmalloc(unsigned int len, int priority); kmalloc(unsigned int
57、len, int priority);void kfree(void void kfree(void * * obj); obj);q參數參數lenlen為希望申請的字節數,為希望申請的字節數,objobj為要釋放的內存指針。為要釋放的內存指針。prioritypriority為分配內存操作的優先級,即在沒有足夠空閑內存為分配內存操作的優先級,即在沒有足夠空閑內存時如何操作,一般用時如何操作,一般用GFP_KERNELGFP_KERNEL。67Linux下內存分配、釋放Linux驅動程序設計q使用一個沒有申請的使用一個沒有申請的I/OI/O端口不會使端口不會使CPUCPU產生異常,也就產生異常
58、,也就不會導致諸如不會導致諸如“segmentation faultsegmentation fault”一類的錯誤發生。任何一類的錯誤發生。任何進程都可以訪問任何一個進程都可以訪問任何一個I/OI/O端口。此時系統無法保證對端口。此時系統無法保證對I/OI/O端口的操作不會發生沖突,甚至會因此而使系統崩潰。端口的操作不會發生沖突,甚至會因此而使系統崩潰。q因此,在使用因此,在使用I/OI/O端口前,應該檢查此端口前,應該檢查此I/OI/O端口是否已有端口是否已有別的程序在使用,若沒有,再把此端口標記為正在使用,在別的程序在使用,若沒有,再把此端口標記為正在使用,在使用完以后釋放它。使用完以后
59、釋放它。int int check_regioncheck_region(unsigned int from, unsigned int extent);(unsigned int from, unsigned int extent);void void request_regionrequest_region(unsigned int from, unsigned int extent,(unsigned int from, unsigned int extent, const char const char * *name);name);void void release_regionre
60、lease_region(unsigned int from, unsigned int extent);(unsigned int from, unsigned int extent);68Linux下開關中斷函數Linux驅動程序設計q在設備驅動程序里,通過如下函數實現打開和關閉中斷在設備驅動程序里,通過如下函數實現打開和關閉中斷功能:功能:#include #include #define #define clicli() _asm_ _volatile_ (cli:)() _asm_ _volatile_ (cli:)#define #define stisti() _asm_ _volatile_
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年多語言翻譯與口譯考試題及答案
- 2025年公共衛生管理考試試卷及答案
- 2025年機電一體化專業考試卷及答案
- 2025年家庭教育指導師考試試題及答案
- 2025年女性健康與發展課程考試試題及答案
- 一級建造師試題及答案
- 木材生產加工合同協議書
- 中國創意家居飾品市場深度調查報告
- 山東省日照市2024-2025學年高一下學期期中考試數學模擬試卷(解析)
- 瘢痕妊娠介入治療
- 湖北武漢歷年中考語文現代文閱讀真題45篇(含答案)(2003-2023)
- 生活垃圾分類運營方案
- 帶貨主播規章制度范本
- 麻醉科醫師晉升副主任醫師病例分析專題報告三篇
- HG∕T 3714-2014 耐油輸送帶 國標
- 2024年湖南省高中學業水平合格性考試英語試卷真題(含答案詳解)
- 《內科胸腔鏡術》課件
- CJJ 33-2005城鎮燃氣輸配工程施工與驗收規范
- 《市場營銷:網絡時代的超越競爭》第4版 課件 第9章 通過構建渠道網絡傳遞顧客價值
- 農民工工資代付款方協議模板
- 中醫醫療技術手冊2013普及版
評論
0/150
提交評論