欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Linux 的啟動流程

2021-03-07    分類: 網(wǎng)站建設(shè)

本篇的重點(diǎn)是講解設(shè)備和驅(qū)動的啟動流程,設(shè)備和驅(qū)動的流程是整個(gè)內(nèi)核啟動的核心,也是工作中最常面對的問題。出于知識點(diǎn)的系統(tǒng)性考慮,在進(jìn)入主題之前我們先看下整個(gè) Linux 在 ARM 中的啟動流程如何。


Uboot 的啟動流程

ARM Linux 的啟動流程大致為:Uboot → Kernel → Root filesystem。Uboot 在上電的時(shí)候就拿到 CPU 的控制權(quán),實(shí)現(xiàn)了硬件的初始化。具體是怎么實(shí)現(xiàn)的呢?一起來看一下,CPU 的內(nèi)部集成了小容量的 Sram,而 PC 指針一上電就指向 Sram 的起始地址 0x00000000,所以一上電 Uboot 代碼就得到了運(yùn)行。

Uboot 拿到 CPU 使用權(quán)就開始做初始化工作,比如關(guān)閉看門狗、設(shè)置 CPU 運(yùn)行模式、設(shè)置堆棧、初始化內(nèi)存、網(wǎng)卡、nand flash 等,最后把 Linux 內(nèi)核加載到內(nèi)存中。

  • 初始化 RAM

因?yàn)閮?nèi)核要在 RAM 中運(yùn)行,所以在調(diào)用內(nèi)核之前必須初始化和設(shè)置 RAM,為調(diào)用內(nèi)核做好準(zhǔn)備。

  • 初始化串口

內(nèi)核在啟動過程中可以將信息通過串口輸出,這樣就可以清楚的知道內(nèi)核啟動信息。雖然串口不是 Uboot 必須要完成的工作,但是通過串口可以方便調(diào)試 Uboot 和內(nèi)核的各種信息。

  • 檢測處理器類型

Uboot 在調(diào)用內(nèi)核前需要檢測系統(tǒng)的處理器類型,并將其保存在某個(gè)變量中提供給內(nèi)核,內(nèi)核在啟動過程中會根據(jù)該處理器的類型調(diào)用相應(yīng)的初始化程序。

  • 設(shè)置內(nèi)核啟動參數(shù)

內(nèi)核在啟動過程中會根據(jù)該啟動參數(shù)進(jìn)行相應(yīng)的初始化工作。

  • 調(diào)用內(nèi)核鏡像

值得注意的是存儲 Uboot 的存儲器不同,Uboot 的執(zhí)行過程也并不相同,一般來講 Flash 分為 nor Flash 和 nand Flash 兩種:nor Flash 支持芯片內(nèi)執(zhí)行(XIP,eXecute In Place),這樣代碼可以在 Flash 上直接執(zhí)行而不必復(fù)制到 RAM 中去執(zhí)行。

但是 nand Flash 并不支持 XIP,所以要想執(zhí)行 nand Flash 上的代碼,必須先將其復(fù)制到 RAM 中去,然后跳到 RAM 中去執(zhí)行。如果內(nèi)核存放在 nor Flash 中,那么可直接跳轉(zhuǎn)到內(nèi)核中去執(zhí)行。但通常由于在 nor Flash 中執(zhí)行代碼會有種種限制,而且速度也遠(yuǎn)不及 RAM 快,所以一般的嵌入式系統(tǒng)都是將內(nèi)核復(fù)制到 RAM 中,然后跳轉(zhuǎn)到 RAM 中去執(zhí)行。不論哪種情況,在跳到內(nèi)核執(zhí)行之前 CPU 的寄存器必須滿足以下條件:r0 = 0,r1 = 處理器類型,r2 = 標(biāo)記列表在 RAM 中的地址。


Linux 內(nèi)核的啟動流程(設(shè)備和驅(qū)動的加載)

關(guān)于 Uboot 的啟動本課程不做詳細(xì)介紹,因?yàn)楸菊n程的主要內(nèi)容是內(nèi)核。在講述內(nèi)核啟動之前讓我們先了解下內(nèi)核的組成結(jié)構(gòu):

其中,

(1)vmlinusx 是 ELF 格式的 Object 文件,這種文件只是各個(gè)源代碼經(jīng)過連接以后得到的文件,并不能在 ARM 平臺上運(yùn)行。

(2)經(jīng)過 objcopy 這個(gè)工具轉(zhuǎn)換以后,得到了二進(jìn)制格式文件 Image,Image 文件相比于 vmlinusx 文件,除了格式不同以外,還被去除了許多注釋和調(diào)試的信息。

(3)Image 文件經(jīng)過壓縮以后得到了 piggy.gz,這個(gè)文件僅僅是 Image 的壓縮版,并無其他不同。

(4)接著編譯生成另外幾個(gè)模塊文件 misc.o、big_endian.o、head.o、head-xscale.o,這幾個(gè)文件組成一個(gè)叫 Bootstrap Loader 的組件,又叫引導(dǎo)程序,編譯生成 piggy.o 文件。

(5)最后 piggy.o 文件和 Bootstrap Loader 組成一個(gè) Bootable Kernel Image 文件(可啟動文件)。

經(jīng)過上面的分析不難知道 piggy.o 就是內(nèi)核鏡像,而剩下的幾個(gè)文件就組成了引導(dǎo)程序。知道了內(nèi)核的組成結(jié)構(gòu),Uboot 就是按照內(nèi)核的組成結(jié)構(gòu)一層一層剝開然后引導(dǎo)內(nèi)核的:

可以說 start_kernel之前的所有工作都是為了將環(huán)境準(zhǔn)備好,滿足start_kernel的要求,然后由start_kernel開始進(jìn)行內(nèi)核的加載:

關(guān)于 start_kernl函數(shù)的內(nèi)容太多,可以通過紅色回調(diào)函數(shù)看出,start_kernel函數(shù)基本是在回調(diào)很多對應(yīng)的注冊函數(shù)。為了本系列課程的結(jié)構(gòu)性這里就不展開所有知識點(diǎn)講解,本篇內(nèi)容接著前一篇設(shè)備樹的內(nèi)容重點(diǎn)講解下設(shè)備和驅(qū)動的匹配過程。

還記得上一篇講到的設(shè)備樹三大作用嗎?

  • 平臺標(biāo)識;

  • 運(yùn)行時(shí)配置;

  • 設(shè)備信息集合。

接下來我們就看看內(nèi)核在啟動的時(shí)候是如何尋找設(shè)備,驅(qū)動又如何和設(shè)備綁定的。

首先在平臺目錄下可以看到有很多平臺描述的文件,如圖:

有那么多的平臺,我們到底要執(zhí)行哪個(gè)平臺是首先要考慮的事情。這也是設(shè)備三大功能的第一個(gè)功能——平臺標(biāo)識。

  • 設(shè)備樹里有對設(shè)備根節(jié)點(diǎn)的 Compatible 描述,平臺文件里有對 __initconst的描述,如果兩個(gè)字段一致則找到了對應(yīng)的板級文件,這樣就通過設(shè)備樹把要用的設(shè)備平臺與其他平臺區(qū)分開來了,如圖:

找到平臺后就可以根據(jù)回調(diào)函數(shù)的指針調(diào)用該平臺的注冊函數(shù)。這里以飛思卡爾 imx.6dl 平臺為例,回調(diào)的時(shí)候會調(diào)用 imx6q_init_machine函數(shù),如下:

這里補(bǔ)充一個(gè)知識點(diǎn),細(xì)心的讀者也許發(fā)現(xiàn)了在 Compatible 字段里用逗號分隔了兩個(gè)字符串。板級匹配的時(shí)候用的是哪個(gè)字符串,另外一個(gè)字符串又是做什么用?首先后面的字段 "fsl,imx6dl" 是抽象共用平臺描述符,前面的字段 "fsl,imx6dl-sabresd" 是通用平臺下的具體平臺描述符,可以理解為母板和子板的區(qū)別。在具體的子板文件中我們可以通過前面的字段進(jìn)行設(shè)備信息的獲取,如圖:

  • 接著是運(yùn)行時(shí)配置,讓內(nèi)核在啟動的時(shí)候根據(jù)參數(shù)設(shè)置進(jìn)行不同的處理。有經(jīng)驗(yàn)的讀者清楚在 Uboot 里也有對 Bootargs 的配置,這里為什么多此一舉呢,是為了在 Uboot 中更靈活的對內(nèi)核啟動進(jìn)行配置。

  • 最后的作用就是設(shè)備信息集合,這是設(shè)備和驅(qū)動匹配的核心,也是工作中面對最多的情況。出于這一作用的內(nèi)容是工作中經(jīng)常遇到的重點(diǎn)也是難點(diǎn),我們專門用一篇內(nèi)容來詳細(xì)講解各級設(shè)備是如何展開的,并且手把手教你如何定制一套自己的開發(fā)板全新案例。

文章題目:Linux 的啟動流程
網(wǎng)站路徑:http://chinadenli.net/news9/104759.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、網(wǎng)站營銷服務(wù)器托管、外貿(mào)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管
国产精品第一香蕉视频| 日韩精品成区中文字幕| 一区二区三区18禁看| 国产欧美日韩精品一区二| 国产在线成人免费高清观看av| 儿媳妇的诱惑中文字幕| 欧美日韩精品一区免费| 大香蕉再在线大香蕉再在线| 精品香蕉一区二区在线| 精品欧美日韩一二三区| 草草夜色精品国产噜噜竹菊| 日韩中文字幕狠狠人妻| 欧美日本道一区二区三区| 激情丁香激情五月婷婷| 日木乱偷人妻中文字幕在线| 日本丁香婷婷欧美激情| 香蕉网尹人综合在线观看| 欧美黄色成人真人视频| 国产一区二区在线免费| 国产免费一区二区不卡| 亚洲欧美日韩综合在线成成| 日本高清一区免费不卡| 麻豆tv传媒在线观看| 久久香蕉综合网精品视频| 欧美一级特黄大片做受大屁股| 久久婷婷综合色拍亚洲| 91午夜少妇极品福利| 亚洲综合日韩精品欧美综合区| 国产成人精品一区二三区在线观看| 色鬼综合久久鬼色88| 精品偷拍一区二区三区| 成人国产激情福利久久| 国产一区二区三区草莓av| 午夜福利92在线观看| 国产精品99一区二区三区| 精品亚洲香蕉久久综合网| 亚洲一区二区三区免费的视频| 日韩一区欧美二区国产| 午夜成年人黄片免费观看| 欧美日韩人妻中文一区二区| 高中女厕偷拍一区二区三区|