資源描述:
《Linux內(nèi)核開發(fā)框架學(xué)習(xí)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、Linux內(nèi)核開發(fā)框架學(xué)習(xí)一、常見linux內(nèi)核文件的區(qū)別1、vmlinux編譯出來的最原始的內(nèi)核文件,未壓縮。2、zImagevmlinux經(jīng)過gzip壓縮后的文件。3、bzImagebz表示“bigzImage”,不是用bzip2壓縮的。兩者的不同之處在于,zImage解壓縮內(nèi)核到低端內(nèi)存(第一個(gè)640K),bzImage解壓縮內(nèi)核到高端內(nèi)存(1M以上)。如果內(nèi)核比較小,那么采用zImage或bzImage都行,如果比較大應(yīng)該用bzImage。4、uImageU-boot專用的映像文件,它是在zImage之前加上一個(gè)長度為0x40的tag。5、vml
2、inuzbzImage/zImage文件的拷貝或指向bzImage/zImage的鏈接。6、initrd“initialramdisk”的簡寫。一般被用來臨時(shí)的引導(dǎo)硬件到實(shí)際內(nèi)核vmlinuz能夠接管并繼續(xù)引導(dǎo)的狀態(tài)。二、linux內(nèi)核源碼目錄結(jié)構(gòu)1、arch目錄包括了所有和體系結(jié)構(gòu)相關(guān)的核心代碼。它下面的每一個(gè)子目錄都代表一種Linux支持的體系結(jié)構(gòu),例如i386就是IntelCPU及與之相兼容體系結(jié)構(gòu)的子目錄。PC機(jī)一般都基于此目錄。2、include目錄包括編譯核心所需要的大部分頭文件,例如與平臺(tái)無關(guān)的頭文件在include/linux子目錄下。3
3、、init目錄包含核心的初始化代碼(不是系統(tǒng)的引導(dǎo)代碼),有main.c和Version.c兩個(gè)文件。這是研究核心如何工作的好起點(diǎn)。4、mm目錄包含了所有的內(nèi)存管理代碼。與具體硬件體系結(jié)構(gòu)相關(guān)的內(nèi)存管理代碼位于arch/*/mm目錄下。5、drivers目錄是系統(tǒng)中所有的設(shè)備驅(qū)動(dòng)程序。它又進(jìn)一步劃分成幾類設(shè)備驅(qū)動(dòng),每一種有對(duì)應(yīng)的子目錄,如聲卡的驅(qū)動(dòng)對(duì)應(yīng)于drivers/sound。6、ipc目錄包含了核心進(jìn)程間的通信代碼。7、modules目錄存放了已建好的、可動(dòng)態(tài)加載的模塊。8、fs目錄存放Linux支持的文件系統(tǒng)代碼。不同的文件系統(tǒng)有不同的子目錄對(duì)應(yīng)
4、,如ext3文件系統(tǒng)對(duì)應(yīng)的就是ext3子目錄。1、Kernel內(nèi)核管理的核心代碼放在這里。同時(shí)與處理器結(jié)構(gòu)相關(guān)代碼都放在arch/*/kernel目錄下。2、net目錄里面是核心的網(wǎng)絡(luò)部分代碼,其每個(gè)子目錄對(duì)應(yīng)于網(wǎng)絡(luò)的一個(gè)方面。3、lib目錄包含了核心的庫代碼,不過與處理器結(jié)構(gòu)相關(guān)的庫代碼被放在arch/*/lib/目錄下。4、scripts目錄包含用于配置核心的腳本文件。5、documentation目錄該目錄是對(duì)其它每個(gè)目錄作用的具體說明。一、Uboot加載內(nèi)核的流程uboot通過執(zhí)行bootm0x81000000指令來啟動(dòng)linux。intdo_b
5、ootm(cmd_tbl_t*cmdtp,intflag,intargc,char*argv[]){bootm_start(cmdtp,flag,argc,argv);ret=bootm_load_os(images.os,&load_end,1);boot_fn=boot_os[images.os.os];//選擇啟動(dòng)函數(shù),即do_bootm_linuxboot_fn(0,argc,argv,&images);//執(zhí)行do_bootm_linux}intdo_bootm_linux(intflag,intargc,char*argv[],bootm_h
6、eaders_t*images){intmachid=bd->bi_arch_number;void(*theKernel)(intzero,intarch,uintparams);//theKernel指向內(nèi)核入口地址theKernel=(void(*)(int,int,uint))images->ep;//在啟動(dòng)內(nèi)核之前做一些清理工作cleanup_before_linux();//啟動(dòng)內(nèi)核theKernel(0,machid,bd->bi_boot_params);}在啟動(dòng)內(nèi)核之前,uboot必須為uImage準(zhǔn)備以下準(zhǔn)備:?1.CPU寄存器的設(shè)置
7、:R0=0;R1=MachineID(即MachineTypeNumber,定義在linux/arch/arm/tools/mach-types);R2=內(nèi)核啟動(dòng)參數(shù)在RAM中起始基地址;?2.CPU模式:必須禁止中斷(IRQs和FIQs);CPU必須SVC模式;?3.Cache和MMU的設(shè)置:MMU必須關(guān)閉;指令Cache可以打開也可以關(guān)閉;數(shù)據(jù)Cache必須關(guān)閉;uImage中64字節(jié)的頭信息結(jié)構(gòu)體如下:#defineIH_NMLEN32/*ImageNameLength*/typedefstructimage_header{uint32_tih_m
8、agic;/*ImageHeaderMagicNumber*/uint32_ti