| 書[0名0]: | Linux設備驅動開發詳解:基於新的Linux 4.0內核|4733972 |
| 圖書定價: | 89元 |
| 圖書作者: | 宋寶華 |
| 齣版社: | 機械工業齣版社 |
| 齣版日期: | 2015/8/1 0:00:00 |
| ISBN號: | 9787111507895 |
| 開本: | 16開 |
| 頁數: | 618 |
| 版次: | 1-1 |
| 作者簡介 |
| 宋寶華 Linux布道者,[0知0][0名0]嵌入式係統專傢,《Essential Linux Device Drivers》譯者。作為早從事Linux內核與設備驅動研究的專傢之一,他在眾多[0國0]內外[0知0][0名0]企業開展Linux技術培訓。他也是一位活躍的Linux開發者和深度實踐者,為Linux官方內核貢獻瞭[0大0]量的Linux源碼並承擔代碼審核工作。至今已嚮Linux官方內核提交逾數萬行代碼和幾百個補丁。他的《Linux設備驅動開發詳解》係列書在嵌入式Linux開發者中有口皆碑,是眾多Linux書籍中為數不多的[0暢0]銷書。 |
| 內容簡介 |
| 對於嵌入式工程師來說,進入更高階段後,[0學0]習Linux設備驅動開發無疑就是職業生涯的一次“重生”。這是因為Linux設備驅動開發不僅僅涉及操作係統的轉換,開發方式的轉換,更重要的是思維上的轉變。對於Linux這樣一個復雜係統,如何從復雜的代碼中抓住設備驅動開發的關鍵是任何一個Linux設備驅動開發者入門時需要麵對的挑戰。除瞭[0知0]識、工具之外,往往還需要思路上的指導。本書不但幫助Linux設備驅動開發的初[0學0]者厘清必要的概念,還從具體的實例、設備驅動開發的指導原則循序漸進地引導讀者漸入[0學0]習佳境。為瞭讓讀者能夠達到Linux設備驅動開發的至臻境界,作者更是從軟件工程的角度抽象齣設備驅動開發的一般思想。毫無疑問,本書將成為讀者[0學0]習Linux設備驅動開發過程中的一座“燈塔”。 |
| 目錄 |
贊譽 推薦序一 推薦序二 前言 [0第0]1章 Linux設備驅動概述及開發環境構建 1 1.1 設備驅動的作用 1 1.2 無操作係統時的設備驅動 2 1.3 有操作係統時的設備驅動 4 1.4 Linux設備驅動 5 1.4.1 設備的分類及特點 5 1.4.2 Linux設備驅動與整個軟硬件係統的關係 6 1.4.3 Linux設備驅動的重點、難點 7 1.5 Linux設備驅動的開發環境構建 8 1.5.1 PC上的Linux環境 8 1.5.2 QEMU實驗平颱 11 1.5.3 源代碼閱讀和編輯 13 1.6 設備驅動Hello World:LED驅動 15 1.6.1 無操作係統時的LED驅動 15 1.6.2 Linux下的LED驅動 15 [0第0]2章 驅動設計的硬件基礎 20 2.1 處理器 20 2.1.1 通用處理器 20 2.1.2 數字信號處理器 22 2.2 存儲器 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 以太網接口 33 2.3.6 PCI和PCI-E 34 2.3.7 SD和SDIO 36 2.4 CPLD和FPGA 37 2.5 原理圖分析 40 2.6 硬件時序分析 42 2.6.1 時序分析的概念 42 2.6.2 典型的硬件時序 43 2.7 芯片數據手冊閱讀方[0法0] 44 2.8 儀器儀錶使用 47 2.8.1 萬用錶 47 2.8.2 示波器 47 2.8.3 邏輯分析儀 49 2.9 總結 51 [0第0]3章 Linux內核及內核編程 52 3.1 Linux內核的發展與演變 52 3.2 Linux 2.6後的內核特點 56 3.3 Linux內核的組成 59 3.3.1 Linux內核源代碼的目錄結構 59 3.3.2 Linux內核的組成部分 60 3.3.3 Linux內核空間與用戶空間 64 3.4 Linux內核的編譯及加載 64 3.4.1 Linux內核的編譯 64 3.4.2 Kconfig和Makefile 66 3.4.3 Linux內核的引導 74 3.5 Linux下的C編程特點 75 3.5.1 Linux編碼風格 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 實驗室建設 88 3.8 串口工具 89 3.9 總結 91 [0第0]4章 Linux內核模塊 92 4.1 Linux內核模塊簡介 92 4.2 Linux內核模塊程序結構 95 4.3 模塊加載函數 95 4.4 模塊卸載函數 97 4.5 模塊參數 97 4.6 導齣符號 99 4.7 模塊聲明與描述 100 4.8 模塊的使用計數 100 4.9 模塊的編譯 101 4.10 使用模塊“繞開”GPL 102 4.11 總結 103 [0第0]5章 Linux文件係統與設備文件 104 5.1 Linux文件操作 104 5.1.1 文件操作係統調用 104 5.1.2 C庫文件操作 108 5.2 Linux文件係統 109 5.2.1 Linux文件係統目錄結構 109 5.2.2 Linux文件係統與設備驅動 110 5.3 devfs 114 5.4 udev用戶空間設備管理 116 5.4.1 udev與devfs的區彆 116 5.4.2 sysfs文件係統與Linux設備模型 119 5.4.3 udev的組成 128 5.4.4 udev規則文件 129 5.5 總結 133 [0第0]6章 字符設備驅動 134 6.1 Linux字符設備驅動結構 134 6.1.1 cdev結構體 134 6.1.2 分配和釋放設備號 136 6.1.3 file_operations結構體 136 6.1.4 Linux字符設備驅動的組成 138 6.2 globalmem虛擬設備實例描述 142 6.3 globalmem設備驅動 142 6.3.1 頭文件、宏及設備結構體 142 6.3.2 加載與卸載設備驅動 143 6.3.3 讀寫函數 144 6.3.4 seek函數 146 6.3.5 ioctl函數 146 6.3.6 使用文件私有數據 148 6.4 globalmem驅動在用戶空間中的驗證 156 6.5 總結 157 [0第0]7章 Linux設備驅動中的並發控製 158 7.1 並發與競態 158 7.2 編譯亂序和執行亂序 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 讀-復製-更新 176 7.6 信號量 181 7.7 互斥體 183 7.8 完成量 184 7.9 增加並發控製後的globalmem的設備驅動 185 7.10 總結 188 [0第0]8章 Linux設備驅動中的阻塞與非阻塞I/O 189 8.1 阻塞與非阻塞I/O 189 8.1.1 等待隊列 191 8.1.2 支持阻塞操作的globalfifo設備驅動 194 8.1.3 在用戶空間驗證globalfifo的讀寫 198 8.2 輪詢操作 198 8.2.1 輪詢的概念與作用 198 8.2.2 應用程序中的輪詢編程 199 8.2.3 設備驅動中的輪詢編程 201 8.3 支持輪詢操作的globalfifo驅動 202 8.3.1 在globalfifo驅動中增加輪詢操作 202 8.3.2 在用戶空間中驗證globalfifo設備的輪詢 203 8.4 總結 205 [0第0]9章 Linux設備驅動中的異步通[0知0]與異步I/O 206 9.1 異步通[0知0]的概念與作用 206 9.2 Linux異步通[0知0]編程 207 9.2.1 Linux信號 207 9.2.2 信號的接收 208 9.2.3 信號的釋放 210 9.3 支持異步通[0知0]的globalfifo驅動 212 9.3.1 在globalfifo驅動中增加異步通[0知0] 212 9.3.2 在用戶空間中驗證globalfifo的異步通[0知0] 214 9.4 Linux異步I/O 215 9.4.1 AIO概念與GNU C庫AIO 215 9.4.2 Linux內核AIO與libaio 219 9.4.3 AIO與設備驅動 222 9.5 總結 223 [0第0]10章 中斷與時鍾 224 10.1 中斷與定時器 224 10.2 Linux中斷處理程序架構 227 10.3 Linux中斷編程 228 10.3.1 申請和釋放中斷 228 10.3.2 使能和屏蔽中斷 230 10.3.3 底半部機製 230 10.3.4 實例:GPIO按鍵的中斷 235 10.4 中斷共享 237 10.5 內核定時器 238 10.5.1 內核定時器編程 238 10.5.2 內核中延遲的工作delayed_work 242 10.5.3 實例:秒字符設備 243 10.6 內核延時 247 10.6.1 短延遲 247 10.6.2 長延遲 248 10.6.3 睡著延遲 248 10.7 總結 250 [0第0]11章 內存與I/O訪問 251 11.1 CPU與內存、I/O 251 11.1.1 內存空間與I/O空間 251 11.1.2 內存管理單元 252 11.2 Linux內存管理 256 11.3 內存存取 261 11.3.1 用戶空間內存動態申請 261 11.3.2 內核空間內存動態申請 262 11.4 設備I/O端口和I/O內存的訪問 267 11.4.1 Linux I/O端口和I/O內存訪問接口 267 11.4.2 申請與釋放設備的I/O端口和I/O內存 268 11.4.3 設備I/O端口和I/O內存訪問流程 269 11.4.4 將設備地址映射到用戶空間 270 11.5 I/O內存靜態映射 276 11.6 DMA 277 11.6.1 DMA與Cache一緻性 278 11.6.2 Linux下的DMA編程 279 11.7 總結 285 [0第0]12章 Linux設備驅動的軟件架構思想 286 12.1 Linux驅動的軟件架構 286 12.2 platform設備驅動 290 12.2.1 platform總綫、設備與驅動 290 12.2.2 將globalfifo作為platform設備 293 12.2.3 platform設備資源和數據 295 12.3 設備驅動的分層思想 299 12.3.1 設備驅動核心層和例化 299 12.3.2 輸入設備驅動 301 12.3.3 RTC設備驅動 306 12.3.4 Framebuffer設備驅動 309 12.3.5 終端設備驅動 311 12.3.6 misc設備驅動 316 12.3.7 驅動核心層 321 12.4 主機驅動與外設驅動分離的設計思想 321 12.4.1 主機驅動與外設驅動分離 321 12.4.2 Linux SPI主機和設備驅動 322 12.5 總結 330 [0第0]13章 Linux塊設備驅動 331 13.1 塊設備的I/O操作特點 331 13.2 Linux塊設備驅動結構 332 13.2.1 block_device_operations結構體 332 13.2.2 gendisk結構體 334 13.2.3 bio、request和request_queue 335 13.2.4 I/O調度器 339 13.3 Linux塊設備驅動的初始化 340 13.4 塊設備的打開與釋放 342 13.5 塊設備驅動的ioctl函數 342 13.6 塊設備驅動的I/O請求處理 343 13.6.1 使用請求隊列 343 13.6.2 不使用請求隊列 347 13.7 實例:vmem_disk驅動 349 13.7.1 vmem_disk的硬件原理 349 13.7.2 vmem_disk驅動模塊的加載與卸載 349 13.7.3 vmem_disk設備驅動的block_device_operations 351 13.7.4 vmem_disk的I/O請求處理 352 13.8 Linux MMC子係統 354 13.9 總結 357 [0第0]14章 Linux網絡設備驅動 358 14.1 Linux網絡設備驅動的結構 358 14.1.1 網絡協議接口層 359 14.1.2 網絡設備接口層 363 14.1.3 設備驅動功能層 367 14.2 網絡設備驅動的注冊與注銷 367 14.3 網絡設備的初始化 369 14.4 網絡設備的打開與釋放 370 14.5 數據發送流程 371 14.6 數據接收流程 372 14.7 網絡連接狀態 375 14.8 參數設置和統計數據 377 14.9 DM9000網卡設備驅動實例 380 14.9.1 DM9000網卡硬件描述 380 14.9.2 DM9000網卡驅動設計分析 380 14.10 總結 386 [0第0]15章 Linux I2C核心、總綫與設備驅動 387 15.1 Linux I2C體係結構 387 15.2 Linux I2C核心 394 15.3 Linux I2C適配器驅動 396 15.3.1 I2C適配器驅動的注冊與注銷 396 15.3.2 I2C總綫的通信方[0法0] 397 15.4 Linux I2C設備驅動 399 15.4.1 Linux I2C設備驅動的模塊加載與卸載 400 15.4.2 Linux I2C設備驅動的數據傳輸 400 15.4.3 Linux的i2c-dev.c文件分析 400 15.5 Tegra I2C總綫驅動實例 405 15.6 AT24xx EEPROM的I2C設備驅動實例 410 15.7 總結 413 [0第0]16章 USB主機、設備與Gadget驅動 414 16.1 Linux USB驅動層次 414 16.1.1 主機側與設備側USB驅動 414 16.1.2 設備、配置、接口、端點 415 16.2 USB主機控製器驅動 420 16.2.1 USB主機控製器驅動的整體結構 420 16.2.2 實例:Chipidea USB主機驅動 425 16.3 USB設備驅動 425 16.3.1 USB設備驅動的整體結構 425 16.3.2 USB請求塊 430 16.3.3 探測和斷開函數 435 16.3.4 USB骨架程序 436 16.3.5 實例:USB鍵盤驅動 443 16.4 USB UDC與Gadget驅動 446 16.4.1 UDC和Gadget驅動的關鍵數據結構與API 446 16.4.2 實例:Chipidea USB UDC驅動 451 16.4.3 實例:Loopback Function驅動 453 16.5 USB OTG驅動 456 16.6 總結 458 [0第0]17章 I2C、SPI、USB驅動架構類比 459 17.1 I2C、SPI、USB驅動架構 459 17.2 I2C主機和外設眼裏的Linux世界 460 [0第0]18章 ARM Linux設備樹 461 18.1 ARM設備樹起源 461 18.2 設備樹的組成和結構 462 18.2.1 DTS、DTC和DTB等 462 18.2.2 根節點兼容性 468 18.2.3 設備節點兼容性 470 18.2.4 設備節點及label的命[0名0] 475 18.2.5 地址編碼 477 18.2.6 中斷連接 479 18.2.7 GPIO、時鍾、pinmux連接 480 18.3 由設備樹引發的BSP和驅動變更 484 18.4 常用的OF API 490 18.5 總結 493 [0第0]19章 Linux電源管理的係統架構和驅動 494 19.1 Linux電源管理的全局架構 494 19.2 CPUFreq驅動 495 19.2.1 SoC的CPUFreq驅動實現 495 19.2.2 CPUFreq的策略 501 19.2.3 CPUFreq的性能測試和調[0優0] 501 19.2.4 CPUFreq通[0知0] 502 19.3 CPUIdle驅動 504 19.4 PowerTop 508 19.5 Regulator驅動 508 19.6 OPP 511 19.7 PM QoS 515 19.8 CPU熱插拔 518 19.9 掛起到RAM 522 19.10 運行時的PM 528 19.11 總結 534 [0第0]20章 Linux芯片級移植及底層驅動 535 20.1 ARM Linux底層驅動的組成和現狀 535 20.2 內核節拍驅動 536 20.3 中斷控製器驅動 541 20.4 SMP多核啓動以及CPU熱插拔驅動 549 20.5 DEBUG_LL和EARLY_PRINTK的設置 556 20.6 GPIO驅動 557 20.7 pinctrl驅動 560 20.8 時鍾驅動 572 20.9 dmaengine驅動 578 20.10 總結 580 [0第0]21章 Linux設備驅動的調試 581 21.1 GDB調試器的用[0法0] 581 21.1.1 GDB的基本用[0法0] 581 21.1.2 DDD圖形界麵調試工具 591 21.2 Linux內核調試 594 21.3 內核打印信息——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 使用仿真器調試內核 612 21.11 應用程序調試 613 21.12 Linux性能監控與調[0優0]工具 616 21.13 總結 618 |
| 編輯推薦 |
| 曆時8年,三次重構,內容愈加爐火純青。 全部代碼更新至全新的Linux 4.0版本。 全麵講解ARM Linux新版本內核架構,如設備樹等。 不僅僅注重[0知0]識和程序的講解,更注重程序的思想、演變、架構和算[0法0] 對於嵌入式工程師來說,進入更高階段後,[0學0]習Linux設備驅動開發無疑就是職業生涯的一次“重生”。這是因為Linux設備驅動開發不僅僅涉及操作係統的轉換,開發方式的轉換,更重要的是思維上的轉變。對於Linux這樣一個復雜係統,如何從復雜的代碼中抓住設備驅動開發的關鍵是任何一個Linux設備驅動開發者入門時需要麵對的挑戰。除瞭[0知0]識、工具之外,往往還需要思路上的指導。本書不但幫助Linux設備驅動開發的初[0學0]者厘清必要的概念,還從具體的實例、設備驅動開發的指導原則循序漸進地引導讀者漸入[0學0]習佳境。為瞭讓讀者能夠達到Linux設備驅動開發的至臻境界,作者更是從軟件工程的角度抽象齣設備驅動開發的一般思想。毫無疑問,本書將成為讀者[0學0]習Linux設備驅動開發過程中的一座“燈塔”。 |
這本書在講解復雜概念時所采用的邏輯推演方式,簡直是教科書級彆的範本。作者並非簡單地羅列API和數據結構,而是采用瞭一種由淺入深、層層遞進的敘事結構。舉例來說,在介紹某個核心驅動模塊的初始化流程時,作者首先會從用戶空間發起調用的角度切入,然後逐步深入到內核層級的鈎子函數,最後纔揭示齣實際硬件交互的細節。這種“剝洋蔥”式的解析方法,極大地幫助我構建瞭一個完整的知識框架,避免瞭因為隻見樹木不見森林而産生的睏惑。更值得稱贊的是,作者總能在關鍵的技術難點處,插入一些“為什麼是這樣設計”的哲學思考和曆史背景介紹,這使得我對現有內核設計思想的形成有瞭更深層次的理解,而非僅僅停留在“如何使用”的層麵。這種兼顧宏觀視野與微觀細節的講解力度,無疑是那些想要成為領域專傢的讀者所夢寐以求的。我感覺自己不再是生硬地背誦知識點,而是在跟隨一位經驗豐富的導師進行實地考察。
評分對於一個長期關注係統底層開發的學習者而言,選擇一本能緊跟技術前沿的書籍至關重要。這本書在內容組織上體現瞭對新近內核特性的關注,這使得它具有很強的時效價值。我特彆留意到其中對一些新興的設備管理框架的介紹,這些內容在舊的教材中往往是缺失或處理得比較籠統的。作者似乎非常清楚,在快速迭代的開源社區中,維護知識的“新鮮度”是多麼睏難,但他們成功地做到瞭。這種對技術演進的敏銳捕捉,確保瞭讀者學習到的知識結構是麵嚮未來的,而不是停留在幾年前的過時標準上。這種前瞻性,使得這本書不僅適閤初學者入門,對於資深開發者進行知識更新和查漏補缺,也同樣具有不可替代的價值,體現瞭作者深厚的行業積纍和對技術趨勢的精準把握。
評分語言風格上,這本書展現齣瞭一種罕見的、恰到好處的平衡感。它既保有技術書籍應有的嚴謹性和精確性,避免瞭模糊不清的描述,但同時,作者的文字又充滿瞭活力和洞察力,讓人在閱讀枯燥的技術文檔時也不會感到乏味。你會發現作者在講解那些晦澀的鎖機製或內存管理部分時,會不自覺地運用一些生動的比喻來幫助理解那些抽象的概念,這種錶達方式極大地降低瞭技術門檻。不同於一些翻譯過來的技術書籍那種僵硬、晦澀的“機器味”,這裏的行文流暢自然,仿佛是同一位技術專傢在與你進行深入的一對一交流。即便是涉及高度專業化的術語,作者也總能巧妙地在第一次齣現時給齣清晰的界定,後續的引用則保持瞭高度的一緻性,這種語言上的細膩處理,體現瞭作者對目標讀者群體的深刻理解和尊重。
評分這本書的排版和裝幀設計著實讓人眼前一亮。首先,從拿到書的那一刻起,厚實的紙張和精美的封麵設計就傳遞齣一種專業和嚴謹的氣息。內頁的字體選擇恰到好處,既保證瞭閱讀的舒適度,又在技術圖錶的呈現上做得非常清晰。我尤其欣賞作者在代碼塊的處理上所下的功夫,無論是顔色的區分還是縮進的對齊,都體現瞭對細節的極緻追求。對於像驅動開發這種高度依賴代碼閱讀和理解的領域,清晰的版式是至關重要的,它能極大地減少閱讀疲勞,讓學習的效率倍增。即便是初次接觸Linux內核編程的新手,麵對密密麻麻的代碼和復雜的結構圖時,也能因為良好布局而感到不那麼畏懼。此外,書中的插圖和架構圖設計得非常直觀,它們有效地將抽象的內核概念具象化,比如對不同子係統間數據流動的描述,通過一張精心繪製的流程圖,比純文字描述要高效得多。這種對閱讀體驗的重視,使得整本書不僅僅是一本技術手冊,更像是一件經過精心打磨的工藝品,讓人在學習知識的同時,也享受到一種視覺上的愉悅。
評分實戰案例的豐富度和貼閤度是這本書的又一個巨大亮點,它完全擺脫瞭許多理論書籍中“紙上談兵”的弊病。書中提供的每一個代碼示例都並非是孤立的、為瞭演示某個API而存在的“玩具”代碼,而是與真實的硬件交互場景緊密結閤的微型項目。例如,在講解I/O調度器時,作者不僅展示瞭如何編寫一個驅動,還詳細模擬瞭多綫程並發訪問、中斷處理的場景,並提供瞭相應的性能分析和調試思路。這種接近生産環境的模擬,讓我能夠提前預見到在實際項目中可能會遇到的陷阱和疑難雜癥。更貼心的是,作者在代碼注釋中對於一些特定的編譯器優化或內存屏障的使用,都給齣瞭非常詳盡的解釋,這對於理解底層並發控製至關重要。可以說,這本書提供瞭一套可以直接應用於工作或高階學習的實踐藍圖,它不是教你怎麼做,而是直接帶你去做,並在過程中告訴你每一步背後的原理和權衡。
評分書很好
評分包裝精緻,正品,非常喜歡?
評分此用戶未填寫評價內容
評分書是正品,包裝得也不錯,總體性價比還是挺高的
評分書可能沒有經過嚴謹審核,發現多處錯誤
評分還沒看,書看著不錯
評分不錯,Linux學習的一本好書
評分此用戶未填寫評價內容
評分書很好
本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度,google,bing,sogou 等
© 2025 book.tinynews.org All Rights Reserved. 静思书屋 版权所有