Linux驅(qū)動開發(fā)培訓(xùn)7_第1頁
Linux驅(qū)動開發(fā)培訓(xùn)7_第2頁
Linux驅(qū)動開發(fā)培訓(xùn)7_第3頁
Linux驅(qū)動開發(fā)培訓(xùn)7_第4頁
Linux驅(qū)動開發(fā)培訓(xùn)7_第5頁
已閱讀5頁,還剩80頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、The successs road1ARM linux開發(fā)流程2主要內(nèi)容:ARM體系結(jié)構(gòu)ARM linux 概述ARM linux 開發(fā)平臺搭建ARM linux bootloader開發(fā)ARM linux 內(nèi)核開發(fā)ARM linux 文件系統(tǒng)3ARM體系結(jié)構(gòu)ARM處理器結(jié)構(gòu)ARM系統(tǒng)發(fā)展趨勢ARM體系結(jié)構(gòu)ARM編程模型數(shù)據(jù)類型處理器模式寄存器組織異常存儲器映射ARM尋址方式4ARM處理器結(jié)構(gòu)ARM系統(tǒng)發(fā)展趨勢ARM(Advanced RISC Machines)是微處理器行業(yè)的一家知名企業(yè),設(shè)計了大量高性能、廉價、耗能低的RISC處理器、相關(guān)技術(shù)及軟件。具有性能高、成本低和能耗省的特點。 A

2、RM當(dāng)前有個產(chǎn)品系列: ARM7、ARM9、ARM9E、ARM10、 ARM11、SecurCore 變種:StrongARM、Xscale5ARM處理器結(jié)構(gòu)ARM體系結(jié)構(gòu)ARM基于精簡指令集(RISC)通常具有兩套套指令集高性能32位ARM指令集高代碼密度16位Thumb指令集(操作碼,有些指令不要操作數(shù))Thumb在位體系結(jié)構(gòu)上實現(xiàn)了位指令集,提供:比位更高的性能;(尋址空間,訪問速度)比位更高的代碼密度(處理非數(shù)據(jù)指令)6ARM處理器結(jié)構(gòu)7數(shù)據(jù)類型Byte8位Halfword16位Word32位處理器模式user用戶,正常程序執(zhí)行模式FiqFIQ,高速數(shù)據(jù)傳送活通道處理IrqIRQ,通用

3、中斷處理Svc管理,操作系統(tǒng)保護模式Abt中止,虛擬存儲器或存儲器保護Und未定義,硬件協(xié)處理器軟件仿真Sys系統(tǒng),特權(quán)操作系統(tǒng)任務(wù)ARM編程模型8ARM編程模型寄存器組織ARM處理器總共有37個寄存器31個通用寄存器(32位有效)不分組寄存器R0R7分組寄存器 R8R14程序計數(shù)器 R15個狀態(tài)寄存器(12位有效) 在所有模式下都可以訪問當(dāng)前程序狀態(tài)寄存器CPSR(Current Program Status)9ARM編程模型10ARM編程模型11ARM編程模型異常12ARM編程模型存儲器映射地址空間存儲器格式大端存儲系統(tǒng)小端存儲系統(tǒng)非對準(zhǔn)存儲器訪問非對準(zhǔn)取指結(jié)果不可預(yù)知非對準(zhǔn)數(shù)據(jù)訪問按體系

4、決定,忽略低地址預(yù)取指 (流水線)存儲器映射 I/O ARM系統(tǒng)完成I/O功能的標(biāo)準(zhǔn)做法是使用存儲器映射I/O13ARM編程模型14ARM編程模型15ARM尋址方式寄存器尋址ADD R0,R1,R2;R0R1+R2立即尋址ADD R3,R3#1;R3R3+1寄存器移位尋址ADD R3,R2,R1,LSL #3 ;R3R2+8xR1寄存器間接尋址LDR R0,R1;R0R1變址尋址LDR R0,R1,#4;R0R1+416ARM尋址方式多寄存器尋址LDMIA R1,R0,R2,R5 ;R0R1;R2R1+4; R5R1+8堆棧尋址塊拷貝尋址LDMIA R0!,R2-R9STMIA R1,R2-R

5、9相對尋址BL SUBR;轉(zhuǎn)移到SUBR17ARM linux 概述嵌入式 Linux 的發(fā)展嵌入式 Linux 的組成ARM Linux 概況ARM Linux patch文件的使用18嵌入式 Linux 的發(fā)展發(fā)展歷史1992年底,linux 1.0問世90年代末,出現(xiàn)了RT-Linux、RTAI、(任務(wù)調(diào)度10MS滿足)QT/Embedded等開源項目2000年,基于嵌入式Linux的網(wǎng)絡(luò)產(chǎn)品逐漸興起2001年,一批專業(yè)嵌入式Linux解決方案商涌現(xiàn),Montavista、Lineo、Mizi等2002年,基于嵌入式Linux的PDA面世19嵌入式 Linux 的發(fā)展嵌入式Linux 的

6、基本需求實時性能: RT-Linux、RTAI高可靠性:內(nèi)核不斷完善,升級較低功耗:電源管理快速啟動:bootloader、kernel體積小巧: Flash、Ram等資源占用移植性強: 靈活方便的移植到其他平臺20嵌入式 Linux 的組成嵌入式 Linux 的三要素:BootLoader系統(tǒng)引導(dǎo)、調(diào)試、燒寫內(nèi)核 KERNELLinux kernel + patch根文件系統(tǒng)定制的應(yīng)用程序21嵌入式 Linux 的組成Linux 系統(tǒng)核心框圖Linux 系統(tǒng)支持硬件類型字符設(shè)備塊設(shè)備網(wǎng)絡(luò)設(shè)備用戶級進程系統(tǒng)調(diào)用接口硬件驅(qū)動物理硬件進程控制系統(tǒng)進程通信虛擬文件系統(tǒng)EXT2NFS其他網(wǎng)絡(luò)協(xié)議內(nèi)存管

7、理進程調(diào)度22ARM Linux 概況Linux 支持廣泛的ARM體系CPU,目前已有數(shù)十種不同廠家的芯片, 支持的板子也超過200多種,并且越來越多的廠家在ARM上選擇使用Linux系統(tǒng)。ARM Linux的資源豐富,有很多的系統(tǒng)方案提供商可以方便地添加自己的ARM平臺ARM Linux的開發(fā)也在不斷進行中23ARM Linux patch文件的使用ARM Linux 是以patch的方式發(fā)布的,需要在原linux基本內(nèi)核基礎(chǔ)上打patch舉例說明:bash$ tar zxvf linux-2.4.18.tar.gz bash$ cd linux-2.4.18 bash$ zcat ./pa

8、tch-2.4.18-rmk7.gz | patch -p1 bash$ zcat ./diff-2.4.18-rmk7-pxa1.gz | patch -p1bash$ zcat ./diff-2.4.18-rmk7-pxa1-mz4. gz | patch -p124ARM linux 開發(fā)平臺搭建跨平臺開發(fā)模式交叉編譯工具鏈主機端系統(tǒng)配置開發(fā)所需工具25跨平臺開發(fā)模式跨平臺開發(fā)與我們平時的編程有何不同絕大多數(shù)的軟件開發(fā)都是以native方式進行的 即本機(HOST)開發(fā)、調(diào)試,本機運行的方式 嵌入式系統(tǒng)的軟件開發(fā)采用一種交叉編譯調(diào)試編譯生成的代碼不能在開發(fā)主機上運行,需要 傳輸?shù)桨遄由线\

9、行26跨平臺開發(fā)模式交叉編譯調(diào)試環(huán)境建立在宿主機上, 對應(yīng)的開發(fā)板叫做目標(biāo)板。如下圖所示:【宿主機】 【目標(biāo)板】 27交叉編譯工具鏈交叉編譯工具鏈的組成如何生成自己的交叉編譯工具鏈交叉編譯工具鏈的安裝28交叉編譯工具鏈交叉編譯工具鏈的組成Binutils軟件包 匯編器和連接器 GCC軟件包 GCC 軟件包包含 GNU 編譯器,其中有C和C+編譯器. Glibc軟件包 Glibc 是提供系統(tǒng)調(diào)用和基本函數(shù)的 C 庫 一般說來安裝了上述軟件包后,一個基本的開發(fā)工具鏈已經(jīng)建立29交叉編譯工具鏈如何生成自己的交叉編譯工具鏈自己動手制作交叉編譯工具鏈的過程是非常復(fù)雜的版本兼容性問題需要考慮編譯過程比較漫

10、長,一旦出錯需要從頭開始參考資料有些時候現(xiàn)有的交叉編譯工具鏈與板子的配合不是很好時,自己制作工具鏈可以解決30交叉編譯工具鏈下面簡單列出各個步驟編譯安裝 Binutils - 第一遍 非常重要,因為 Glibc 和 GCC 會針對可用的連接器和匯編器進行多種測試,以決定打開某些特性 編譯安裝 GCC - 第一遍這里我們不需要C+編譯器,所以我們這里只解壓 gcc-core 包安裝 Linux 頭文件 包含系統(tǒng)相關(guān)信息 編譯安裝 Glibc 提供系統(tǒng)調(diào)用和基本函數(shù)的 C 庫 編譯安裝Gcc - 第二遍編譯安裝 Binutils - 第二遍重新編譯GCC和Binutils,連接到新的Glibc上3

11、1交叉編譯工具鏈交叉編譯工具鏈的安裝現(xiàn)有公認(rèn)比較好的ARMLINUX交叉編譯工具鏈一共有五組:Sharp zaurus PDA版本Handhelds版本 Snapgear版本Montavista版本Mizi版本 32交叉編譯工具鏈交叉編譯工具鏈的安裝以Mizi開發(fā)板為例Mizi交叉編譯工具以RPM包方式發(fā)布,并包含了一些常用的庫文件如果選擇mizi的2410TK的SDK里的交叉工具鏈,則gcc版本為2.95.2,如果選擇了mizi2.0的則gcc版本為2.95.3rpm -ivh -force -nodeps *.rpm開發(fā)所用工具安裝到/opt/host/armv4l下33主機端系統(tǒng)配置檢測

12、并口是否工作正常;檢測串口是否工作正常,運行MINICOM,將串口配置;為115200,8-N-1方式#minicom s啟動NFS服務(wù),設(shè)置輸出路徑;編輯/etc/exports文件,在里面加入如下一句話:/nfsroot xxx.xxx.xxx.xxx(rw)啟動TFTP服務(wù),通過運行SETUP命令;取消IPTABLES防火墻的啟動運行;#chkconfig level 3 iptables off上面兩個設(shè)置也可以通過圖形界面,在系統(tǒng)菜單里的服務(wù)里面進行選擇配置,詳細(xì)過程這里就不多講述。34開發(fā)所需工具仿真器,如MULTI-ICE;簡易JTAG,可以用來燒寫B(tài)ootloader;交叉串口

13、線,23交叉;交叉網(wǎng)線,主機對聯(lián)線;USB扁平線, 系統(tǒng)燒寫;仿真軟件,ADS,SDT。35ARM linux bootloader開發(fā)Bootloader的主要功能ARM linux Bootloader的啟動步驟內(nèi)核啟動參數(shù)表幾種常見的ARM linux Bootloader36Bootloader的主要功能基本功能引導(dǎo)操作系統(tǒng)初級調(diào)試功能下載與燒寫附加功能系統(tǒng)自檢系統(tǒng)升級參數(shù)設(shè)置37ARM linux Bootloader的啟動步驟一個最小需求的bootloader啟動步驟配置CPU、內(nèi)存系統(tǒng)、FLASH及中斷裝載內(nèi)核到指定內(nèi)存區(qū)域裝載initial RAM disk到指定內(nèi)存區(qū)域初始化

14、內(nèi)核啟動參數(shù)獲取ARM Linux 機器類型設(shè)置正確的寄存器值,并啟動內(nèi)核附加步驟判定ARM 系統(tǒng)狀態(tài)(SLEEP模式)初始化串口、網(wǎng)口、VIDEO等設(shè)備38內(nèi)核啟動參數(shù)表Bootloader傳遞的內(nèi)核參數(shù)內(nèi)容內(nèi)存容量大小內(nèi)核啟動命令行參數(shù)Init ram disk的位置及大小其他必要參數(shù)(顯示及音頻設(shè)置、版本信息等)參數(shù)表由許多項組成,須遵循以下原則:參數(shù)表存貯在RAM的區(qū)域不能與 kernel 及initrd位置沖突,推薦在RAM的前16KiB,通常,在RAM起始的 0 x100偏移處最前面是中斷向量表在內(nèi)核啟動前,將參數(shù)表位置把參數(shù)表位置固定在RAM的0 x100偏移處. 參數(shù)表不能超越

15、RAM的 0 x4000 偏移處,內(nèi)核初始化轉(zhuǎn)換表在那里如果不按上述推薦位置,那么參數(shù)表位置要字對齊 參數(shù)表必須以 ATAG_CORE項起始,以 ATAG_NONE結(jié)束參數(shù)表至少包含 ATAG_MEM項關(guān)于參數(shù)表信息可查看內(nèi)核代碼include/asm/setup.h39內(nèi)核啟動參數(shù)表內(nèi)核中參數(shù)表定義:struct tag struct tag_header hdr;union struct tag_corecore;struct tag_mem32mem;struct tag_videotextvideotext;struct tag_ramdiskramdisk;struct tag_in

16、itrdinitrd;struct tag_serialnrserialnr;struct tag_revisionrevision;struct tag_videolfbvideolfb;struct tag_cmdlinecmdline; u;40幾種常見的ARM linux Bootloader41ARM linux 內(nèi)核開發(fā)ARM Linux 內(nèi)核原碼樹結(jié)構(gòu)ARM Linux 內(nèi)核image結(jié)構(gòu)Linux 地址空間管理Linux 設(shè)備驅(qū)動程序開發(fā)Linux 下驅(qū)動加載方式驅(qū)動原碼分析42ARM linux 內(nèi)核原碼樹結(jié)構(gòu)43ARM linux 內(nèi)核image結(jié)構(gòu)內(nèi)核發(fā)展至2.4版本以后

17、,體積足見龐大,為節(jié)省空間,采用壓縮內(nèi)核zImageARM linux最早基于2.4版本開發(fā),因此我們有必要分析一下我們生成的壓縮內(nèi)核的結(jié)構(gòu)zImage頭代碼解析注:地址是相對于zImage的偏移位置44Linux 地址空間管理Linux 是一個使用虛擬內(nèi)存的系統(tǒng),這意味著用戶程序看到的地址不是直接對應(yīng)于硬件使用的物理地址。虛擬內(nèi)存提出了一個間接的層,這對許多事情都是有利的。如果有虛擬內(nèi)存,運行在系統(tǒng)上的程序就可以分配到比可用物理內(nèi)存更多的內(nèi)存。甚至一個單獨的進程都可以擁有比系統(tǒng)的物理內(nèi)存更大的虛擬地址空間,虛擬內(nèi)存也能在進程地址空間上使用很多技巧,包括映射設(shè)備的內(nèi)存。 45Linux 地址空

18、間管理虛擬空間映射的實現(xiàn)手段初始化時映射使用時映射46Linux設(shè)備驅(qū)動程序開發(fā)Linux 設(shè)備驅(qū)動程序分類Linux 設(shè)備驅(qū)動程序基本框架編寫 Linux 驅(qū)動程序幾點注意事項Linux 設(shè)備驅(qū)動程序調(diào)試技術(shù) 47Linux 設(shè)備驅(qū)動程序分類字符設(shè)備支持面向字符的I/O操作負(fù)責(zé)管理自己的緩沖區(qū)結(jié)構(gòu)順序存取功能塊設(shè)備僅支持面向塊的I/O操作所有I/O操作都通過在內(nèi)核地址空間中的I/O緩沖區(qū)進行隨機存取功能:支持幾乎任意長度和任意位置上的I/O請求網(wǎng)絡(luò)設(shè)備48Linux 設(shè)備驅(qū)動程序基本框架驅(qū)動入口,初始化函數(shù)xxx_init: 向OS注冊及硬件初始化,包括中斷及bank設(shè)置、GPIO設(shè)置等主體

19、代碼 struct 設(shè)備基本操作函數(shù)inode結(jié)構(gòu)體提供關(guān)于設(shè)備節(jié)點文件/dev/xxx的信息 時間流HZ 、jiffies 、wait_queue_head_t等; 49Linux 設(shè)備驅(qū)動程序基本框架中斷服務(wù)程序Devfs接口設(shè)備文件系統(tǒng),動態(tài)生成設(shè)備節(jié)點信息Proc接口提供內(nèi)核狀態(tài)信息,包括中斷,IO等50Linux 設(shè)備驅(qū)動程序基本框架51編寫 Linux 驅(qū)動程序幾點注意事項時序的把握中斷的使用內(nèi)存的分配52Linux 設(shè)備驅(qū)動程序調(diào)試技術(shù)printk 內(nèi)核打印信息根據(jù)記錄級別輸出信息,全部信息可查看/proc/kmsgioctl 系統(tǒng)調(diào)用strace 查看用戶空間程序運行狀態(tài)Oop

20、s (panic)信息解讀 ksymoops Gdb等調(diào)試工具gdb /usr/src/linux/vmlinux /proc/kcore53Linux 下驅(qū)動加載方式動態(tài)內(nèi)核模塊module_init(s3c2410_uda1341_init);module_exit(s3c2410_uda1341_exit);編譯進內(nèi)核顯式調(diào)用:如framebuffer驅(qū)動,在fbmem.c中#ifdef CONFIG_FB_S3C2410 s3c2410, s3c2410fb_init,s3c2410fb_setup ,#endif隱式調(diào)用: _initcall(gpio_init);54驅(qū)動原碼分析

21、所有原代碼均以S3C2410為例GPIO 驅(qū)動LCD 驅(qū)動代碼MTD 驅(qū)動代碼55驅(qū)動原碼分析GPIO 驅(qū)動56驅(qū)動原碼分析57驅(qū)動原碼分析用戶空間編寫應(yīng)用程序創(chuàng)建設(shè)備節(jié)點mknod c /dev/gpio 220 058驅(qū)動原碼分析LCD 驅(qū)動代碼主要配置參數(shù)59驅(qū)動原碼分析 framebuffer操作函數(shù)集60驅(qū)動原碼分析MTD 驅(qū)動代碼Memory Technology Device (MTD)為FLASH設(shè)備定義了統(tǒng)一的操作接口我們以INTEL E28F128 FLASH為例:現(xiàn)有內(nèi)核中已經(jīng)支持此型號FLASH,故此FLASH檢測及讀寫函數(shù)不需自己重新編寫,我們只要添加FLASH分區(qū)等

22、信息給MTD就可以了.61驅(qū)動原碼分析MTD 驅(qū)動代碼具體編寫方法創(chuàng)建Drivers/mtd/maps/s3c2410_nor.c可從最相近板子FLASH map文件拷貝過來.#cp pxa_cerf.c s3c2410_nor.c并按自己板子的FLASH分布結(jié)構(gòu),修改FLASH啟始位置及創(chuàng)建分區(qū)表.62驅(qū)動原碼分析MTD 驅(qū)動代碼63驅(qū)動原碼分析MTD 驅(qū)動代碼修改mtd/map/Config.in添加關(guān)于2410的定義修改mtd/map/Makefile添加關(guān)于2410的編譯規(guī)則64ARM linux 文件系統(tǒng)ARM linux 文件系統(tǒng)類型ARM linux 文件系統(tǒng)生成方法如何選擇適合

23、自己的根文件系統(tǒng)常用的幾個應(yīng)用程序包65ARM linux 文件系統(tǒng)類型RAM disks CramfsJffs2YaffsRomfsNFS66ARM linux 文件系統(tǒng)生成方法一般都是通過宿主機端運行image制作程序來生成#mkcramfs root_dir #mkfs.jffs2 root_dir #mkyaffsimage yaffs_dir #genromfs -v -V ROMdisk -f $(ROMFSIMG) -d $(ROMFSDIR)系統(tǒng)引導(dǎo)后拷貝文件#mount t jffs2 /dev/mtdblock/2 /usr#cp /tmp/your 67ARM linux

24、 文件系統(tǒng)生成方法Ram disk制作方法生成一個空的img文件格式化掛載下面就可以向img里面拷貝你所需要的東西了#cp av rootfs/* /tmp/initrd68ARM linux 文件系統(tǒng)生成方法Ram disk制作方法 將img壓縮生成我們所需的initrd # umount tmp/initrd # gzip -9 images/initrd.gz Ram disk的壓縮比例高達(dá)60%69ARM linux 文件系統(tǒng)生成方法NFS nfs網(wǎng)絡(luò)文件系統(tǒng),需要在宿主機端運行nfs server服務(wù),并將整理好的目標(biāo)板的根文件系統(tǒng)文件夾export給指定IP客戶端 內(nèi)核為了支持NF

25、S作為根文件系統(tǒng)需要選擇NFS協(xié)議,如下所示:70ARM linux 文件系統(tǒng)生成方法NFS命令行設(shè)置:root=/dev/nfs rw nfsroot=12.345.67.89:/yourpathNFS網(wǎng)絡(luò)文件系統(tǒng)是嵌入式開發(fā)中常用手段應(yīng)用程序調(diào)試便捷降低FLASH燒寫次數(shù)如果bootloader中支持NFS,那么內(nèi)核也可以通過t進行調(diào)試這也是linux下NC的常用實現(xiàn)手法.71如何選擇適合自己的根文件系統(tǒng)選擇依據(jù)FLASH 空間大小RAM 空間大小啟動速度數(shù)據(jù)保存72如何選擇適合自己的根文件系統(tǒng)幾種文件系統(tǒng)的性能對比73常用的幾個應(yīng)用程序包Busybox 輕量級linux系統(tǒng)集成工具包Bo

26、a 小型webserverMtd-util mtd文件系統(tǒng)工具Iptables 防火墻軟件包74圖形界面開發(fā)圖形界面簡介常見嵌入式Linux GUI比較Minigui移植QT/Embedded移植75圖形界面簡介GUI (graphical user interfaces )為用戶提供界面友好的所見所得的圖形操作環(huán)境,用戶通過 GUI 與系統(tǒng)進行交互。GUI基本框架76圖形界面簡介嵌入式Linux 圖形界面的特點體積小、系統(tǒng)消耗低高性能、高可靠性可配置性嵌入式 Linux 下幾種常見 GUIMiniguiQT/EmbeddedMicrowindos77常見嵌入式Linux GUI比較MiniGUIMicroWindowsQt-EmbeddedAPIWIN32X、WIN32子集QT(C+)函數(shù)庫典型大小500k600k1.5M可移植性好很好較好授權(quán)條款GPL/商業(yè)條款MPLQPL/GPL/商業(yè)條款多語種支持獨特的多字符集支持一般采用UNICODE可配置型好一般復(fù)雜系統(tǒng)資源消耗小較大大效率好較差較差使用廣泛性中國地區(qū)主要是美國歐美、韓國使用廣泛78Minigui移植MiniGUI 簡介MiniGU

溫馨提示

  • 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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論