曆時8年,三次重構,內容愈加爐火純青。
全部代碼更新至全新的Linux 4.0版本。
全麵講解ARM Linux新版本內核架構,如設備樹等。
不僅僅注重知識和程序的講解,更注重程序的思想、演變、架構和算法
對於嵌入式工程師來說,進入更高階段後,學習Linux設備驅動開發無疑就是職業生涯的一次“重生”。這是因為Linux設備驅動開發不僅僅涉及操作係統的轉換,開發方式的轉換,更重要的是思維上的轉變。對於Linux這樣一個復雜係統,如何從復雜的代碼中抓住設備驅動開發的關鍵是任何一個Linux設備驅動開發者入門時需要麵對的挑戰。除瞭知識、工具之外,往往還需要思路上的指導。本書不但幫助Linux設備驅動開發的初學者厘清必要的概念,還從具體的實例、設備驅動開發的指導原則循序漸進地引導讀者漸入學習佳境。為瞭讓讀者能夠達到Linux設備驅動開發的至臻境界,作者更是從軟件工程的角度抽象齣設備驅動開發的一般思想。毫無疑問,本書將成為讀者學習Linux設備驅動開發過程中的一座“燈塔”。
本書介紹瞭Linux設備驅動開發理論、框架與實例,詳細說明瞭自鏇鎖、信號量、完成量、中斷頂/底半部、定時器、內存和I/O映射以及異步通知、阻塞I/O、非阻塞I/O等Linux設備驅動理論,以及字符設備、塊設備、tty設備、I2c設備、LCD設備、音頻設備、USB設備、網絡設備、PCI設備等Linux設備驅動架構中各個復雜數據結構和函數的關係,並講解瞭Linux驅動開發的大量實例,使讀者能夠獨立開發各類Linux設備驅動。
【備注:本書第11頁,第六行鏈接已經失效,替換為:http://pan.baidu.com/s/1cFrl2e 密碼:ezs2】
宋寶華,Linux布道者,知名嵌入式係統專傢,《Essential Linux Device Drivers》譯者。作為較早從事Linux內核與設備驅動研究的專傢之一,他在眾多國內外知名企業開展Linux技術培訓。他也是一位活躍的Linux開發者和深度實踐者,為Linux官方內核貢獻瞭大量的Linux源碼並承擔代碼審核工作。至今已嚮Linux官方內核提交逾數萬行代碼和幾百個補丁。他的《Linux設備驅動開發詳解》係列書在嵌入式Linux開發者中有口皆碑,是眾多Linux書籍中為數不多的暢銷書。
贊譽
推薦序一
推薦序二
前言
第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
第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 芯片數據手冊閱讀方法 44
2.8 儀器儀錶使用 47
2.8.1 萬用錶 47
2.8.2 示波器 47
2.8.3 邏輯分析儀 49
2.9 總結 51
第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
第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
第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
第6章 字符設備驅動 134
6.1 Linux字符設備驅動結構 134
6.1.1 cdev結構體 134
6.1.2 分配和釋放設備號 136
6.1.3 f?ile_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
第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
第8章 Linux設備驅動中的阻塞與非阻塞I/O 189
8.1 阻塞與非阻塞I/O 189
8.1.1 等待隊列 191
8.1.2 支持阻塞操作的globalf?ifo設備驅動 194
8.1.3 在用戶空間驗證globalf?ifo的讀寫 198
8.2 輪詢操作 198
8.2.1 輪詢的概念與作用 198
8.2.2 應用程序中的輪詢編程 199
8.2.3 設備驅動中的輪詢編程 201
8.3 支持輪詢操作的globalf?ifo驅動 202
8.3.1 在globalf?ifo驅動中增加輪詢操作 202
8.3.2 在用戶空間中驗證globalf?ifo設備的輪詢 203
8.4 總結 205
第9章 Linux設備驅動中的異步通知與異步I/O 206
9.1 異步通知的概念與作用 206
9.2 Linux異步通知編程 207
9.2.1 Linux信號 207
9.2.2 信號的接收 208
9.2.3 信號的釋放 210
9.3 支持異步通知的globalf?ifo驅動 212
9.3.1 在globalf?ifo驅動中增加異步通知 212
9.3.2 在用戶空間中驗證globalf?ifo的異步通知 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
第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
第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
第12章 Linux設備驅動的軟件架構思想 286
12.1 Linux驅動的軟件架構 286
12.2 platform設備驅動 290
12.2.1 platform總綫、設備與驅動 290
12.2.2 將globalf?ifo作為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
第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
第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
第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總綫的通信方法 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
第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
第17章 I2C、SPI、USB驅動架構類比 459
17.1 I2C、SPI、USB驅動架構 459
17.2 I2C主機和外設眼裏的Linux世界 460
第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的命名 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
第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的性能測試和調優 501
19.2.4 CPUFreq通知 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
第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
第21章 Linux設備驅動的調試 581
21.1 GDB調試器的用法 581
21.1.1 GDB的基本用法 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性能監控與調優工具 616
21.13 總結 618
Linux從未停歇前進的腳步。Linus Torvalds,世界上最偉大的程序員之一,Linux內核的創始人,Git的締造者,現在仍然在沒日沒夜地閤並補丁、升級內核。做技術的人,從來沒有終南捷徑,拼得就是坐冷闆凳的傻勁。
這是一個連閱讀都被碎片化的時代,在這樣一個時代,人們趨嚮於激進、浮躁,內心的不安寜使我們極難靜下心來研究什麼。我見過許多Linux工程師,他們的簡曆上寫著“精通”Linux內核,有多年的工作經驗,而他們的“精通”卻隻是把某個寄存器從0改成1,從1改成0的不斷重復;我也見過許多Linux工程師,他們終日埋頭苦乾,敲打著自己的機器和電路闆,卻從未冷靜下來思考,並不斷重構和升華自己的知識體係。
這是要把“牢底”坐穿的程序員,這樣“忙忙碌碌”的程序員,從來都不算是好程序員。
對於優秀的程序員,其最優秀的品質是能夠心平氣和地學習與思考問題,透析代碼背後的架構、原理和設計思想。沒有思想的代碼是垃圾代碼,沒有思想的程序員,隻是在完成低水平重復建設的體力活。很多程序員從不過問自己寫的代碼最後在機器裏麵是怎麼跑的,很多事情莫名其妙地發生瞭,很多bug莫名其妙地消失瞭……他們永遠都在得過且過。
由此,衍生齣瞭本書的第一個齣發點,那就是帶給讀者更多關於Linux開發思想的講解,幫助讀者奠定根基。本書呈現給讀者的更多的是一種思考方法,而不是知識點的簡單羅列。
本書除對基礎理論部分進行瞭詳細的講解外,還加強瞭對驅動編程所涉及的Linux內核最底層機理的講解,內容包括中斷、定時器、進程生命周期、uevent、並發、編譯亂序、執行亂序、等待隊列、I/O模型、內存管理等。這些知識點非常重要,是真正證明程序員理解瞭Linux的部分內容,程序員隻有打好根基,纔能遊刃有餘。
本書沒有大量描述各種具體驅動類型的章節,如Sound、PCI、MTD、tty等,而將更多的焦點轉移到瞭驅動編程背後的內核原理,並試圖從Linux內核的上百個驅動子係統中尋找齣內部規律,以培養讀者舉一反三的能力。
Linux內核有上百個驅動子係統,這一點從內核的drivers子目錄中就可以看齣來:
好吧,傻子纔會一個目錄一個目錄地去看,一個目錄一個目錄地從頭學起。我們勢必要尋找各種驅動子係統的共性,摸索規律。在本書中,我們將更多地看到各驅動子係統的類比,以及驅動子係統的層次化設計。
技術工作從來都不能一勞永逸。世界變化得太快,當前技術革新的速度數倍於我們父輩、祖輩、祖祖輩經曆過的任何時代。證明你是“真球迷”還是“僞球迷”的時候到瞭,這個時代是僞程序員的地獄,也是真程序員的天堂。
從浩如煙海的知識體係、不斷更新的軟件版本中終生學習,不斷攻剋一個個挑戰,獲取新養分,尋找新靈感,這實在是黑暗的碼農生涯中不斷閃現的璀璨光芒。
Linux的內核版本不斷更新,齣現瞭Linux 3.0、Linux 3.1、Linux 3.2、…、Linux 3.19、Linux 4.0、Linux 4.1,變化的是軟件的架構,不變的是Linus的熱情。
這無疑也是本書的第二個齣發點,更新Linux驅動編程的知識體係以迎閤最新的時代需求。因此,本書有大量關於設備樹、ARM Linux移植、Linux電源管理、GPIO、時鍾、定時器、pinmux、DMA等內容。我們的操作平颱也轉移到瞭QEMU模擬的4核Cortex-A9電路闆上,書中的實例基本都轉移到瞭市麵流行的新芯片上。
最近兩三年,老是聽許多程序員抱怨,市麵上缺乏講解新內核的資料、缺乏從頭到尾講解設備樹的資料,但是我想說,這實在不是什麼難點。難點仍然是本書基於第一個齣發點要解決的問題,如果有好的基礎,以優秀程序員極強的學習能力,應該很快就可以掌握這些新知識。機製沒有變,變化的隻是策略。
因此學習能力也是優秀程序員的又一個重要品質。沒有人生下來就是天纔,良好的學習能力也是通過後天的不斷學習培養的。可以說,學得越多的人,學新東西的速度一定越快,學習能力也變得越強。因為,知識的共通性實在太多。
讀者在閱讀本書時,不應該企圖把它當成一本工具書和查API的書,而是應該把它當作一本梳理理論體係、開發思想、軟件架構的書。唯如此,我們纔能適應未來新的變化。
時代的滾滾車輪推動著Linux內核的版本不斷嚮前,也推動著每個人的人生。紅塵滾滾,我不去想是否能夠成功,既然選擇瞭遠方,便隻顧風雨兼程。
最後,本書能得以齣版,要感謝帶領我嚮前的人生導師和我的眾多小夥伴,他們或者在我人生的關鍵時刻改變瞭我,或者給我黑暗的程序生涯帶來瞭無盡的快樂和動力。我的小夥伴,他們力挺我、鼓勵我,也辱罵我、奚落我,這些都是真摯的友情。
謹以此書,緻以對楊平先生、何昭然、方毅偉、李華毅、宋誌武、杜嚮龍、葉祥振、劉昊、王榕、何曄、王立賽、曾過、劉永生、段丙華、章君義、王文琪、盧鵬、劉濤、徐西寜、吳赫、任橋偉、秦龍廷、鬍良兵、張傢旺、王雷、Bryan Wu、Eric Miao、Cliff Cai、Qipan Li、Guoying Zhang、陳健鬆、Haoyu Zhong、劉洪濤、季久峰、邴傑、孫誌忠、吳國舉、Bob Liu、趙小吾、EJ Zhao、賀亞鋒、劉仕傑、Hao Yin等老師和小夥伴的深深感激;謹以此書,緻以對我的父母大人、老婆大人、兄長和姐姐、偉大丈母娘的深深感激,本書的寫作時間超過一年,其過程是一種巨大的肉體和精神摺磨,沒有他們的默默支持和不斷鞭策,本書是不可能完成的;謹以此書,對為本書做齣巨大貢獻的編輯、策劃老師,尤其是張國強老師緻以深深的感激!
由於篇幅的關係,我沒有辦法一一列舉我要感激的所有人,但是,這些年從你們那裏獲得的,遠遠大於我付齣的,所以,在內心深處,唯有懷著對你們的深深感恩,不斷前行。歲月如歌,吾歌狂行。
全書結構本書首先介紹Linux設備驅動的基礎。第1章簡要地介紹瞭設備驅動,並從無操作係統的設備驅動引齣瞭Linux操作係統下的設備驅動,介紹瞭本書所基於的開發環境。第2章係統地講解瞭Linux驅動工程師應該掌握的硬件知識,為工程師打下Linux驅動編程的硬件基礎,詳細介紹瞭各種類型的CPU、存儲器和常見的外設,並闡述瞭硬件時序分析方法和數據手冊閱讀方法。第3章將Linux設備驅動放在Linux 2.6內核背景中進行講解,說明Linux內核的編程方法。由於驅動編程也在內核編程的範疇,因此,這一章實質是為編寫Linux設備驅動打下軟件基礎。
其次,講解Linux設備驅動編程的基礎理論、字符設備驅動及設備驅動設計中涉及的並發控製、同步等問題。第4、5章分彆講解Linux內核模塊和Linux設備文件係統;第6~9章以虛擬設備globalmem和globalfifo為主綫,逐步給其添加高級控製功能;第10、11章分彆闡述Linux驅動編程中所涉及的中斷和定時器、內核和I/O操作處理方法。
接著,剖析復雜設備驅動的體係結構以及塊設備、網絡設備驅動。該篇講解瞭設備與驅動的分離、主機控製器驅動與外設驅動的分離,並以大量實例(如input、tty、LCD、platform、I2C、SPI、USB等)來佐證。其中第12章和第17章遙相呼應,力圖全麵地展示驅動的架構。Linux有100多個驅動子係統,逐個講解和學習都是不現實的,授人以魚不如授人以漁,因此我們將更多的焦點放在瞭架構講解方麵,以便讀者可以舉一反三。
本書最後4章分析瞭Linux的設備樹、Linux移植到新的SoC上的具體工作以及Linux內核和驅動的一些調試方法。這些內容,對於理解如何從頭開始搭建一個Linux,以及整個Linux闆級支持包上上下下的關係尤為重要。
另外,本書的主要代碼都引用自Linux源代碼,為保留原汁原味,均延用瞭代碼的英文注釋,而其他非引用的代碼則使用瞭中文注釋或無注釋,特此說明。
本書配套的相關素材和代碼,讀者均可從與本書相關的微信公眾號中獲得,相關公眾號是:Linuxer,歡迎掃描二維碼。
宋寶華2015年4月於上海浦東
商品一如既往的好!!值得擁有。
評分紙質一般
評分一直在京東購物,放心,省心,安心!會一如既往的支持!
評分京東買東西質量有保障,價格還便宜,配送也快!還會繼續購買的
評分老公買的,他一直在學習呢。他應該覺得挺好的吧
評分不錯不錯,愉快的購物
評分書的質量很好,看過第二版,當時剛剛接觸Linux,也能比較輕鬆的看懂,講得還是很通俗易懂的,期待新版的內容~
評分紙質一般
評分內容詳實,值得購買,就是稍微貴瞭點
本站所有內容均為互聯網搜尋引擎提供的公開搜索信息,本站不存儲任何數據與內容,任何內容與數據均與本站無關,如有需要請聯繫相關搜索引擎包括但不限於百度,google,bing,sogou 等
© 2025 book.qciss.net All Rights Reserved. 圖書大百科 版權所有