Linux驅動開發入門與實戰(第3版)

鄭強

  • 出版商: 清華大學
  • 出版日期: 2024-03-01
  • 定價: $654
  • 售價: 8.5$556
  • 語言: 簡體中文
  • ISBN: 7302654808
  • ISBN-13: 9787302654803
  • 相關分類: Linux
  • 下單後立即進貨 (約4週~6週)

  • Linux驅動開發入門與實戰(第3版)-preview-1
  • Linux驅動開發入門與實戰(第3版)-preview-2
  • Linux驅動開發入門與實戰(第3版)-preview-3
Linux驅動開發入門與實戰(第3版)-preview-1

買這商品的人也買了...

相關主題

商品描述

本書是獲得大量讀者好評的“Linux典藏大系”中的《Linux驅動開發入門與實戰》(第3版)。《Linux驅動開發入門與實戰(第3版)》內容充實,重點突出,實例豐富,實用性強,涵蓋Linux驅動開發從基礎知識到核心原理,再到應用實例的大部分核心知識。本書專門提供教學視頻、源代碼、思維導圖、習題參考答案和教學PPT等超值配套資料,可以幫助讀者高效、直觀地學習。 《Linux驅動開發入門與實戰(第3版)》共19章,分為3篇。第1篇“基礎知識”涵蓋Linux驅動開發概述、嵌入式處理器和開發板、構建嵌入式驅動程序開發環境、構建嵌入式Linux操作系統、構建第一個驅動程序、簡單的字符設備驅動程序等內容;第2篇“核心技術”涵蓋設備驅動的並發控制、設備驅動的阻塞和同步機制、中斷與時鐘機制、內外存訪問等內容;第3篇“應用實戰”涵蓋設備驅動模型、RTC實時時鐘驅動程序、看門狗驅動程序、IIC設備驅動程序、LCD設備驅動程序、觸摸屏設備驅動程序、輸入子系統設計、塊設備驅動程序、USB設備驅動程序等內容。 《Linux驅動開發入門與實戰(第3版)》適合所有想系統學習Linux驅動開發的入門與進階人員閱讀,也適合從事驅動開發的工程師閱讀,還適合高等院校相關專業的學生和培訓機構的學員作為學慣用書。

作者簡介

鄭強,畢業於西南大學,獲碩士學位。長期從事嵌入式系統開發和設計,擅長驅動程序設計和開發。現任職於某公司的項目主管,先後開發過十幾個大中型項目,涉及GPS定位系統、刷卡系統、指紋識別和手機應用等產品。

目錄大綱

 

  

第1篇  基礎知識

第1章  Linux驅動開發概述 2

1.1  Linux設備驅動基礎知識 2

1.1.1  設備驅動程序概述 2

1.1.2  設備驅動程序的作用 2

1.1.3  設備驅動的分類 3

1.2  Linux操作系統與驅動的關系 4

1.3  Linux驅動程序開發簡介 4

1.3.1  用戶態和內核態 5

1.3.2  模塊機制 5

1.3.3  編寫設備驅動程序需要瞭解的知識 6

1.4  編寫設備驅動程序的註意事項 6

1.4.1  應用程序開發與驅動程序開發的差異 6

1.4.2  使用GUN C開發驅動程序 7

1.4.3  不能使用C函數庫開發驅動程序 7

1.4.4  沒有內存保護機制 8

1.4.5  小內核棧 8

1.4.6  重視可移植性 8

1.5  Linux驅動的發展趨勢 9

1.5.1  Linux驅動的發展前景 9

1.5.2  驅動的應用 9

1.5.3  相關學習資源 9

1.6  小結 10

1.7  習題 10

第2章  嵌入式處理器和開發板 11

2.1  處理器 11

2.1.1  處理器簡介 11

2.1.2  處理器的種類 11

2.2  ARM處理器 12

2.2.1  ARM處理器簡介 12

2.2.2  ARM處理器系列 13

2.2.3  ARM處理器的應用 14

2.2.4  ARM處理器的選型 15

2.2.5  ARM處理器選型舉例 18

2.3  S3C2440開發板 19

2.3.1  S3C2440開發板簡介 19

2.3.2  S3C2440開發板的特性 19

2.3.3  其他開發板 21

2.4  小結 21

2.5  習題 21

第3章  構建嵌入式驅動程序開發環境 23

3.1  安裝虛擬機和Linux系統 23

3.1.1  在Windows上安裝虛擬機 23

3.1.2  在虛擬機上安裝Linux系統 27

3.1.3  設置共享目錄 29

3.2  代碼閱讀工具Source Insight 30

3.2.1  Source Insight簡介 31

3.2.2  閱讀源代碼 31

3.3  小結 34

3.4  習題 35

第4章  構建嵌入式Linux操作系統 36

4.1  Linux操作系統簡介 36

4.2  Linux操作系統的優點 37

4.3  Linux內核子系統 38

4.3.1  進程管理 38

4.3.2  內存管理 39

4.3.3  文件系統 39

4.3.4  設備管理 40

4.3.5  網絡管理 40

4.4  Linux源代碼結構分析 40

4.4.1  arch目錄 40

4.4.2  drivers目錄 41

4.4.3  fs目錄 41

4.4.4  其他目錄 42

4.5  內核配置選項 43

4.5.1  配置編譯過程 43

4.5.2  常規配置 44

4.5.3  模塊配置 46

4.5.4  塊設備層配置 47

4.5.5  CPU類型和特性配置 47

4.5.6  電源管理配置 48

4.5.7  總線配置 49

4.5.8  網絡配置 49

4.5.9  設備驅動配置 50

4.5.10  文件系統配置 54

4.5.11  其他配置 56

4.6  嵌入式文件系統簡介 56

4.6.1  嵌入式系統的存儲介質 57

4.6.2  JFFS文件系統 57

4.6.3  YAFFS文件系統 58

4.7  構建根文件系統簡介 58

4.7.1  Linux根文件系統目錄結構 59

4.7.2  使用BusyBox構建根文件系統 60

4.8  小結 65

4.9  習題 65

第5章  構建第一個驅動程序 67

5.1  升級內核 67

5.1.1  為什麽要升級內核 67

5.1.2  升級內核的方式 68

5.2  編寫Hello World驅動程序 70

5.2.1  驅動模塊的組成 70

5.2.2  編寫Hello World模塊 71

5.2.3  編譯Hello World模塊 72

5.2.4  模塊的操作命令 74

5.2.5  Hello World模塊對文件系統的影響 75

5.3  模塊參數和模塊之間的通信 76

5.3.1  模塊參數 76

5.3.2  模塊使用的文件格式ELF 76

5.3.3  模塊之間的通信 77

5.3.4  模塊之間的通信實例 78

5.4  將模塊加入內核 81

5.4.1  向內核添加模塊 81

5.4.2  Kconfig文件 81

5.4.3  Kconfig文件的語法 83

5.4.4  應用實例:在內核中增加add_sub模塊 86

5.4.5  對add_sub模塊進行配置 87

5.5  小結 89

5.6  習題 89

第6章  簡單的字符設備驅動程序 91

6.1  字符設備驅動程序框架 91

6.1.1  字符設備和塊設備 91

6.1.2  主設備號和次設備號 92

6.1.3  申請和釋放設備號 94

6.2  初識cdev結構體 95

6.2.1  cdev結構體簡介 95

6.2.2  file_operations結構體簡介 96

6.2.3  cdev和file_operations結構體的關系 97

6.2.4  inode結構體簡介 98

6.3  字符設備驅動程序的組成 99

6.3.1  字符設備驅動程序的加載和卸載函數 99

6.3.2  file_operations結構體成員函數 100

6.3.3  驅動程序與應用程序的數據交換 100

6.3.4  字符設備驅動程序組成小結 101

6.4  VirtualDisk字符設備驅動程序 101

6.4.1  VirtualDisk的頭文件、宏和設備結構體 102

6.4.2  加載和卸載驅動程序 102

6.4.3  初始化和註冊cdev 104

6.4.4  打開和釋放函數 104

6.4.5  讀寫函數 105

6.4.6  seek()函數 106

6.5  小結 108

6.6  習題 108

第2篇  核心技術

第7章  設備驅動的並發控制 110

7.1  並發與競爭 110

7.2  原子變量操作 110

7.2.1  定義原子變量 110

7.2.2  原子整型操作 111

7.2.3  原子位操作 113

7.3  自旋鎖 114

7.3.1  自旋鎖的操作方法 114

7.3.2  自旋鎖的註意事項 115

7.4  信號量 116

7.4.1  信號量的實現 116

7.4.2  信號量的操作方法 117

7.4.3  自旋鎖與信號量的對比 119

7.5  完成量 119

7.5.1  完成量的實現 120

7.5.2  完成量的操作方法 120

7.6  小結 122

7.7  習題 122

第8章  設備驅動的阻塞和同步機制 123

8.1  阻塞和非阻塞 123

8.2  等待隊列 123

8.2.1  等待隊列的實現 123

8.2.2  等待隊列操作方法 124

8.3  同步機制實驗 126

8.3.1  同步機制設計 126

8.3.2  同步機制驗證 129

8.4  小結 131

8.5  習題 131

第9章  中斷與時鐘機制 133

9.1  中斷簡述 133

9.1.1  中斷的概念 133

9.1.2  中斷的宏觀分類 134

9.1.3  中斷產生的位置分類 134

9.1.4  同步和異步中斷 135

9.2  中斷的實現過程 135

9.2.1  中斷信號線 136

9.2.2  中斷控制器 136

9.2.3  中斷處理過程 136

9.2.4  中斷的安裝與釋放 137

9.3  按鍵中斷實例 138

9.3.1  按鍵設備原理圖 138

9.3.2  有寄存器設備和無寄存器設備 139

9.3.3  G埠控制寄存器 139

9.4  按鍵驅動程序實例分析 141

9.4.1  初始化函數s3c2440_buttons_init() 142

9.4.2  中斷處理函數isr_button() 143

9.4.3  退出函數s3c2440_buttons_exit() 144

9.5  時鐘機制 144

9.5.1  時間度量 144

9.5.2  延時 145

9.6  小結 146

9.7  習題 146

第10章  內外存訪問 147

10.1  內存分配 147

10.1.1  kmalloc()函數 147

10.1.2  vmalloc()函數 148

10.1.3  後備高速緩存 150

10.2  頁面分配 151

10.2.1  內存分配 151

10.2.2  物理地址和虛擬地址之間的轉換 154

10.3  設備I/O埠的訪問 155

10.3.1  Linux I/O埠讀寫函數 155

10.3.2  I/O內存讀寫 155

10.3.3  使用I/O埠 157

10.4  小結 159

10.5  習題 159

第3篇  應用實戰

第11章  設備驅動模型 162

11.1  設備驅動模型概述 162

11.1.1  設備驅動模型的功能 162

11.1.2  sysfs文件系統 163

11.1.3  sysfs文件系統的目錄結構 164

11.2  設備驅動模型的核心數據結構 166

11.2.1  kobject結構體 166

11.2.2  設備屬性kobj_type 170

11.3  kobject對象的應用 173

11.3.1  設備驅動模型結構 173

11.3.2  kset集合 174

11.3.3  kset與kobject的關系 176

11.3.4  kset的相關操作函數 176

11.3.5  註冊kobject到sysfs實例 177

11.3.6  實例測試 181

11.4  設備驅動模型的三大組件 182

11.4.1  總線 182

11.4.2  總線屬性和總線方法 186

11.4.3  設備 187

11.4.4  驅動 188

11.5  小結 191

11.6  習題 192

第12章  實時時鐘驅動程序 193

12.1  RTC實時時鐘的硬件原理 193

12.1.1  實時時鐘簡介 193

12.1.2  RTC實時時鐘的功能 193

12.1.3  RTC實時時鐘的工作原理 195

12.2  RTC實時時鐘架構 199

12.2.1  註冊和卸載平臺設備驅動 199

12.2.2  RTC實時時鐘的平臺設備驅動 200

12.2.3  RTC驅動探測函數 201

12.2.4  RTC設備註冊函數devm_rtc_device_register() 204

12.3  RTC文件系統接口 204

12.3.1  文件系統接口rtc_class_ops 205

12.3.2  RTC實時時鐘獲得時間函數s3c_rtc_gettime() 206

12.3.3  RTC實時時鐘設置時間函數s3c_rtc_settime() 207

12.3.4  RTC驅動探測函數s3c_rtc_getalarm() 208

12.3.5  RTC實時時鐘設置報警時間函數s3c_rtc_setalarm() 209

12.4  小結 210

12.5  習題 211

第13章  看門狗驅動程序 212

13.1  看門狗概述 212

13.1.1  看門狗的功能 212

13.1.2  看門狗的工作原理 212

13.2  設備模型 214

13.2.1  平臺設備模型 214

13.2.2  平臺設備 215

13.2.3  平臺設備驅動 217

13.2.4  平臺設備驅動的註冊和註銷 218

13.2.5  混雜設備 219

13.2.6  混雜設備的註冊和註銷 220

13.3  看門狗設備驅動程序分析 220

13.3.1  看門狗驅動程序的一些變量定義 220

13.3.2  註冊和卸載看門狗驅動 221

13.3.3  看門狗驅動程序探測函數 221

13.3.4  設置看門狗復位時間函數s3c2410wdt_set_heartbeat() 223

13.3.5  看門狗的開始函數s3c2410wdt_start()和停止函數s3c2410wdt_stop() 224

13.3.6  看門狗驅動程序移除函數s3c2410wdt_remove() 225

13.3.7  平臺設備驅動s3c2410wdt_driver中的其他重要函數 226

13.3.8  看門狗中斷處理函數s3c2410wdt_irq() 227

13.4  小結 227

13.5  習題 227

第14章  IIC設備驅動程序 229

14.1  IIC設備的總線及其協議 229

14.1.1  IIC總線的特點 229

14.1.2  IIC總線的信號類型 230

14.1.3  IIC總線的數據傳輸 230

14.2  IIC設備的硬件結構 230

14.3  IIC設備驅動程序的層次結構 232

14.3.1  IIC設備驅動概述 232

14.3.2  IIC設備層 233

14.3.3  i2c_driver和i2c_client的關系 235

14.3.4  IIC總線層 236

14.3.5  IIC設備層和總線層的關系 237

14.3.6  寫IIC設備驅動的步驟 238

14.4  IIC子系統的初始化 238

14.4.1  IIC子系統初始化函數i2c_init() 238

14.4.2  IIC子系統退出函數i2c_exit() 239

14.5  適配器驅動程序 240

14.5.1  S3C2440對應的適配器結構體 240

14.5.2  IIC適配器加載函數i2c_add_adapter() 242

14.5.3  IDR機制 242

14.5.4  適配器卸載函數i2c_del_adapter() 244

14.5.5  IIC總線通信方法s3c24xx_i2c_algorithm結構體 244

14.5.6  適配器的傳輸函數s3c24xx_i2c_doxfer() 246

14.5.7  適配器的中斷處理函數s3c24xx_i2c_irq() 249

14.5.8  字節傳輸函數i2c_s3c_irq_nextbyte() 251

14.5.9  適配器傳輸停止函數s3c24xx_i2c_stop() 253

14.5.10  中斷處理函數的一些輔助函數 254

14.6  IIC設備層驅動程序 255

14.6.1  加載和卸載IIC設備驅動模塊 255

14.6.2  探測函數s3c24xx_i2c_probe() 256

14.6.3  移除函數s3c24xx_i2c_remove() 258

14.6.4  控制器初始化函數s3c24xx_i2c_init() 259

14.6.5  設置控制器數據發送頻率函數s3c24xx_i2c_clockrate() 259

14.7  小結 261

14.8  習題 262

第15章  LCD設備驅動程序 263

15.1  FrameBuffer概述 263

15.1.1  FrameBuffer與應用程序的交互 264

15.1.2  FrameBuffer的顯示原理 264

15.1.3  LCD顯示原理 265

15.2  FrameBuffer結構分析 265

15.2.1  FrameBuffer架構 265

15.2.2  FrameBuffer驅動程序的實現 266

15.2.3  FrameBuffer驅動程序的組成 267

15.3  LCD驅動程序分析 272

15.3.1  LCD模塊的加載和卸載函數 273

15.3.2  LCD驅動程序的平臺數據 274

15.3.3  LCD模塊的探測函數 275

15.3.4  移除函數 279

15.4  小結 280

15.5  習題 280

第16章  觸摸屏設備驅動程序 282

16.1  觸摸屏設備的工作原理 282

16.1.1  觸摸屏設備簡介 282

16.1.2  觸摸屏設備類型 282

16.1.3  電阻式觸摸屏 283

16.2  觸摸屏設備的硬件結構 283

16.2.1  S3C2440觸摸屏接口簡介 283

16.2.2  S3C2440觸摸屏接口的工作模式 284

16.2.3  S3C2440觸摸屏設備寄存器 284

16.3  觸摸屏設備驅動程序分析 288

16.3.1  觸摸屏設備驅動程序構成 288

16.3.2  S3C2440觸摸屏設備驅動程序的註冊和卸載 289

16.3.3  S3C2440觸摸屏驅動模塊探測函數 289

16.3.4  觸摸屏設備驅動程序中斷處理函數 292

16.3.5  S3C2440觸摸屏設備驅動模塊的remove()函數 293

16.4  測試觸摸屏設備驅動程序 294

16.5  小結 295

16.6  習題 295

第17章  輸入子系統設計 297

17.1  input子系統入門 297

17.1.1  簡單的實例 297

17.1.2  註冊函數input_register_device() 299

17.1.3  向子系統報告事件 303

17.2  Handler處理器註冊分析 308

17.2.1  輸入子系統的構成 308

17.2.2  input_handler結構體 308

17.2.3  註冊input_handler 309

17.2.4  input_handle結構體 310

17.2.5  註冊input_handle 311

17.3  input子系統 312

17.4  evdev輸入事件驅動程序分析 313

17.4.1  evdev的初始化 313

17.4.2  打開evdev設備 315

17.5  小結 318

17.6  習題 318

第18章  塊設備驅動程序 319

18.1  塊設備概述 319

18.1.1  塊設備簡介 319

18.1.2  塊設備的結構 320

18.2  塊設備驅動程序架構 322

18.2.1  塊設備的加載過程 322

18.2.2  塊設備的卸載過程 323

18.3  通用塊層 323

18.3.1  通用塊層簡介 323

18.3.2  blk_alloc_disk()函數對應的gendisk結構體 324

18.3.3  塊設備的註冊和註銷 326

18.3.4  請求隊列 327

18.3.5  設置gendisk屬性中的block_device_operations結構體 327

18.4  I/O調度器 328

18.4.1  數據從內存到磁盤的過程 329

18.4.2  塊I/O請求 329

18.4.3  請求結構 331

18.4.4  請求隊列 333

18.4.5  請求隊列、請求結構和bio的關系 334

18.4.6  四種調度算法 335

18.5  編寫塊設備驅動程序 337

18.5.1  宏定義和全局變量 337

18.5.2  加載函數 339

18.5.3  卸載函數 341

18.5.4  自定義請求處理函數 341

18.5.5  驅動測試 342

18.6  小結 345

18.7  習題 345

第19章  USB設備驅動程序 346

19.1  USB概述 346

19.1.1  USB的發展版本 346

19.1.2  USB的特點 347

19.1.3  USB總線拓撲結構 348

19.1.4  USB驅動總體架構 348

19.2  USB設備驅動模型 352

19.2.1  USB設備驅動初探 352

19.2.2  USB設備驅動模型實現原理 355

19.2.3  USB設備驅動結構usb_driver 357

19.3  USB設備驅動程序 362

19.3.1  USB設備驅動程序加載和卸載函數 362

19.3.2  探測函數probe()的參數usb_interface 363

19.3.3  USB協議中的設備 363

19.3.4  端點的傳輸方式 369

19.3.5  設置 370

19.3.6  探測函數storage_probe() 372

19.4  獲得USB設備信息 375

19.4.1  設備關聯函數associate_dev() 375

19.4.2  獲得設備信息函數get_device_info() 377

19.4.3  獲得傳輸協議函數get_transport() 378

19.4.4  獲得協議信息函數get_protocol() 379

19.4.5  獲得管道信息函數get_pipes() 379

19.5  資源初始化 382

19.5.1  storage_probe()函數的調用過程 382

19.5.2  資源獲取函數usb_stor_acquire_resources() 382

19.5.3  USB請求塊 383

19.6  控制子線程 387

19.6.1  控制線程 387

19.6.2  掃描延遲工作函數usb_stor_scan_dwork() 389

19.6.3  獲得LUN函數usb_stor_Bulk_max_lun() 389

19.7  小結 396

19.8  習題 396

Linux驅動開發入門與實戰(第3版)

  

目錄

  

·XIV·

  

  

·XV·