嵌入式Linux驅(qū)動(dòng)開(kāi)發(fā)實(shí)踐
定 價(jià):89 元
- 作者:朱文偉 李建英
- 出版時(shí)間:2024/1/1
- ISBN:9787302649243
- 出 版 社:清華大學(xué)出版社
- 中圖法分類(lèi):TP316.85
- 頁(yè)碼:368
- 紙張:
- 版次:1
- 開(kāi)本:16開(kāi)
人們?nèi)粘I钪写蚪坏雷疃嗟木褪乔度胧较到y(tǒng),目前廣泛使用的手機(jī)、MP3播放器、智能家用電器、無(wú)人機(jī)、自動(dòng)駕駛汽車(chē)、機(jī)器人等都用到了嵌入式系統(tǒng),嵌入式系統(tǒng)的開(kāi)發(fā)占整個(gè)計(jì)算機(jī)系統(tǒng)開(kāi)發(fā)的比重也越來(lái)越大。本書(shū)詳細(xì)講解嵌入式Linux驅(qū)動(dòng)開(kāi)發(fā)和設(shè)備端系統(tǒng)構(gòu)建,并配套全書(shū)實(shí)例源代碼和作者QQ答疑服務(wù)。
《嵌入式Linux驅(qū)動(dòng)開(kāi)發(fā)實(shí)踐》共分12章,內(nèi)容包括嵌入式系統(tǒng)概述、搭建Linux安全開(kāi)發(fā)環(huán)境、必會(huì)的嵌入式開(kāi)發(fā)應(yīng)用層技術(shù)、內(nèi)核模塊開(kāi)發(fā)、字符設(shè)備驅(qū)動(dòng)、驅(qū)動(dòng)模塊的并發(fā)控制、塊設(shè)備驅(qū)動(dòng)、Linux平臺(tái)驅(qū)動(dòng)、基于AArch64的內(nèi)核和文件系統(tǒng)、設(shè)備樹(shù)、I2C驅(qū)動(dòng)實(shí)戰(zhàn)、SPI驅(qū)動(dòng)實(shí)戰(zhàn)。
《嵌入式Linux驅(qū)動(dòng)開(kāi)發(fā)實(shí)踐》適合作為嵌入式Linux驅(qū)動(dòng)開(kāi)發(fā)初學(xué)者的入門(mén)書(shū),以及嵌入式Linux開(kāi)發(fā)人員的參考書(shū),也適合作為高等院校電子、通信、自動(dòng)化、計(jì)算機(jī)等專(zhuān)業(yè)“嵌入式操作系統(tǒng)”課程的教材和教學(xué)參考書(shū)。
嵌入式開(kāi)發(fā)的涉及面很廣,必須集中某個(gè)知識(shí)點(diǎn)學(xué)透相關(guān)知識(shí),才能從事這方面的基本開(kāi)發(fā)工作,然后在工作中不斷提高。那應(yīng)該如何進(jìn)行學(xué)習(xí)呢?筆者的經(jīng)驗(yàn)是分兩大塊來(lái)學(xué),分別是主機(jī)端的驅(qū)動(dòng)和設(shè)備端的系統(tǒng)構(gòu)建。
本書(shū)內(nèi)容經(jīng)過(guò)精心設(shè)計(jì),使用Linux虛擬機(jī)來(lái)學(xué)習(xí)驅(qū)動(dòng)開(kāi)發(fā),并使用QEMU軟件模擬一個(gè)開(kāi)發(fā)板來(lái)學(xué)習(xí)設(shè)備端系統(tǒng)的構(gòu)建,降低讀者學(xué)習(xí)成本和入門(mén)門(mén)檻。
隨著超大規(guī)模集成電路的發(fā)展,計(jì)算機(jī)處理器技術(shù)不斷提高,計(jì)算機(jī)芯片的處理能力越來(lái)越強(qiáng),體積越來(lái)越小,計(jì)算機(jī)技術(shù)廣泛應(yīng)用到生活的方方面面。與人們?nèi)粘I畲蚪坏雷疃嗟木褪乔度胧较到y(tǒng),從目前廣泛使用的手機(jī)、MP3播放器、家用電器到無(wú)人機(jī)、自動(dòng)駕駛汽車(chē)、機(jī)器人,嵌入式系統(tǒng)的應(yīng)用無(wú)處不在。嵌入式系統(tǒng)的開(kāi)發(fā)占整個(gè)計(jì)算機(jī)系統(tǒng)開(kāi)發(fā)的比重也越來(lái)越大。
嵌入式系統(tǒng)開(kāi)發(fā)與傳統(tǒng)的計(jì)算機(jī)程序開(kāi)發(fā)不同。嵌入式系統(tǒng)開(kāi)發(fā)涉及軟件和硬件的開(kāi)發(fā),是一個(gè)協(xié)同工作的統(tǒng)一體。目前,已經(jīng)有許多的嵌入式系統(tǒng)硬件和操作系統(tǒng)軟件,其中應(yīng)用最廣泛的是ARM/AArch64嵌入式處理器和Linux系統(tǒng)。
寫(xiě)作思路
嵌入式開(kāi)發(fā)的涉及面很廣,要在一本書(shū)中講述所有內(nèi)容是不可能的。可以這么說(shuō),如果誰(shuí)看到某本書(shū)囊括很多內(nèi)容,但篇幅又不大,那基本上是蜻蜓點(diǎn)水,毫無(wú)深度。嵌入式開(kāi)發(fā)必須集中某個(gè)知識(shí)點(diǎn)學(xué)透相關(guān)知識(shí),才能從事這方面的基本開(kāi)發(fā),然后在工作中不斷提高。那應(yīng)該如何進(jìn)行學(xué)習(xí)呢?筆者的經(jīng)驗(yàn)是分兩大塊來(lái)學(xué),分別是主機(jī)端的驅(qū)動(dòng)和設(shè)備端系統(tǒng)的構(gòu)建。
通常嵌入式產(chǎn)品都會(huì)有一個(gè)主機(jī)端運(yùn)行的用戶(hù)程序(或稱(chēng)客戶(hù)端),它通過(guò)主機(jī)端的驅(qū)動(dòng)和設(shè)備端應(yīng)用程序通信,指示設(shè)備端完成某個(gè)功能;而設(shè)備端也是一個(gè)Linux系統(tǒng),它除運(yùn)行設(shè)備端應(yīng)用程序外,還要運(yùn)行設(shè)備端驅(qū)動(dòng)程序,以此讓設(shè)備端應(yīng)用程序和設(shè)備端的某個(gè)硬件設(shè)備通信。但初學(xué)者(比如,學(xué)生朋友)不可能購(gòu)買(mǎi)所有的設(shè)備端硬件(費(fèi)用太高)來(lái)學(xué)習(xí)設(shè)備端驅(qū)動(dòng),因此我們可以把學(xué)習(xí)驅(qū)動(dòng)的過(guò)程放在主機(jī)端來(lái),也就是在主機(jī)端的Linux虛擬機(jī)中學(xué)習(xí)驅(qū)動(dòng)開(kāi)發(fā),一旦學(xué)會(huì),以后轉(zhuǎn)到設(shè)備端開(kāi)發(fā)驅(qū)動(dòng)程序大同小異,甚至只是換個(gè)編譯器而已。
另外,筆者為了讓初學(xué)者節(jié)省學(xué)習(xí)成本,把主機(jī)端的驅(qū)動(dòng)開(kāi)發(fā)也盡量做成虛擬驅(qū)動(dòng)開(kāi)發(fā),也就是說(shuō)沒(méi)有硬件,不需要購(gòu)買(mǎi)昂貴的開(kāi)發(fā)板,也可以學(xué)習(xí)驅(qū)動(dòng)開(kāi)發(fā)。區(qū)別就是看不到實(shí)際硬件的工作結(jié)果,但我們可以用數(shù)據(jù)來(lái)表示,比如驅(qū)動(dòng)模塊收到上層發(fā)來(lái)的數(shù)據(jù)1,就表示燈亮了。在實(shí)際工作中,我們只需要替換調(diào)用一下廠家提供的硬件操作API函數(shù)即可,這些函數(shù)我們可以現(xiàn)學(xué)現(xiàn)用,沒(méi)必要在初學(xué)階段去掌握。
除驅(qū)動(dòng)開(kāi)發(fā)外,設(shè)備端的系統(tǒng)構(gòu)建也是一個(gè)難點(diǎn),幸運(yùn)的是,我們依然可以使用QEMU這個(gè)軟件來(lái)模擬一個(gè)開(kāi)發(fā)板,并在QEMU上編譯一個(gè)內(nèi)核并啟動(dòng)這個(gè)內(nèi)核,再加上文件系統(tǒng),等等。這些步驟與實(shí)際在開(kāi)發(fā)板上的操作區(qū)別不大。開(kāi)發(fā)板最多就是多了一個(gè)Uboot(類(lèi)似于計(jì)算機(jī)的BIOS)開(kāi)機(jī)引導(dǎo)程序,而這個(gè)開(kāi)機(jī)引導(dǎo)程序開(kāi)發(fā)板廠家也是會(huì)提供的。
基于這兩點(diǎn)(驅(qū)動(dòng)和基于內(nèi)核的系統(tǒng)構(gòu)建),我們以此為重點(diǎn)貫穿本書(shū),并給出較多的實(shí)例和詳細(xì)的說(shuō)明,相信讀者能夠快速進(jìn)入嵌入式開(kāi)發(fā)的大門(mén)。
源碼資源下載
本書(shū)配套示例源碼需要用微信掃描下面的二維碼獲取,也可按掃描出來(lái)的頁(yè)面提示輸入你的電子郵箱,把下載鏈接發(fā)送到郵箱中再下載。
如果在學(xué)習(xí)和下載資源的過(guò)程中遇到問(wèn)題,可以發(fā)送郵件至booksaga@163.com,郵件主題寫(xiě)“嵌入式Linux驅(qū)動(dòng)開(kāi)發(fā)實(shí)踐”。
作者答疑服務(wù)
如果在學(xué)習(xí)過(guò)程中遇到問(wèn)題,也可以向作者寫(xiě)信或加作者QQ,作者聯(lián)系方式參見(jiàn)下載資源中的相關(guān)文件。
作 者
2023年12月
朱文偉,名校計(jì)算機(jī)專(zhuān)業(yè)統(tǒng)招碩士,20多年C\C 、Java開(kāi)發(fā)經(jīng)驗(yàn)。主導(dǎo)開(kāi)發(fā)過(guò)密碼、圖形、人工智能等產(chǎn)品。精通Linux、Windows系統(tǒng)開(kāi)發(fā)及數(shù)據(jù)庫(kù)開(kāi)發(fā)技術(shù)。著有圖書(shū):
《高性能Linux網(wǎng)絡(luò)編程核心技術(shù)揭秘》《Linux C/C 服務(wù)器開(kāi)發(fā)實(shí)踐》《Qt 6.x從入門(mén)到精通》《PyQt 5從入門(mén)到精通》《Linux C與C 一線開(kāi)發(fā)實(shí)踐》《Visual C 2017從入門(mén)到精通》《Windows C/C 加密解密實(shí)戰(zhàn)》《密碼學(xué)原理與Java實(shí)現(xiàn)》《OpenCV 4.5計(jì)算機(jī)視覺(jué)開(kāi)發(fā)實(shí)戰(zhàn)(基于VC )》《OpenCV 4.5計(jì)算機(jī)視覺(jué)開(kāi)發(fā)實(shí)戰(zhàn):基于Python》。
第 1 章 嵌入式系統(tǒng)概述 1
1.1 嵌入式系統(tǒng) 1
1.2 Linux操作系統(tǒng) 2
1.3 Linux作為嵌入式操作系統(tǒng)的優(yōu)勢(shì) 2
1.4 嵌入式系統(tǒng)的開(kāi)發(fā)流程 4
1.5 嵌入式Linux系統(tǒng)的體系結(jié)構(gòu) 5
1.5.1 嵌入式處理器 5
1.5.2 嵌入式外圍硬件設(shè)備 5
1.5.3 嵌入式操作系統(tǒng) 6
1.5.4 設(shè)備驅(qū)動(dòng) 6
1.5.5 嵌入式應(yīng)用軟件 6
1.6 嵌入式Linux系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn) 6
1.7 Linux操作系統(tǒng)內(nèi)核 7
1.7.1 Linux內(nèi)核的組成 7
1.7.2 Linux內(nèi)核各部分的工作機(jī)制 8
1.8 Linux設(shè)備驅(qū)動(dòng)程序 12
1.8.1 Linux設(shè)備驅(qū)動(dòng)概述 12
1.8.2 設(shè)備驅(qū)動(dòng)的功能 13
1.8.3 設(shè)備的分類(lèi) 13
1.8.4 驅(qū)動(dòng)的分類(lèi) 14
1.8.5 設(shè)備驅(qū)動(dòng)與內(nèi)核的關(guān)系 16
1.8.6 設(shè)備驅(qū)動(dòng)的結(jié)構(gòu) 17
1.8.7 設(shè)備驅(qū)動(dòng)的設(shè)計(jì)和實(shí)現(xiàn)步驟 19
第 2 章 搭建Linux驅(qū)動(dòng)開(kāi)發(fā)環(huán)境 22
2.1 準(zhǔn)備虛擬機(jī)環(huán)境 22
2.1.1 在VMware下安裝Linux 22
2.1.2 開(kāi)啟登錄時(shí)的root賬號(hào) 25
2.1.3 關(guān)閉內(nèi)核自動(dòng)更新 27
2.1.4 解決Ubuntu上的vi方向鍵問(wèn)題 27
2.1.5 關(guān)閉防火墻 27
2.1.6 配置安裝源 28
2.1.7 安裝網(wǎng)絡(luò)工具包 28
2.1.8 安裝基本開(kāi)發(fā)工具 29
2.1.9 啟用SSH 29
2.1.10 做個(gè)快照 30
2.1.11 連接虛擬機(jī)Linux 31
2.1.12 和虛擬機(jī)互傳文件 42
2.2 安裝編譯工具 42
2.3 使用VS Code開(kāi)發(fā)內(nèi)核驅(qū)動(dòng)程序 43
2.4 使用Visual C 2017開(kāi)發(fā)應(yīng)用程序 48
第 3 章 嵌入式開(kāi)發(fā)必會(huì)應(yīng)用層技術(shù) 51
3.1 Linux啟動(dòng)過(guò)程 51
3.2 圖形模式與命令模式的切換方式 53
3.3 在文件中搜索 53
3.4 Linux關(guān)機(jī)和重啟 54
3.5 開(kāi)機(jī)自啟動(dòng) 55
3.6 查看Ubuntu的內(nèi)核版本 56
3.7 查看Ubuntu操作系統(tǒng)的版本 57
3.8 配置文件的區(qū)別 57
3.9 讓/etc/profile文件修改后立即生效 58
3.10 測(cè)試Web服務(wù)器的性能 59
3.10.1 架設(shè)Web服務(wù)器Apache 59
3.10.2 在Windows下測(cè)試Web服務(wù)器的性能 60
3.10.3 在Linux下測(cè)試Web服務(wù)器的性能 61
3.11 Linux中的文件權(quán)限 66
3.12 環(huán)境變量的獲取和設(shè)置 66
3.13 解析命令行參數(shù)函數(shù) 69
第 4 章 內(nèi)核模塊開(kāi)發(fā) 70
4.1 Linux內(nèi)核概述 70
4.2 內(nèi)核模塊簡(jiǎn)介 71
4.2.1 何為內(nèi)核模塊 71
4.2.2 增加內(nèi)核功能的兩種方法 72
4.2.3 使用模塊的優(yōu)缺點(diǎn) 72
4.2.4 常用的模塊操作命令 72
4.2.5 Linux內(nèi)核程序結(jié)構(gòu) 73
第 5 章 字符設(shè)備驅(qū)動(dòng) 76
5.1 Linux設(shè)備框架 76
5.2 字符設(shè)備的概念 77
5.3 字符設(shè)備驅(qū)動(dòng) 80
5.3.1 file_operations結(jié)構(gòu)體 80
5.3.2 字符設(shè)備驅(qū)動(dòng)開(kāi)發(fā)步驟 82
5.3.3 設(shè)備號(hào)的分配 85
5.4 驅(qū)動(dòng)開(kāi)發(fā)的常用函數(shù) 86
5.4.1 copy_from_user函數(shù) 86
5.4.2 copy_to_user函數(shù) 87
5.4.3 printk函數(shù) 88
5.4.4 register_chrdev函數(shù) 89
5.4.5 register_chrdev_region函數(shù) 91
5.4.6 alloc_chrdev_region函數(shù) 91
5.4.7 cdev_init函數(shù) 91
5.4.8 cdev_alloc函數(shù) 92
5.4.9 cdev_add函數(shù) 93
5.4.10 cdev_del函數(shù) 95
5.4.11 宏class_create 95
5.4.12 device_create函數(shù) 96
5.4.13 device_del函數(shù) 96
5.4.14 unregister_chrdev函數(shù) 97
5.4.15 實(shí)戰(zhàn)字符設(shè)備驅(qū)動(dòng) 97
5.5 字符設(shè)備的ioctl接口 106
5.5.1 什么是ioctl接口 106
5.5.2 為什么要引入ioctl接口 106
5.5.3 ioctl如何使用 106
5.5.4 定義命令 107
5.5.5 ioctl的基本應(yīng)用 109
5.5.6 ioctl處理結(jié)構(gòu)體 112
5.6 Linux虛擬驅(qū)動(dòng)框架設(shè)計(jì) 114
5.7 虛擬LED驅(qū)動(dòng)的實(shí)現(xiàn) 116
第 6 章 驅(qū)動(dòng)模塊的并發(fā)控制 122
6.1 嵌入式Linux系統(tǒng)的空間組成 122
6.1.1 操作系統(tǒng)內(nèi)核 122
6.1.2 操作系統(tǒng)的空間組成及模式 123
6.1.3 用戶(hù)空間訪問(wèn)內(nèi)核空間及模式切換 123
6.2 進(jìn)程的基本概念 124
6.2.1 進(jìn)程和線程的定義 124
6.2.2 進(jìn)程的類(lèi)型 125
6.2.3 進(jìn)程的內(nèi)存結(jié)構(gòu) 125
6.2.4 多任務(wù)機(jī)制 126
6.2.5 進(jìn)程與程序 126
6.2.6 進(jìn)程標(biāo)識(shí)符 127
6.2.7 線程標(biāo)識(shí)符 129
6.2.8 線程組及其標(biāo)識(shí)符TGID 129
6.2.9 進(jìn)程描述符 131
6.2.10 會(huì)話、進(jìn)程組以及控制終端 138
6.3 PID的管理 139
6.3.1 PID散列表 140
6.3.2 PID命名空間 140
6.3.3 局部ID和全局ID 142
6.3.4 進(jìn)程PID結(jié)構(gòu) 143
6.3.5 pid_link哈希表存儲(chǔ) 143
6.4 進(jìn)程切換分析 145
6.4.1 進(jìn)程的模式和分類(lèi) 145
6.4.2 進(jìn)程的5種基本狀態(tài) 146
6.4.3 進(jìn)程的切換過(guò)程分析 147
6.5 內(nèi)核進(jìn)程和線程管理編程 148
6.5.1 獲得進(jìn)程PID結(jié)構(gòu)體 148
6.5.2 從命名空間下的PID找到對(duì)應(yīng)的PID結(jié)構(gòu)體 149
6.5.3 獲取進(jìn)程的進(jìn)程號(hào) 150
6.5.4 改變PID結(jié)構(gòu)體的count字段 151
6.5.5 獲取進(jìn)程描述符信息 152
6.5.6 釋放進(jìn)程所占用的Cache空間 153
6.5.7 喚醒進(jìn)程 154
6.5.8 創(chuàng)建一個(gè)新的內(nèi)核線程 156
6.5.9 終止指定進(jìn)程 158
6.5.10 結(jié)束當(dāng)前正在執(zhí)行的進(jìn)程 159
6.6 并發(fā)控制的基本概念 160
6.6.1 什么是并發(fā) 160
6.6.2 臨界資源與臨界區(qū) 160
6.6.3 原子操作 160
6.6.4 并發(fā)控制的內(nèi)容 161
6.6.5 為何要并發(fā)控制 161
6.7 設(shè)備驅(qū)動(dòng)的并發(fā)控制機(jī)制 162
6.7.1 并發(fā)控制的基礎(chǔ)操作 162
6.7.2 自旋鎖 164
6.7.3 信號(hào)量 165
6.7.4 其他的并發(fā)控制機(jī)制 166
6.7.5 驅(qū)動(dòng)并發(fā)控制的設(shè)計(jì)方法 167
6.8 內(nèi)核同步編程 170
6.8.1 設(shè)置原子類(lèi)型的變量并讀取 170
6.8.2 遞增遞減原子變量值 171
6.8.3 初始化信號(hào)量 172
6.8.4 獲取信號(hào)量并減1(不可中斷) 173
6.8.5 獲取信號(hào)量并減1(可中斷) 174
6.8.6 在指定的時(shí)間內(nèi)獲取信號(hào)量 175
6.8.7 釋放信號(hào)量 176
第 7 章 塊設(shè)備驅(qū)動(dòng) 178
7.1 塊設(shè)備的概念 178
7.1.1 什么是塊設(shè)備 178
7.1.2 常用的塊設(shè)備 178
7.1.3 塊設(shè)備和字符設(shè)備的區(qū)別 179
7.1.4 塊設(shè)備相關(guān)的幾個(gè)單位 180
7.1.5 塊設(shè)備的訪問(wèn) 181
7.2 塊設(shè)備驅(qū)動(dòng)程序的概念 182
7.2.1 什么是塊設(shè)備驅(qū)動(dòng)程序 182
7.2.2 為什么需要了解塊設(shè)備驅(qū)動(dòng) 182
7.2.3 塊設(shè)備驅(qū)動(dòng)的組成部分 183
7.2.4 塊設(shè)備驅(qū)動(dòng)框架 184
7.3 塊設(shè)備驅(qū)動(dòng)的關(guān)鍵數(shù)據(jù)結(jié)構(gòu) 187
7.3.1 通用硬盤(pán)結(jié)構(gòu)gendisk 187
7.3.2 塊設(shè)備對(duì)象結(jié)構(gòu)block_device 188
7.3.3 bio結(jié)構(gòu) 189
7.3.4 請(qǐng)求隊(duì)列request_queue結(jié)構(gòu) 189
7.3.5 請(qǐng)求結(jié)構(gòu)request 190
7.3.6 磁盤(pán)操作結(jié)構(gòu)block_device_operations 191
7.4 塊設(shè)備驅(qū)動(dòng)中的I/O請(qǐng)求處理函數(shù) 192
7.4.1 使用請(qǐng)求隊(duì)列處理I/O請(qǐng)求 192
7.4.2 不使用請(qǐng)求隊(duì)列處理I/O請(qǐng)求 192
7.5 塊設(shè)備驅(qū)動(dòng)編寫(xiě)的步驟 193
7.6 重要函數(shù) 193
7.6.1 注冊(cè) 193
7.6.2 塊設(shè)備操作 194
7.7 實(shí)戰(zhàn)案例:用RAM模擬一個(gè)塊設(shè)備 195
第 8 章 Linux平臺(tái)驅(qū)動(dòng) 203
8.1 平臺(tái)設(shè)備驅(qū)動(dòng)模型 203
8.1.1 驅(qū)動(dòng)的分隔與分離 203
8.1.2 驅(qū)動(dòng)的分層 205
8.1.3 基本概念 205
8.1.4 什么是platform總線 206
8.2 platform驅(qū)動(dòng) 209
8.2.1 platform_driver結(jié)構(gòu)體 209
8.2.2 platform主要函數(shù) 211
8.2.3 platform驅(qū)動(dòng)框架 212
8.2.4 platform_device的注冊(cè)過(guò)程 214
8.3 platform設(shè)備 215
8.4 實(shí)現(xiàn)platform驅(qū)動(dòng) 218
第 9 章 基于AArch64的內(nèi)核和文件系統(tǒng) 229
9.1 認(rèn)識(shí)QEMU 230
9.1.1 QEMU是什么 230
9.1.2 QEMU的兩種執(zhí)行模式 231
9.1.3 QEMU的用途 231
9.1.4 使用QEMU虛擬機(jī)的幾種選擇 231
9.2 不編譯運(yùn)行AArch64程序 232
9.2.1 準(zhǔn)備一個(gè)現(xiàn)成的AArch64程序 233
9.2.2 安裝Linux版的QEMU 233
9.2.3 下載交叉編譯器 238
9.2.4 讓AArch64程序運(yùn)行起來(lái) 238
9.3 編譯運(yùn)行AArch64程序 240
9.4 制作簡(jiǎn)易文件系統(tǒng) 244
9.4.1 BusyBox簡(jiǎn)介 245
9.4.2 編譯/安裝BusyBox 246
9.4.3 制作根文件系統(tǒng)的映像文件 249
9.5 非嵌入式方式啟動(dòng)內(nèi)核 250
9.5.1 BusyBox啟動(dòng)過(guò)程簡(jiǎn)要分析 254
9.5.2 在新內(nèi)核系統(tǒng)中運(yùn)行C程序 256
9.6 基本功能的完善 257
9.6.1 掛載proc支持ifconfig 257
9.6.2 掛載sysfs支持lspci 259
9.6.3 實(shí)現(xiàn)文件系統(tǒng)可寫(xiě) 264
9.7 QEMU用戶(hù)網(wǎng)絡(luò)模式 265
9.7.1 不使用-net選項(xiàng) 265
9.7.2 使用-net選項(xiàng) 269
9.8 QEMU橋接網(wǎng)絡(luò)模式 270
9.8.1 網(wǎng)橋的概念 270
9.8.2 TUN/TAP的工作原理 270
9.8.3 帶TAP的QEMU系統(tǒng)架構(gòu) 272
9.8.4 brctl的簡(jiǎn)單用法 273
9.8.5 三個(gè)網(wǎng)絡(luò)配置選項(xiàng) 275
9.8.6 實(shí)戰(zhàn)橋接模式網(wǎng)絡(luò) 277
9.8.7 手工命令創(chuàng)建TAP網(wǎng)卡 282
9.8.8 使用qemu-ifup 284
9.9 QEMU運(yùn)行國(guó)產(chǎn)操作系統(tǒng) 285
9.9.1 安裝Windows版的QEMU 286
9.9.2 UEFI固件下載 286
9.9.3 安裝麒麟操作系統(tǒng) 287
9.9.4 運(yùn)行麒麟系統(tǒng) 289
第 10 章 設(shè)備樹(shù) 291
10.1 設(shè)備樹(shù)的概念 291
10.1.1 什么是設(shè)備樹(shù) 291
10.1.2 設(shè)備樹(shù)的起源 292
10.1.3 Linux內(nèi)核對(duì)硬件的描述方式 294
10.1.4 設(shè)備樹(shù)和內(nèi)核的關(guān)系 295
10.2 DTS文件和DTSI文件 295
10.3 DTB文件和DTC文件 296
10.4 設(shè)備樹(shù)框架 297
10.4.1 布局與節(jié)點(diǎn) 298
10.4.2 節(jié)點(diǎn)名 299
10.4.3 引用 300
10.4.4 cpus節(jié)點(diǎn) 301
10.5 屬性 302
10.5.1 兼容性屬性 303
10.5.2 model屬性 305
10.5.3 status屬性 305
10.5.4 #address-cells和#size-cells 305
10.5.5 reg屬性 306
10.5.6 ranges屬性 307
10.5.7 name屬性 308
10.5.8 device_type屬性 308
10.5.9 address屬性 308
10.5.10 interrupts屬性 309
10.6 設(shè)備樹(shù)操作常用API 311
10.6.1 device_node 311
10.6.2 查找節(jié)點(diǎn)API 312
10.6.3 提取通用屬性API 312
10.6.4 提取addr屬性API 313
10.6.5 提取resource屬性API 314
10.6.6 提取GPIO屬性API 315
10.6.7 提取irq屬性API 315
10.6.8 從設(shè)備樹(shù)中提取MAC地址 315
10.7 編寫(xiě)設(shè)備樹(shù)并編譯 315
第 11 章 I2C驅(qū)動(dòng)實(shí)戰(zhàn) 317
11.1 I2C的基本概念 317
11.1.1 總線的定義 317
11.1.2 什么是I2C 318
11.1.3 I2C總線 318
11.1.4 I2C總線規(guī)范 318
11.1.5 I2C總線的特點(diǎn) 319
11.2 I2C驅(qū)動(dòng)實(shí)戰(zhàn) 320
第 12 章 SPI驅(qū)動(dòng)實(shí)戰(zhàn) 334
12.1 SPI概述 334
12.1.1 什么是SPI 334
12.1.2 SPI工作模式 337
12.1.3 SPI傳輸機(jī)制 338
12.1.4 I2C和SPI的對(duì)比 340
12.2 SPI驅(qū)動(dòng)軟件架構(gòu) 340
12.2.1 SPI通用設(shè)備驅(qū)動(dòng)程序 341
12.2.2 SPI控制器驅(qū)動(dòng)程序 342
12.2.3 SPI協(xié)議驅(qū)動(dòng)程序 342
12.2.4 隊(duì)列化 343
12.3 SPI虛擬驅(qū)動(dòng)實(shí)戰(zhàn) 343