2-內(nèi)核的編譯_uImag_zimage_設(shè)備樹(shù)

內(nèi)核的編譯:
  • make uImage
    • 1浆劲、在頂層目錄下搜索uImage發(fā)現(xiàn)找不到,有可能uImage存在于其他的Makefile文件中
    • 2蚯嫌、include arch/arm/Makefile
    • 3晒旅、進(jìn)入到arch/arm/Makefile中,尋找uImage目標(biāo)
      299 BOOT_TARGETS    = zImage Image xipImage bootpImage uImage
      304 $(BOOT_TARGETS): vmlinux(頂層目錄下的)
      305     $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@
      boot := arch/arm/boot
    
    • 4拟烫、進(jìn)入到arch/arm/boot目錄下尋找uImage目標(biāo)
    78 $(obj)/uImage:  $(obj)/zImage FORCE
    79     @$(check_for_multiple_loadaddr)
    80     $(call if_changed,uimage)
    81     @$(kecho) '  Image $@ is ready'
    
    • 如果需要生成uImage,必須依賴zImage
    • 5、搜索目標(biāo)zImage
    54 $(obj)/zImage:  $(obj)/compressed/vmlinux FORCE
      55     $(call if_changed,objcopy)
    
    • 6、在arch/arm/boot/compressed/Makefile中尋找vmlinux目標(biāo)
    185 $(obj)/vmlinux: $(obj)/vmlinux.lds $(obj)/$(HEAD) $(obj)/piggy.$(suffix_y).o \                                            
    186         $(addprefix $(obj)/, $(OBJS)) $(lib1funcs) $(ashldi3) \
    187         $(bswapsdi2) FORCE
    188     @$(check_for_multiple_zreladdr)
    189     $(call if_changed,ld)
    190     @$(check_for_bad_syms)
    //    如果要生成piggy.$(suffix_y).o,需要依賴 $(obj)/piggy.$(suffix_y)
    //    如果要生成$(obj)/piggy.$(suffix_y),要依賴$(obj)/../Image
    
    • 進(jìn)入到arch/arm/boot/Makefile,尋找Image目標(biāo)
    47 $(obj)/Image: vmlinux(頂層目錄下的)
    48     $(call if_changed,objcopy)
    
    • 以Image為源文件,調(diào)用了gzip命令生成了piggy.gzip
    • ld鏈接器以5個(gè).o文件為源文件生成了arch/arm/boot/compressed/vmlinux
    • 7尝江、返回到arch/arm/boot/Makefile,以arch/arm/boot/compressed/vmlinux調(diào)用objcopy命令生成了zImage
    • 8苍日、以zImage為源文件調(diào)用uimage命令生成uImage文件
  • 總結(jié):uImage的生成,頂層目錄下生成vmlinux文件,通過(guò)vmlinux文件生成Image耕腾,Image調(diào)用gzip進(jìn)行壓縮最終生成了piggy.gzip,
  • 調(diào)用ld鏈接器羹呵,以piggy.gzip.o和其它.o文件來(lái)進(jìn)行鏈接生成了zImage盈简,zImage調(diào)用uimage命令生成uImage文件

啟動(dòng)過(guò)程:

  • 啟動(dòng)過(guò)程:涉及到匯編和c,代碼都不需要記。我們需要做到的是用什么功能弃衍,了解某個(gè)部分的代碼猖败。
  • arch/arm/kernel/head.S內(nèi)核的最初啟動(dòng)文件
1、設(shè)置特權(quán)模式并且屏蔽所有中斷
  • 因?yàn)槲覀冃枰跏蓟恍┯布⑶艺{(diào)用協(xié)處理器指令破停,所以必須設(shè)置特權(quán)模式
    中斷代碼還沒(méi)有設(shè)置完成
2理茎、判斷u-boot給內(nèi)核傳遞的參數(shù)是設(shè)備樹(shù)還是tag結(jié)構(gòu)體
  • 我們3.14內(nèi)核在和u-boot2013版本配合使用時(shí)默認(rèn)使用了設(shè)備樹(shù)
3蚯撩、創(chuàng)建頁(yè)表
  • 虛擬地址和物理地址的關(guān)系.如果要理解這個(gè)關(guān)系必須先了解什么是頁(yè)目錄,頁(yè)表美浦,還有頁(yè)。
  • 虛擬地址32位币厕,在32位中分成3個(gè)部分:10 + 10 + 12
  • 頁(yè)目錄 頁(yè)表 頁(yè)
  • 1024項(xiàng) 1024項(xiàng) 1024項(xiàng)
也就是說(shuō)我們可以把上面的頁(yè)目錄阴绢,頁(yè)表,頁(yè)都看成是數(shù)組,而虛擬地址分成的三個(gè)部分就是這三個(gè)數(shù)組的下標(biāo)
  • 0x12345678
  • 0001001000 1101000101 011001111000
4篓足、使能并且開(kāi)啟MMU
5陪腌、進(jìn)入到init/main.c中執(zhí)行start_kernel函數(shù)
  • 執(zhí)行setup_arch();
    • ==>setup_machine_fdt();接收了u-boot傳遞給內(nèi)核的設(shè)備樹(shù)地址然后去解析設(shè)備樹(shù)內(nèi)容
    • console_init()控制臺(tái)初始化函數(shù)参滴,如果在它之前調(diào)用printk則輸入信息會(huì)被臨時(shí)存放到緩存區(qū)中
    • vfs_caches_init()
    • ==>mnt_init();
    • ==>sysfs_init()初始化sysfs文件系統(tǒng),它的作用在驅(qū)動(dòng)中講
    • rest_init()
    • ==>kernel_thread(kernel_init,,);
    • kernel_init_freeable();
    • ==>sys_open();//在應(yīng)用層中的open調(diào)用了sys_open,sys_open()函數(shù)最終幫助我們找到了驅(qū)動(dòng)接口
    • ==>prepare_namespace();
    • ==>mount_root();
    • ==> mount_nfs_root()通過(guò)nfs服務(wù)來(lái)掛載rootfs文件夾的

設(shè)備樹(shù):

  • 設(shè)備樹(shù)是干嘛的暴心?設(shè)備樹(shù)是描述硬件信息的弹沽。
  • 在操作系統(tǒng)內(nèi)核中驅(qū)動(dòng)、設(shè)備蚌堵、總線
  • 總線上可以理解為既掛載了設(shè)備文件又掛載了驅(qū)動(dòng)程序瘸味。總線幫助我們?nèi)テヅ潋?qū)動(dòng)和設(shè)備毅贮。
  • 所以在使用總線的前提下我們要寫(xiě)一個(gè)驅(qū)動(dòng)程序和一個(gè)設(shè)備程序炫加。這兩種程序都會(huì)被最終編譯到uImage文件中魄健。
  • 設(shè)備樹(shù)命名:.dts(設(shè)備樹(shù)的源文件) .dtb(設(shè)備樹(shù)的二進(jìn)制文件) .dtsi(設(shè)備樹(shù)的頭文件)
  • vi arch/arm/boot/dts/exynos4412-fs4412.dts
設(shè)備樹(shù)的基本語(yǔ)法:
節(jié)點(diǎn)和屬性:
  • 每個(gè)設(shè)備樹(shù)文件都是從根節(jié)點(diǎn)開(kāi)始的农尖。其它的所有節(jié)點(diǎn)都必須包含于根節(jié)點(diǎn)。
/{
    model = "字符串";對(duì)平臺(tái)或芯片的描述語(yǔ)句,這個(gè)屬性不重要。
    compatible = "fs4412,key";在驅(qū)動(dòng)中的某個(gè)結(jié)構(gòu)體成員內(nèi)容也必須是"fs4412,key"
    reg = <寄存器首地址1 偏移量1 寄存器首地址2 偏移量2>;
    節(jié)點(diǎn)@地址{ 為什么某些節(jié)點(diǎn)的后面會(huì)出現(xiàn)地址洗显?這個(gè)地址為了區(qū)分同種設(shè)備中的不同子設(shè)備
    };

    標(biāo)號(hào):節(jié)點(diǎn){為什么會(huì)有標(biāo)號(hào)?如果后面的設(shè)備需要調(diào)用當(dāng)前設(shè)備的所有信息的話玄组,只需要調(diào)用標(biāo)號(hào)就可以了

    };

    interrupt-parent = <&gpx0>; 中斷父節(jié)點(diǎn),其中g(shù)px0是某個(gè)頭文件中一個(gè)標(biāo)號(hào),引用標(biāo)號(hào)的方法要加&
    interrupts = <中斷類型 中斷號(hào) 中斷觸發(fā)方式>
    中斷類型:0代表SPI 1代表PPI
    中斷號(hào):6代表了EINT[6]來(lái)索引中斷號(hào)
    觸發(fā)方式:1上升沿觸發(fā) 2下降沿觸發(fā) 4高電平 8低電平
};
根文件系統(tǒng):
  • etc/:
  • inittab:每行都有4個(gè)域胞此,用:分隔
  • 域1:域2:域3:域4
  • 在嵌入式中前兩個(gè)幾乎不用.第三個(gè)域是一種動(dòng)作枝缔,第四個(gè)域是完成具體動(dòng)作使用到的命令或者腳本
  • tmpfs、proc、sysfs都是文件系統(tǒng)類型顿涣,其中tmpfs可以被掛載多次孵淘,但是proc必須掛載到proc目錄下揉阎,sysfs必須掛載到/sys目錄下
  • mount命令只能臨時(shí)掛載
  • fstab文件可以永久掛載
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子搀突,更是在濱河造成了極大的恐慌,老刑警劉巖施蜜,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異肯污,居然都是意外死亡貌亭,警方通過(guò)查閱死者的電腦和手機(jī)美尸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)蕊温,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人凉翻,你說(shuō)我怎么就攤上這事前计。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵舅锄,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng)幔荒,這世上最難降的妖魔是什么姚垃? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任看成,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘贪嫂。我一直安慰自己亮靴,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布讶踪。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪酵紫。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,737評(píng)論 1 305
  • 那天僧界,我揣著相機(jī)與錄音,去河邊找鬼涨共。 笑死扒吁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼醒陆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起沐祷,我...
    開(kāi)封第一講書(shū)人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤思杯,失蹤者是張志新(化名)和其女友劉穎暖璧,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡千扶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片巷帝。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出时呀,到底是詐尸還是另有隱情趴梢,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布硝枉,位于F島的核電站欣福,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜仇让,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一假瞬、第九天 我趴在偏房一處隱蔽的房頂上張望芦劣。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間凭迹,已是汗流浹背沿彭。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工造锅, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蛛蒙,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓掌呜,卻偏偏與公主長(zhǎng)得像饰剥,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子祝钢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容