出版時間:2012-1 出版社:電子工業(yè)出版社 作者:陳學(xué)松 頁數(shù):540
Tag標(biāo)簽:無
內(nèi)容概要
這是一本系統(tǒng)闡述Linux設(shè)備驅(qū)動程序技術(shù)內(nèi)幕的專業(yè)書籍,它的側(cè)重點不是討論如何在Linux系統(tǒng)下編寫設(shè)備驅(qū)動程序,而是要告訴讀者隱藏在這些設(shè)備驅(qū)動程序背后的那些內(nèi)核機制及原理。作者通過對Linux內(nèi)核源碼抽絲剝繭般的解讀,再輔之以精心設(shè)計的大量圖片,使讀者在閱讀完本書后對驅(qū)動程序前臺所展現(xiàn)出來的那些行為特點變得豁然開朗。
本書涵蓋了編寫設(shè)備驅(qū)動程序所需要的幾乎所有的內(nèi)核設(shè)施,比如內(nèi)核模塊、中斷處理、互斥與同步、內(nèi)存分配、延遲操作、時間管理,以及新設(shè)備驅(qū)動模型等內(nèi)容。為了避免讀者迷失在某一技術(shù)細(xì)節(jié)的討論當(dāng)中,本書在一個比較高的層面上進行展開,以一種先框架再細(xì)節(jié)的結(jié)構(gòu)安排極大地簡化了讀者的閱讀與學(xué)習(xí)。
本書不僅適合那些在Linux系統(tǒng)下從事設(shè)備驅(qū)動程序開發(fā)的專業(yè)技術(shù)人員閱讀,也同樣適合有志于從事Linux設(shè)備驅(qū)動程序開發(fā)或?qū)inux設(shè)備驅(qū)動程序及Linux內(nèi)核感興趣的在校學(xué)生等閱讀。對于沒有任何Linux設(shè)備驅(qū)動程序開發(fā)經(jīng)驗的初學(xué)者,建議先閱讀那些討論“如何”在Linux系統(tǒng)下編寫設(shè)備驅(qū)動程序的入門書籍,然后再閱讀本書來理解“為什么”要以這樣或者那樣的方式來編寫設(shè)備驅(qū)動程序。
作者簡介
陳學(xué)松,曾任職于Intel,Marvell等半導(dǎo)體公司,9年以上Linux內(nèi)核、設(shè)備驅(qū)動程序、嵌入式Linux
BSP等領(lǐng)域的開發(fā)經(jīng)驗。專注于Linux系統(tǒng)內(nèi)核、BIOS、文件系統(tǒng)及軟件虛擬化等技術(shù),曾模仿Linux內(nèi)核編寫過微型操作系統(tǒng)。工作之余喜歡以文章的形式將自己的學(xué)習(xí)心得進行總結(jié),善于運用圖形等元素將復(fù)雜概念具體化,梳理脈絡(luò)而不拘于細(xì)節(jié)。05年在IBM
Linux開發(fā)者論壇所發(fā)表的《解析Linux中的VFS文件系統(tǒng)機制》則堪稱作者這一寫作特色的代表之作,該文發(fā)表后曾被多家技術(shù)網(wǎng)站、論壇及個人博客所轉(zhuǎn)載。
喜歡游泳,四肢發(fā)達,胸?zé)o城府。古文功底頗深,少時涉獵甚廣,現(xiàn)在則主要閱讀一些歷史題材類的書籍,熟讀《三國志》。目前任職于AMD上海研發(fā)中心,主要從事Linux顯卡驅(qū)動等領(lǐng)域的研發(fā)工作。
書籍目錄
第1章 內(nèi)核模塊
1.1 內(nèi)核模塊的文件格式
1.2 EXPORT_SYMBOL的內(nèi)核實現(xiàn)
1.3 模塊的加載過程
1.3.1 sys_init_module(第一部分)
1.3.2 struct module
1.3.3 load_module
1.3.4 sys_init_module(第二部分)
1.3.5 模塊的卸載
1.4 本章小結(jié)
第2章 字符設(shè)備驅(qū)動程序
2.1 應(yīng)用程序與設(shè)備驅(qū)動程序互動實例
2.2 struct file_operations
2.3 字符設(shè)備的內(nèi)核抽象
2.4 設(shè)備號的構(gòu)成與分配
2.4.1 設(shè)備號的構(gòu)成
2.4.2 設(shè)備號的分配與管理
2.5 字符設(shè)備的注冊
2.6 設(shè)備文件節(jié)點的生成
2.7 字符設(shè)備文件的打開操作
2.8 本章小結(jié)
第3章 分配內(nèi)存
3.1 物理內(nèi)存的管理
3.1.1 內(nèi)存節(jié)點node
3.1.2 內(nèi)存區(qū)域zone
3.1.3 內(nèi)存頁
3.2 頁面分配器(page allocator)
3.2.1 gfp_mask
3.2.2 alloc_pages
3.2.3 __get_free_pages
3.2.4 get_zeroed_page
3.2.5 __get_dma_pages
3.3 slab分配器(slab allocator)
3.3.1 管理slab的數(shù)據(jù)結(jié)構(gòu)
3.3.2 kmalloc與kzalloc
3.3.3 kmem_cache_create與kmem_cache_alloc
3.4 內(nèi)存池(mempool)
3.5 虛擬內(nèi)存的管理
3.5.1 內(nèi)核虛擬地址空間構(gòu)成
3.5.2 vmalloc與vfree
3.5.3 ioremap
3.6 per-CPU變量
3.6.1 靜態(tài)per-CPU變量的聲明與定義
3.6.2 靜態(tài)per-CPU變量的鏈接腳本
3.6.3 setup_per_cpu_areas函數(shù)
3.6.4 使用per-CPU變量
3.7 本章小結(jié)
第4章 互斥與同步
4.1 并發(fā)的來源
4.2 local_irq_enable與local_irq_disable
4.3 自旋鎖
4.3.1 spin_lock
4.3.2 spin_lock的變體
4.3.3 單處理器上的spin_lock函數(shù)
4.3.4 讀取者與寫入者自旋鎖rwlock
4.4 信號量(semaphore)
4.4.1 信號量的定義與初始化
4.4.2 DOWN操作
4.4.3 UP操作
4.4.4 讀取者與寫入者信號量rwsem
4.5 互斥鎖mutex
4.5.1 互斥鎖的定義與初始化
4.5.2 互斥鎖的DOWN操作
4.5.3 互斥鎖的UP操作
4.6 順序鎖seqlock
4.7 RCU
4.7.1 讀取者的RCU臨界區(qū)
4.7.2 寫入者的RCU操作
4.7.3 RCU使用的特點
4.8 原子變量與位操作
4.9 等待隊列
4.9.1 等待隊列頭wait_queue_head_t
4.9.2 等待隊列的節(jié)點
4.9.3 等待隊列的應(yīng)用
4.10 完成接口completion
4.11 本章小結(jié)
第5章 中斷處理
5.1 中斷的硬件框架
5.2 PIC與軟件中斷號
5.3 通用的中斷處理函數(shù)
5.4 do_IRQ函數(shù)
5.5 struct irq_chip
5.6 struct irqaction
5.7 irq_set_handler
5.8 handle_irq_event
5.9 request_irq
5.10 中斷處理的irq_thread機制
5.11 free_irq
5.12 SOFTIRQ
5.13 irq的自動探測
5.14 中斷處理例程
5.15 中斷共享
5.16 本章小結(jié)
第6章 延遲操作
6.1 tasklet
6.1.1 tasklet機制初始化
6.1.2 提交一個tasklet
6.1.3 tasklet_action
6.1.4 tasklet的其他操作
6.2 工作隊列work queue
6.2.1 數(shù)據(jù)結(jié)構(gòu)
6.2.2 create_singlethread_workqueue和create_workqueue
6.2.3 工人線程worker_thread
6.2.4 destroy_workqueue
6.2.5 提交工作節(jié)點queue_work
6.2.6 內(nèi)核創(chuàng)建的工作隊列
6.3 本章小結(jié)
第7章 設(shè)備文件的高級操作
7.1 ioctl文件操作
7.1.1 ioctl的系統(tǒng)調(diào)用
7.1.2 ioctl的命令編碼
7.1.3 copy_from_user和copy_to_user
7.2 字符設(shè)備的I/O模型
7.3 同步阻塞型I/O
7.3.1 wait_event_interruptible
7.3.2 wake_up_interruptible
7.4 同步非阻塞型I/O
7.5 異步阻塞型I/O
7.6 異步非阻塞型I/O
7.7 驅(qū)動程序的fsync例程
7.8 fasync例程
7.9 llseek例程
7.10 訪問權(quán)能
7.11 本章小結(jié)
第8章 時間管理
8.1 jiffies
8.1.1 時間比較
8.1.2 時間轉(zhuǎn)換
8.2 延時操作
8.2.1 長延時
8.2.2 短延時
8.3 內(nèi)核定時器
8.3.1 init_timer
8.3.2 add_timer
8.3.3 del_timer和del_timer_sync
8.4 本章小結(jié)
第9章 Linux設(shè)備驅(qū)動模型
9.1 sysfs文件系統(tǒng)
9.2 kobject和kset
9.2.1 kobject
9.2.2 kobject的類型屬性
9.2.3 kset
9.2.4 熱插拔中的uevent和call_usermodehelper
9.2.5 實例源碼
9.3 總線、設(shè)備與驅(qū)動
9.3.1 總線及其注冊
9.3.2 總線的屬性
9.3.3 設(shè)備與驅(qū)動的綁定
9.3.4 設(shè)備
9.3.5 驅(qū)動
9.4 class
9.5 本章小結(jié)
第10章 內(nèi)存映射與DMA
10.1 設(shè)備緩存與設(shè)備內(nèi)存
10.2 mmap
10.2.1 struct vm_area_struct
10.2.2 用戶空間虛擬地址布局
10.2.3 mmap系統(tǒng)調(diào)用過程
10.2.4 驅(qū)動程序中mmap方法的實現(xiàn)
10.2.5 mmap使用范例
10.2.6 munmap
10.3 DMA
10.3.1 內(nèi)核中的DMA層
10.3.2 物理地址與總線地址
10.3.3 dma_set_mask
10.3.4 DMA映射
10.3.5 回彈緩沖區(qū)(bounce buffer)
10.3.6 DMA池
10.4 本章小結(jié)
第11章 塊設(shè)備驅(qū)動程序
11.1 塊子系統(tǒng)初始化
11.2 ramdisk源碼實例
11.2.1 make_request版本的RAM DISK源碼
11.2.2 request版本的RAM DISK源碼
11.2.3 ramdisk的使用
11.3 塊設(shè)備號的注冊與管理
11.4 block_device
11.5 struct gendisk
11.6 struct hd_struct
11.7 用alloc_disk分配gendisk對象
11.8 向系統(tǒng)添加一個塊設(shè)備add_disk
11.9 block_device_operations
11.10 塊設(shè)備文件的打開
11.11 blk_init_queue
11.12 blk_queue_make_request
11.13 向隊列提交請求
11.14 塊設(shè)備的請求處理函數(shù)
11.15 bio結(jié)構(gòu)
11.16 本章小結(jié)
章節(jié)摘錄
版權(quán)頁:插圖:模塊最大的好處是可以動態(tài)擴展應(yīng)用程序的功能而無須重新編譯鏈接生成一個新的應(yīng)用程序映像,這種廣義上的模塊概念其實并非Linux系統(tǒng)所特有,在微軟的Windows系統(tǒng)上動態(tài)鏈接庫DLL(Dynamic Link Library)便是模塊概念的一個典型應(yīng)用場景,對應(yīng)到Linux系統(tǒng)上這種模塊以所謂的共享庫so(shared object)文件的形式存在。本章要討論的主題-Linux內(nèi)核模塊,在概念及原理方面與上面提到的DLL和so模塊類似,但又有其獨特的一面,內(nèi)核模塊可以在系統(tǒng)運行期間動態(tài)擴展系統(tǒng)功能而無須重新肩動系統(tǒng)2,更無須為這些新增的功能重新編譯一個新的系統(tǒng)內(nèi)核映像。內(nèi)核模塊的這個特性為內(nèi)核開發(fā)者開發(fā)驗證新的功能提供了極大的便利,因為像Linux這么龐大的系統(tǒng),編譯一個新內(nèi)核并重新啟動將浪費開發(fā)者大量的時間。雖然設(shè)備驅(qū)動程序并不一定要以內(nèi)核模塊的形式存在,并且內(nèi)核模塊也不一定就代表著一個設(shè)備驅(qū)動程序,但是內(nèi)核模塊的這種特性似乎注定是為設(shè)備驅(qū)動程序而生。Linux系統(tǒng)下的設(shè)備驅(qū)動程序員在開發(fā)一個新的設(shè)備驅(qū)動的過程中,使用的最多的工具之一是insmod,這就是一個簡單的向系統(tǒng)動態(tài)加載內(nèi)核模塊的命令。很難想象,如果沒有insmod這樣的機制,在Linux底下調(diào)試一個設(shè)備驅(qū)動會是怎樣的一件讓人痛苦抓狂的事情!筆者相信,任何一個在Linux上面有過實際的驅(qū)動程序開發(fā)經(jīng)歷的人都會有類似的感受。Linux系統(tǒng)雖然為內(nèi)核模塊機制提供了完善的支持,使得其下的內(nèi)核模塊是如此強大,然而現(xiàn)實中事情往往并非如預(yù)想的那樣一帆風(fēng)順,如果對其幕后的機制不甚了解,在實際的開發(fā)過程之中,除了驅(qū)動程序自身要實現(xiàn)的功能可能會遇到麻煩以外,在利用Linux中的內(nèi)核模塊機制時,也會遇到各種各樣的問題,比如在用insmod命令加載一個模塊時,就很可能會碰到類似下面的錯誤信息。
編輯推薦
《深入Linux設(shè)備驅(qū)動程序內(nèi)核機制》編輯推薦:穿針引線,將Linux設(shè)備驅(qū)動程序從臺前到幕后融會貫通,條分縷析,剖析Linux設(shè)備驅(qū)動程序使用到的每一個重要的內(nèi)核設(shè)施,高屋建瓴,多層次立體化揭示Linux設(shè)備驅(qū)動程序的框架結(jié)構(gòu),化繁為簡,簡單的示例源碼具體驗證內(nèi)核背后的運作機制。
圖書封面
圖書標(biāo)簽Tags
無
評論、評分、閱讀與下載
深入Linux設(shè)備驅(qū)動程序內(nèi)核機制 PDF格式下載