TOP
0
0
即日起~6/30,暑期閱讀書展,好書7折起
深入Linux設備驅動程序內核機制(簡體書)
滿額折

深入Linux設備驅動程序內核機制(簡體書)

商品資訊

人民幣定價:98 元
定價
:NT$ 588 元
優惠價
87512
絕版無法訂購
相關商品
商品簡介
作者簡介
名人/編輯推薦
目次
書摘/試閱

商品簡介

《深入Linux設備驅動程序內核機制》內容簡介:這是一本系統闡述Linux設備驅動程序技術內幕的專業書籍,它的側重點不是討論如何在Linux系統下編寫設備驅動程序,而是要告訴讀者隱藏在這些設備驅動程序背後的那些內核機制及原理。作者通過對Linux內核源碼抽絲剝繭般的解讀,再輔之以精心設計的大量圖片,使讀者在閱讀完《深入Linux設備驅動程序內核機制》後對驅動程序前臺所展現出來的那些行為特點變得豁然開朗。
《深入Linux設備驅動程序內核機制》涵蓋了編寫設備驅動程序所需要的幾乎所有的內核設施,比如內核模塊、中斷處理、互斥與同步、內存分配、延遲操作、時間管理,以及新設備驅動模型等內容。為了避免讀者迷失在某一,技術細節的討論當中,《深入Linux設備驅動程序內核機制》在一個比較高的層面上進行展開,以一種先框架再細節的結構安排極大地簡化了讀者的閱讀與學習。
《深入Linux設備驅動程序內核機制》不僅適合那些在Linux系統下從事設備驅動程序開發的專業技術人員閱讀,也同樣適合有志于從事Linux設備驅動程序開發或對Linux設備驅動程序及Linux內核感興趣的在校學生等閱讀。對于沒有任何Linux設備驅動程序開發經驗的初學者,建議先閱讀那些討論“如何”在Linux系統下編寫設備驅動程序的入門書籍,然後再閱讀《深入Linux設備驅動程序內核機制》來理解“為什么”要以這樣或者那樣的方式來編寫設備驅動程序。

作者簡介

陳學松,曾任職于Intel、Marvell等半導體公司,有9年以上Linux內核、設備驅動程序、嵌入式Linux BSP等領域的開發經驗。專注于Linux系統內核、BIOS、文件系統及軟件虛擬化等技術,曾模仿Linux內核編寫過微型操作系統。工作之余喜歡以文章的形式將自己的學習心得進行總結,善于運用圖形等元素將復雜概念具體化,梳理脈絡而不拘于細節。2005年在舊MLinux開發者論壇所發表的《解析Linux中的VFS文件系統機制》堪稱作者這一寫作特色的代表之作,該文發表後曾被多家技術網站、論壇及個人博客所轉載。
喜歡游泳,四肢發達,胸無城府。古文功底頗深,少時涉獵甚廣,現主要閱讀一些歷史題材類的書籍,熟讀《三國志》。目前任職于AMD上海研發中心,主要從事Linux顯卡驅動等領域的研發工作。

名人/編輯推薦

《深入Linux設備驅動程序內核機制》編輯推薦:穿針引線,將Linux設備驅動程序從臺前到幕後融會貫通,條分縷析,剖析Linux設備驅動程序使用到的每一個重要的內核設施,高屋建瓴,多層次立體化揭示Linux設備驅動程序的框架結構,化繁為簡,簡單的示例源碼具體驗證內核背後的運作機制。

目次

第1章 內核模塊 1
1.1 內核模塊的文件格式 2
1.2 EXPORT_SYMBOL的內核實現 5
1.3 模塊的加載過程 8
1.3.1 sys_init_module(第一部分) 9
1.3.2 struct module 9
1.3.3 load_module 13
1.3.4 sys_init_module(第二部分) 49
1.3.5 模塊的卸載 54
1.4 本章小結 55

第2章 字符設備驅動程序 57
2.1 應用程序與設備驅動程序互動實例 58
2.2 struct file_operations 62
2.3 字符設備的內核抽象 63
2.4 設備號的構成與分配 65
2.4.1 設備號的構成 65
2.4.2 設備號的分配與管理 66
2.5 字符設備的注冊 71
2.6 設備文件節點的生成 74
2.7 字符設備文件的打開操作 77
2.8 本章小結 85

第3章 分配內存 87
3.1 物理內存的管理 87
3.1.1 內存節點node 87
3.1.2 內存區域zone 88
3.1.3 內存頁 89
3.2 頁面分配器(page allocator) 90
3.2.1 gfp_mask 91
3.2.2 alloc_pages 95
3.2.3 __get_free_pages 96
3.2.4 get_zeroed_page 97
3.2.5 __get_dma_pages 97
3.3 slab分配器(slab allocator) 98
3.3.1 管理slab的數據結構 99
3.3.2 kmalloc與kzalloc 105
3.3.3 kmem_cache_create與kmem_cache_alloc 108
3.4 內存池(mempool) 110
3.5 虛擬內存的管理 111
3.5.1 內核虛擬地址空間構成 111
3.5.2 vmalloc與vfree 112
3.5.3 ioremap 115
3.6 per-CPU變量 115
3.6.1 靜態per-CPU變量的聲明與定義 116
3.6.2 靜態per-CPU變量的鏈接腳本 117
3.6.3 setup_per_cpu_areas函數 118
3.6.4 使用per-CPU變量 121
3.7 本章小結 125

第4章 互斥與同步 127
4.1 并發的來源 127
4.2 local_irq_enable與local_irq_disable 128
4.3 自旋鎖 129
4.3.1 spin_lock 130
4.3.2 spin_lock的變體 133
4.3.3 單處理器上的spin_lock函數 136
4.3.4 讀取者與寫入者自旋鎖rwlock 137
4.4 信號量(semaphore) 141
4.4.1 信號量的定義與初始化 141
4.4.2 DOWN操作 142
4.4.3 UP操作 145
4.4.4 讀取者與寫入者信號量rwsem 146
4.5 互斥鎖mutex 148
4.5.1 互斥鎖的定義與初始化 148
4.5.2 互斥鎖的DOWN操作 149
4.5.3 互斥鎖的UP操作 150
4.6 順序鎖seqlock 152
4.7 RCU 155
4.7.1 讀取者的RCU臨界區 156
4.7.2 寫入者的RCU操作 156
4.7.3 RCU使用的特點 157
4.8 原子變量與位操作 159
4.9 等待隊列 162
4.9.1 等待隊列頭wait_queue_head_t 162
4.9.2 等待隊列的節點 163
4.9.3 等待隊列的應用 164
4.10 完成接口completion 164
4.11 本章小結 168

第5章 中斷處理 169
5.1 中斷的硬件框架 169
5.2 PIC與軟件中斷號 170
5.3 通用的中斷處理函數 171
5.4 do_IRQ函數 172
5.5 struct irq_chip 178
5.6 struct irqaction 179
5.7 irq_set_handler 180
5.8 handle_irq_event 184
5.9 request_irq 186
5.10 中斷處理的irq_thread機制 190
5.11 free_irq 191
5.12 SOFTIRQ 192
5.13 irq的自動探測 196
5.14 中斷處理例程 200
5.15 中斷共享 201
5.16 本章小結 202

第6章 延遲操作 203
6.1 tasklet 203
6.1.1 tasklet機制初始化 204
6.1.2 提交一個tasklet 205
6.1.3 tasklet_action 209
6.1.4 tasklet的其他操作 212
6.2 工作隊列work queue 214
6.2.1 數據結構 214
6.2.2 create_singlethread_workqueue和create_workqueue 216
6.2.3 工人線程worker_thread 219
6.2.4 destroy_workqueue 221
6.2.5 提交工作節點queue_work 224
6.2.6 內核創建的工作隊列 229
6.3 本章小結 230

第7章 設備文件的高級操作 231
7.1 ioctl文件操作 231
7.1.1 ioctl的系統調用 231
7.1.2 ioctl的命令編碼 235
7.1.3 copy_from_user和copy_to_user 238
7.2 字符設備的I/O模型 243
7.3 同步阻塞型I/O 244
7.3.1 wait_event_interruptible 244
7.3.2 wake_up_interruptible 246
7.4 同步非阻塞型I/O 250
7.5 異步阻塞型I/O 251
7.6 異步非阻塞型I/O 258
7.7 驅動程序的fsync例程 259
7.8 fasync例程 260
7.9 llseek例程 269
7.10 訪問權能 272
7.11 本章小結 273

第8章 時間管理 274
8.1 jiffies 274
8.1.1 時間比較 277
8.1.2 時間轉換 278
8.2 延時操作 279
8.2.1 長延時 280
8.2.2 短延時 285
8.3 內核定時器 286
8.3.1 init_timer 289
8.3.2 add_timer 289
8.3.3 del_timer和del_timer_sync 293
8.4 本章小結 293

第9章 Linux設備驅動模型 295
9.1 sysfs文件系統 295
9.2 kobject和kset 298
9.2.1 kobject 298
9.2.2 kobject的類型屬性 305
9.2.3 kset 308
9.2.4 熱插拔中的uevent和call_usermodehelper 311
9.2.5 實例源碼 320
9.3 總線、設備與驅動 328
9.3.1 總線及其注冊 328
9.3.2 總線的屬性 335
9.3.3 設備與驅動的綁定 338
9.3.4 設備 339
9.3.5 驅動 348
9.4 class 351
9.5 本章小結 355

第10章 內存映射與DMA 356
10.1 設備緩存與設備內存 356
10.2 mmap 356
10.2.1 struct vm_area_struct 357
10.2.2 用戶空間虛擬地址布局 358
10.2.3 mmap系統調用過程 362
10.2.4 驅動程序中mmap方法的實現 368
10.2.5 mmap使用范例 373
10.2.6 munmap 383
10.3 DMA 384
10.3.1 內核中的DMA層 384
10.3.2 物理地址與總線地址 386
10.3.3 dma_set_mask 387
10.3.4 DMA映射 388
10.3.5 回彈緩沖區(bounce buffer) 401
10.3.6 DMA池 401
10.4 本章小結 405

第11章 塊設備驅動程序 407
11.1 塊子系統初始化 408
11.2 ramdisk源碼實例 410
11.2.1 make_request版本的RAM DISK源碼 411
11.2.2 request版本的RAM DISK源碼 416
11.2.3 ramdisk的使用 420
11.3 塊設備號的注冊與管理 422
11.4 block_device 424
11.5 struct gendisk 425
11.6 struct hd_struct 428
11.7 用alloc_disk分配gendisk對象 428
11.8 向系統添加一個塊設備add_disk 430
11.9 block_device_operations 439
11.10 塊設備文件的打開 440
11.11 blk_init_queue 448
11.12 blk_queue_make_request 459
11.13 向隊列提交請求 460
11.14 塊設備的請求處理函數 466
11.15 bio結構 467
11.16 本章小結 472

第12章 網絡設備驅動程序 473
12.1 net_device 475
12.2 網絡設備的注冊 488
12.3 設備方法 492
12.3.1 設備初始化 494
12.3.2 設備接口的打開與停止 495
12.3.3 數據包的發送 495
12.3.4 網絡數據包發送過程中的流控機制 500
12.3.5 傳輸超時(watchdog timeout) 503
12.3.6 數據包的接收 506
12.4 套接字緩沖區 510
12.5 中斷處理 518
12.6 NAPI 520
12.7 本章小結 522

書摘/試閱

模塊最大的好處是可以動態擴展應用程序的功能而無須重新編譯鏈接生成一個新的應用程序映像,這種廣義上的模塊概念其實并非Linux系統所特有,在微軟的Windows系統上動態鏈接庫DLL(Dynamic Link Library)便是模塊概念的一個典型應用場景,對應到Linux系統上這種模塊以所謂的共享庫so(shared object)文件的形式存在。
本章要討論的主題-Linux內核模塊,在概念及原理方面與上面提到的DLL和so模塊類似,但又有其獨特的一面,內核模塊可以在系統運行期間動態擴展系統功能而無須重新肩動系統2,更無須為這些新增的功能重新編譯一個新的系統內核映像。內核模塊的這個特性為內核開發者開發驗證新的功能提供了極大的便利,因為像Linux這么龐大的系統,編譯一個新內核并重新啟動將浪費開發者大量的時間。雖然設備驅動程序并不一定要以內核模塊的形式存在,并且內核模塊也不一定就代表著一個設備驅動程序,但是內核模塊的這種特性似乎注定是為設備驅動程序而生。Linux系統下的設備驅動程序員在開發一個新的設備驅動的過程中,使用的最多的工具之一是insmod,這就是一個簡單的向系統動態加載內核模塊的命令。
很難想象,如果沒有insmod這樣的機制,在Linux底下調試一個設備驅動會是怎樣的一件讓人痛苦抓狂的事情!筆者相信,任何一個在Linux上面有過實際的驅動程序開發經歷的人都會有類似的感受。Linux系統雖然為內核模塊機制提供了完善的支持,使得其下的內核模塊是如此強大,然而現實中事情往往并非如預想的那樣一帆風順,如果對其幕後的機制不甚了解,在實際的開發過程之中,除了驅動程序自身要實現的功能可能會遇到麻煩以外,在利用Linux中的內核模塊機制時,也會遇到各種各樣的問題,比如在用insmod命令加載一個模塊時,就很可能會碰到類似下面的錯誤信息。

您曾經瀏覽過的商品

購物須知

大陸出版品因裝訂品質及貨運條件與台灣出版品落差甚大,除封面破損、內頁脫落等較嚴重的狀態,其餘商品將正常出貨。

特別提醒:部分書籍附贈之內容(如音頻mp3或影片dvd等)已無實體光碟提供,需以QR CODE 連結至當地網站註冊“並通過驗證程序”,方可下載使用。

無現貨庫存之簡體書,將向海外調貨:
海外有庫存之書籍,等候約45個工作天;
海外無庫存之書籍,平均作業時間約60個工作天,然不保證確定可調到貨,尚請見諒。

為了保護您的權益,「三民網路書店」提供會員七日商品鑑賞期(收到商品為起始日)。

若要辦理退貨,請在商品鑑賞期內寄回,且商品必須是全新狀態與完整包裝(商品、附件、發票、隨貨贈品等)否則恕不接受退貨。

優惠價:87 512
絕版無法訂購

暢銷榜

客服中心

收藏

會員專區