關(guān)于我們
書單推薦
新書推薦
|
Linux設(shè)備驅(qū)動(dòng)開發(fā)詳解
本書除了對(duì)Linux設(shè)備驅(qū)動(dòng)基礎(chǔ)理論部分進(jìn)行了詳細(xì)的講解外,還加強(qiáng)了對(duì)驅(qū)動(dòng)編程所涉及的Linux內(nèi)核最底層機(jī)理的講解,內(nèi)容包括中斷、定時(shí)器、進(jìn)程生命周期、uevent、并發(fā)、編譯亂序、執(zhí)行亂序、等待隊(duì)列、I/O模型、內(nèi)在管理等。
Linux從未停歇前進(jìn)的腳步。Linus Torvalds,世界上最偉大的程序員之一,Linux內(nèi)核的創(chuàng)始人,Git的締造者,現(xiàn)在仍然在沒日沒夜地合并補(bǔ)丁、升級(jí)內(nèi)核。做技術(shù)的人,從來沒有終南捷徑,拼得就是坐冷板凳的傻勁。
這是一個(gè)連閱讀都被碎片化的時(shí)代,在這樣一個(gè)時(shí)代,人們趨向于激進(jìn)、浮躁,內(nèi)心的不安寧使我們極難靜下心來研究什么。我見過許多Linux工程師,他們的簡歷上寫著“精通”Linux內(nèi)核,有多年的工作經(jīng)驗(yàn),而他們的“精通”卻只是把某個(gè)寄存器從0改成1,從1改成0的不斷重復(fù);我也見過許多Linux工程師,他們終日埋頭苦干,敲打著自己的機(jī)器和電路板,卻從未冷靜下來思考,并不斷重構(gòu)和升華自己的知識(shí)體系。 這是要把“牢底”坐穿的程序員,這樣“忙忙碌碌”的程序員,從來都不算是好程序員。 對(duì)于優(yōu)秀的程序員,其最優(yōu)秀的品質(zhì)是能夠心平氣和地學(xué)習(xí)與思考問題,透析代碼背后的架構(gòu)、原理和設(shè)計(jì)思想。沒有思想的代碼是垃圾代碼,沒有思想的程序員,只是在完成低水平重復(fù)建設(shè)的體力活。很多程序員從不過問自己寫的代碼最后在機(jī)器里面是怎么跑的,很多事情莫名其妙地發(fā)生了,很多bug莫名其妙地消失了……他們永遠(yuǎn)都在得過且過。 由此,衍生出了本書的第一個(gè)出發(fā)點(diǎn),那就是帶給讀者更多關(guān)于Linux開發(fā)思想的講解,幫助讀者奠定根基。本書呈現(xiàn)給讀者的更多的是一種思考方法,而不是知識(shí)點(diǎn)的簡單羅列。
宋寶華 Linux布道者,知名嵌入式系統(tǒng)專家,《Essential Linux Device Drivers》譯者。作為最早從事Linux內(nèi)核與設(shè)備驅(qū)動(dòng)研究的專家之一,他在眾多國內(nèi)外知名企業(yè)開展Linux技術(shù)培訓(xùn)。他也是一位活躍的Linux開發(fā)者和深度實(shí)踐者,為Linux官方內(nèi)核貢獻(xiàn)了大量的Linux源碼并承擔(dān)代碼審核工作。至今已向Linux官方內(nèi)核提交逾數(shù)萬行代碼和幾百個(gè)補(bǔ)丁。他的《Linux設(shè)備驅(qū)動(dòng)開發(fā)詳解》系列書在嵌入式Linux開發(fā)者中有口皆碑,是眾多Linux書籍中為數(shù)不多的暢銷書。
贊譽(yù)
推薦序一 推薦序二 前言 第1章 Linux設(shè)備驅(qū)動(dòng)概述及開發(fā)環(huán)境構(gòu)建 1 1.1 設(shè)備驅(qū)動(dòng)的作用 1 1.2 無操作系統(tǒng)時(shí)的設(shè)備驅(qū)動(dòng) 2 1.3 有操作系統(tǒng)時(shí)的設(shè)備驅(qū)動(dòng) 4 1.4 Linux設(shè)備驅(qū)動(dòng) 5 1.4.1 設(shè)備的分類及特點(diǎn) 5 1.4.2 Linux設(shè)備驅(qū)動(dòng)與整個(gè)軟硬件系統(tǒng)的關(guān)系 6 1.4.3 Linux設(shè)備驅(qū)動(dòng)的重點(diǎn)、難點(diǎn) 7 1.5 Linux設(shè)備驅(qū)動(dòng)的開發(fā)環(huán)境構(gòu)建 8 1.5.1 PC上的Linux環(huán)境 8 1.5.2 QEMU實(shí)驗(yàn)平臺(tái) 11 1.5.3 源代碼閱讀和編輯 13 1.6 設(shè)備驅(qū)動(dòng)Hello World:LED驅(qū)動(dòng) 15 1.6.1 無操作系統(tǒng)時(shí)的LED驅(qū)動(dòng) 15 1.6.2 Linux下的LED驅(qū)動(dòng) 15 第2章 驅(qū)動(dòng)設(shè)計(jì)的硬件基礎(chǔ) 20 2.1 處理器 20 2.1.1 通用處理器 20 2.1.2 數(shù)字信號(hào)處理器 22 2.2 存儲(chǔ)器 24 2.3 接口與總線 28 2.3.1 串口 28 2.3.2 I2C 29 2.3.3 SPI 30 2.3.4 USB 31 2.3.5 以太網(wǎng)接口 33 2.3.6 PCI和PCI-E 34 2.3.7 SD和SDIO 36 2.4 CPLD和FPGA 37 2.5 原理圖分析 40 2.6 硬件時(shí)序分析 42 2.6.1 時(shí)序分析的概念 42 2.6.2 典型的硬件時(shí)序 43 2.7 芯片數(shù)據(jù)手冊(cè)閱讀方法 44 2.8 儀器儀表使用 47 2.8.1 萬用表 47 2.8.2 示波器 47 2.8.3 邏輯分析儀 49 2.9 總結(jié) 51 第3章 Linux內(nèi)核及內(nèi)核編程 52 3.1 Linux內(nèi)核的發(fā)展與演變 52 3.2 Linux 2.6后的內(nèi)核特點(diǎn) 56 3.3 Linux內(nèi)核的組成 59 3.3.1 Linux內(nèi)核源代碼的目錄結(jié)構(gòu) 59 3.3.2 Linux內(nèi)核的組成部分 60 3.3.3 Linux內(nèi)核空間與用戶空間 64 3.4 Linux內(nèi)核的編譯及加載 64 3.4.1 Linux內(nèi)核的編譯 64 3.4.2 Kconfig和Makefile 66 3.4.3 Linux內(nèi)核的引導(dǎo) 74 3.5 Linux下的C編程特點(diǎn) 75 3.5.1 Linux編碼風(fēng)格 75 3.5.2 GNU C與ANSI C 78 3.5.3 do { } while(0) 語句 83 3.5.4 goto語句 85 3.6 工具鏈 85 3.7 實(shí)驗(yàn)室建設(shè) 88 3.8 串口工具 89 3.9 總結(jié) 91 第4章 Linux內(nèi)核模塊 92 4.1 Linux內(nèi)核模塊簡介 92 4.2 Linux內(nèi)核模塊程序結(jié)構(gòu) 95 4.3 模塊加載函數(shù) 95 4.4 模塊卸載函數(shù) 97 4.5 模塊參數(shù) 97 4.6 導(dǎo)出符號(hào) 99 4.7 模塊聲明與描述 100 4.8 模塊的使用計(jì)數(shù) 100 4.9 模塊的編譯 101 4.10 使用模塊“繞開”GPL 102 4.11 總結(jié) 103 第5章 Linux文件系統(tǒng)與設(shè)備文件 104 5.1 Linux文件操作 104 5.1.1 文件操作系統(tǒng)調(diào)用 104 5.1.2 C庫文件操作 108 5.2 Linux文件系統(tǒng) 109 5.2.1 Linux文件系統(tǒng)目錄結(jié)構(gòu) 109 5.2.2 Linux文件系統(tǒng)與設(shè)備驅(qū)動(dòng) 110 5.3 devfs 114 5.4 udev用戶空間設(shè)備管理 116 5.4.1 udev與devfs的區(qū)別 116 5.4.2 sysfs文件系統(tǒng)與Linux設(shè)備模型 119 5.4.3 udev的組成 128 5.4.4 udev規(guī)則文件 129 5.5 總結(jié) 133 第6章 字符設(shè)備驅(qū)動(dòng) 134 6.1 Linux字符設(shè)備驅(qū)動(dòng)結(jié)構(gòu) 134 6.1.1 cdev結(jié)構(gòu)體 134 6.1.2 分配和釋放設(shè)備號(hào) 136 6.1.3 f?ile_operations結(jié)構(gòu)體 136 6.1.4 Linux字符設(shè)備驅(qū)動(dòng)的組成 138 6.2 globalmem虛擬設(shè)備實(shí)例描述 142 6.3 globalmem設(shè)備驅(qū)動(dòng) 142 6.3.1 頭文件、宏及設(shè)備結(jié)構(gòu)體 142 6.3.2 加載與卸載設(shè)備驅(qū)動(dòng) 143 6.3.3 讀寫函數(shù) 144 6.3.4 seek函數(shù) 146 6.3.5 ioctl函數(shù) 146 6.3.6 使用文件私有數(shù)據(jù) 148 6.4 globalmem驅(qū)動(dòng)在用戶空間中的驗(yàn)證 156 6.5 總結(jié) 157 第7章 Linux設(shè)備驅(qū)動(dòng)中的并發(fā)控制 158 7.1 并發(fā)與競態(tài) 158 7.2 編譯亂序和執(zhí)行亂序 160 7.3 中斷屏蔽 165 7.4 原子操作 166 7.4.1 整型原子操作 167 7.4.2 位原子操作 168 7.5 自旋鎖 169 7.5.1 自旋鎖的使用 169 7.5.2 讀寫自旋鎖 173 7.5.3 順序鎖 174 7.5.4 讀-復(fù)制-更新 176 7.6 信號(hào)量 181 7.7 互斥體 183 7.8 完成量 184 7.9 增加并發(fā)控制后的globalmem的設(shè)備驅(qū)動(dòng) 185 7.10 總結(jié) 188 第8章 Linux設(shè)備驅(qū)動(dòng)中的阻塞與非阻塞I/O 189 8.1 阻塞與非阻塞I/O 189 8.1.1 等待隊(duì)列 191 8.1.2 支持阻塞操作的globalf?ifo設(shè)備驅(qū)動(dòng) 194 8.1.3 在用戶空間驗(yàn)證globalf?ifo的讀寫 198 8.2 輪詢操作 198 8.2.1 輪詢的概念與作用 198 8.2.2 應(yīng)用程序中的輪詢編程 199 8.2.3 設(shè)備驅(qū)動(dòng)中的輪詢編程 201 8.3 支持輪詢操作的globalf?ifo驅(qū)動(dòng) 202 8.3.1 在globalf?ifo驅(qū)動(dòng)中增加輪詢操作 202 8.3.2 在用戶空間中驗(yàn)證globalf?ifo設(shè)備的輪詢 203 8.4 總結(jié) 205 第9章 Linux設(shè)備驅(qū)動(dòng)中的異步通知與異步I/O 206 9.1 異步通知的概念與作用 206 9.2 Linux異步通知編程 207 9.2.1 Linux信號(hào) 207 9.2.2 信號(hào)的接收 208 9.2.3 信號(hào)的釋放 210 9.3 支持異步通知的globalf?ifo驅(qū)動(dòng) 212 9.3.1 在globalf?ifo驅(qū)動(dòng)中增加異步通知 212 9.3.2 在用戶空間中驗(yàn)證globalf?ifo的異步通知 214 9.4 Linux異步I/O 215 9.4.1 AIO概念與GNU C庫AIO 215 9.4.2 Linux內(nèi)核AIO與libaio 219 9.4.3 AIO與設(shè)備驅(qū)動(dòng) 222 9.5 總結(jié) 223 第10章 中斷與時(shí)鐘 224 10.1 中斷與定時(shí)器 224 10.2 Linux中斷處理程序架構(gòu) 227 10.3 Linux中斷編程 228 10.3.1 申請(qǐng)和釋放中斷 228 10.3.2 使能和屏蔽中斷 230 10.3.3 底半部機(jī)制 230 10.3.4 實(shí)例:GPIO按鍵的中斷 235 10.4 中斷共享 237 10.5 內(nèi)核定時(shí)器 238 10.5.1 內(nèi)核定時(shí)器編程 238 10.5.2 內(nèi)核中延遲的工作delayed_work 242 10.5.3 實(shí)例:秒字符設(shè)備 243 10.6 內(nèi)核延時(shí) 247 10.6.1 短延遲 247 10.6.2 長延遲 248 10.6.3 睡著延遲 248 10.7 總結(jié) 250 第11章 內(nèi)存與I/O訪問 251 11.1 CPU與內(nèi)存、I/O 251 11.1.1 內(nèi)存空間與I/O空間 251 11.1.2 內(nèi)存管理單元 252 11.2 Linux內(nèi)存管理 256 11.3 內(nèi)存存取 261 11.3.1 用戶空間內(nèi)存動(dòng)態(tài)申請(qǐng) 261 11.3.2 內(nèi)核空間內(nèi)存動(dòng)態(tài)申請(qǐng) 262 11.4 設(shè)備I/O端口和I/O內(nèi)存的訪問 267 11.4.1 Linux I/O端口和I/O內(nèi)存訪問接口 267 11.4.2 申請(qǐng)與釋放設(shè)備的I/O端口和I/O內(nèi)存 268 11.4.3 設(shè)備I/O端口和I/O內(nèi)存訪問流程 269 11.4.4 將設(shè)備地址映射到用戶空間 270 11.5 I/O內(nèi)存靜態(tài)映射 276 11.6 DMA 277 11.6.1 DMA與Cache一致性 278 11.6.2 Linux下的DMA編程 279 11.7 總結(jié) 285 第12章 Linux設(shè)備驅(qū)動(dòng)的軟件架構(gòu)思想 286 12.1 Linux驅(qū)動(dòng)的軟件架構(gòu) 286 12.2 platform設(shè)備驅(qū)動(dòng) 290 12.2.1 platform總線、設(shè)備與驅(qū)動(dòng) 290 12.2.2 將globalf?ifo作為platform設(shè)備 293 12.2.3 platform設(shè)備資源和數(shù)據(jù) 295 12.3 設(shè)備驅(qū)動(dòng)的分層思想 299 12.3.1 設(shè)備驅(qū)動(dòng)核心層和例化 299 12.3.2 輸入設(shè)備驅(qū)動(dòng) 301 12.3.3 RTC設(shè)備驅(qū)動(dòng) 306 12.3.4 Framebuffer設(shè)備驅(qū)動(dòng) 309 12.3.5 終端設(shè)備驅(qū)動(dòng) 311 12.3.6 misc設(shè)備驅(qū)動(dòng) 316 12.3.7 驅(qū)動(dòng)核心層 321 12.4 主機(jī)驅(qū)動(dòng)與外設(shè)驅(qū)動(dòng)分離的設(shè)計(jì)思想 321 12.4.1 主機(jī)驅(qū)動(dòng)與外設(shè)驅(qū)動(dòng)分離 321 12.4.2 Linux SPI主機(jī)和設(shè)備驅(qū)動(dòng) 322 12.5 總結(jié) 330 第13章 Linux塊設(shè)備驅(qū)動(dòng) 331 13.1 塊設(shè)備的I/O操作特點(diǎn) 331 13.2 Linux塊設(shè)備驅(qū)動(dòng)結(jié)構(gòu) 332 13.2.1 block_device_operations結(jié)構(gòu)體 332 13.2.2 gendisk結(jié)構(gòu)體 334 13.2.3 bio、request和request_queue 335 13.2.4 I/O調(diào)度器 339 13.3 Linux塊設(shè)備驅(qū)動(dòng)的初始化 340 13.4 塊設(shè)備的打開與釋放 342 13.5 塊設(shè)備驅(qū)動(dòng)的ioctl函數(shù) 342 13.6 塊設(shè)備驅(qū)動(dòng)的I/O請(qǐng)求處理 343 13.6.1 使用請(qǐng)求隊(duì)列 343 13.6.2 不使用請(qǐng)求隊(duì)列 347 13.7 實(shí)例:vmem_disk驅(qū)動(dòng) 349 13.7.1 vmem_disk的硬件原理 349 13.7.2 vmem_disk驅(qū)動(dòng)模塊的加載與卸載 349 13.7.3 vmem_disk設(shè)備驅(qū)動(dòng)的block_device_operations 351 13.7.4 vmem_disk的I/O請(qǐng)求處理 352 13.8 Linux MMC子系統(tǒng) 354 13.9 總結(jié) 357 第14章 Linux網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng) 358 14.1 Linux網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)的結(jié)構(gòu) 358 14.1.1 網(wǎng)絡(luò)協(xié)議接口層 359 14.1.2 網(wǎng)絡(luò)設(shè)備接口層 363 14.1.3 設(shè)備驅(qū)動(dòng)功能層 367 14.2 網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)的注冊(cè)與注銷 367 14.3 網(wǎng)絡(luò)設(shè)備的初始化 369 14.4 網(wǎng)絡(luò)設(shè)備的打開與釋放 370 14.5 數(shù)據(jù)發(fā)送流程 371 14.6 數(shù)據(jù)接收流程 372 14.7 網(wǎng)絡(luò)連接狀態(tài) 375 14.8 參數(shù)設(shè)置和統(tǒng)計(jì)數(shù)據(jù) 377 14.9 DM9000網(wǎng)卡設(shè)備驅(qū)動(dòng)實(shí)例 380 14.9.1 DM9000網(wǎng)卡硬件描述 380 14.9.2 DM9000網(wǎng)卡驅(qū)動(dòng)設(shè)計(jì)分析 380 14.10 總結(jié) 386 第15章 Linux I2C核心、總線與設(shè)備驅(qū)動(dòng) 387 15.1 Linux I2C體系結(jié)構(gòu) 387 15.2 Linux I2C核心 394 15.3 Linux I2C適配器驅(qū)動(dòng) 396 15.3.1 I2C適配器驅(qū)動(dòng)的注冊(cè)與注銷 396 15.3.2 I2C總線的通信方法 397 15.4 Linux I2C設(shè)備驅(qū)動(dòng) 399 15.4.1 Linux I2C設(shè)備驅(qū)動(dòng)的模塊加載與卸載 400 15.4.2 Linux I2C設(shè)備驅(qū)動(dòng)的數(shù)據(jù)傳輸 400 15.4.3 Linux的i2c-dev.c文件分析 400 15.5 Tegra I2C總線驅(qū)動(dòng)實(shí)例 405 15.6 AT24xx EEPROM的I2C設(shè)備驅(qū)動(dòng)實(shí)例 410 15.7 總結(jié) 413 第16章 USB主機(jī)、設(shè)備與Gadget驅(qū)動(dòng) 414 16.1 Linux USB驅(qū)動(dòng)層次 414 16.1.1 主機(jī)側(cè)與設(shè)備側(cè)USB驅(qū)動(dòng) 414 16.1.2 設(shè)備、配置、接口、端點(diǎn) 415 16.2 USB主機(jī)控制器驅(qū)動(dòng) 420 16.2.1 USB主機(jī)控制器驅(qū)動(dòng)的整體結(jié)構(gòu) 420 16.2.2 實(shí)例:Chipidea USB主機(jī)驅(qū)動(dòng) 425 16.3 USB設(shè)備驅(qū)動(dòng) 425 16.3.1 USB設(shè)備驅(qū)動(dòng)的整體結(jié)構(gòu) 425 16.3.2 USB請(qǐng)求塊 430 16.3.3 探測和斷開函數(shù) 435 16.3.4 USB骨架程序 436 16.3.5 實(shí)例:USB鍵盤驅(qū)動(dòng) 443 16.4 USB UDC與Gadget驅(qū)動(dòng) 446 16.4.1 UDC和Gadget驅(qū)動(dòng)的關(guān)鍵數(shù)據(jù)結(jié)構(gòu)與API 446 16.4.2 實(shí)例:Chipidea USB UDC驅(qū)動(dòng) 451 16.4.3 實(shí)例:Loopback Function驅(qū)動(dòng) 453 16.5 USB OTG驅(qū)動(dòng) 456 16.6 總結(jié) 458 第17章 I2C、SPI、USB驅(qū)動(dòng)架構(gòu)類比 459 17.1 I2C、SPI、USB驅(qū)動(dòng)架構(gòu) 459 17.2 I2C主機(jī)和外設(shè)眼里的Linux世界 460 第18章 ARM Linux設(shè)備樹 461 18.1 ARM設(shè)備樹起源 461 18.2 設(shè)備樹的組成和結(jié)構(gòu) 462 18.2.1 DTS、DTC和DTB等 462 18.2.2 根節(jié)點(diǎn)兼容性 468 18.2.3 設(shè)備節(jié)點(diǎn)兼容性 470 18.2.4 設(shè)備節(jié)點(diǎn)及l(fā)abel的命名 475 18.2.5 地址編碼 477 18.2.6 中斷連接 479 18.2.7 GPIO、時(shí)鐘、pinmux連接 480 18.3 由設(shè)備樹引發(fā)的BSP和驅(qū)動(dòng)變更 484 18.4 常用的OF API 490 18.5 總結(jié) 493 第19章 Linux電源管理的系統(tǒng)架構(gòu)和驅(qū)動(dòng) 494 19.1 Linux電源管理的全局架構(gòu) 494 19.2 CPUFreq驅(qū)動(dòng) 495 19.2.1 SoC的CPUFreq驅(qū)動(dòng)實(shí)現(xiàn) 495 19.2.2 CPUFreq的策略 501 19.2.3 CPUFreq的性能測試和調(diào)優(yōu) 501 19.2.4 CPUFreq通知 502 19.3 CPUIdle驅(qū)動(dòng) 504 19.4 PowerTop 508 19.5 Regulator驅(qū)動(dòng) 508 19.6 OPP 511 19.7 PM QoS 515 19.8 CPU熱插拔 518 19.9 掛起到RAM 522 19.10 運(yùn)行時(shí)的PM 528 19.11 總結(jié) 534 第20章 Linux芯片級(jí)移植及底層驅(qū)動(dòng) 535 20.1 ARM Linux底層驅(qū)動(dòng)的組成和現(xiàn)狀 535 20.2 內(nèi)核節(jié)拍驅(qū)動(dòng) 536 20.3 中斷控制器驅(qū)動(dòng) 541 20.4 SMP多核啟動(dòng)以及CPU熱插拔驅(qū)動(dòng) 549 20.5 DEBUG_LL和EARLY_PRINTK的設(shè)置 556 20.6 GPIO驅(qū)動(dòng) 557 20.7 pinctrl驅(qū)動(dòng) 560 20.8 時(shí)鐘驅(qū)動(dòng) 572 20.9 dmaengine驅(qū)動(dòng) 578 20.10 總結(jié) 580 第21章 Linux設(shè)備驅(qū)動(dòng)的調(diào)試 581 21.1 GDB調(diào)試器的用法 581 21.1.1 GDB的基本用法 581 21.1.2 DDD圖形界面調(diào)試工具 591 21.2 Linux內(nèi)核調(diào)試 594 21.3 內(nèi)核打印信息——printk() 596 21.4 DEBUG_LL和EARLY_PRINTK 599 21.5 使用“/proc” 600 21.6 Oops 606 21.7 BUG_ON()和WARN_ON() 608 21.8 strace 609 21.9 KGDB 610 21.10 使用仿真器調(diào)試內(nèi)核 612 21.11 應(yīng)用程序調(diào)試 613 21.12 Linux性能監(jiān)控與調(diào)優(yōu)工具 616 21.13 總結(jié) 618
你還可能感興趣
我要評(píng)論
|