linux驅動開發

設備驅動最通俗的解釋就是「驅使硬件設備行動「。操做系統是經過各類驅動程序來駕馭硬件設備的,它爲用戶屏蔽了各類各樣的設備,驅動硬件是操做系統最基本的功能,並提供統一的操做方式。系統調用是操做系統內核和應用程序之間的接口,設備驅動程序是操做系統內核和機器硬件之間的接口。設備驅動程序爲應用程序屏蔽了硬件的細節,這樣在應用程序看來,硬件設備只是一個設備文件, 應用程序能夠象操做普通文件同樣對硬件設備進行操做。設備驅動程序是內核的一部分,它完成如下的功能:

1 對設備初始化和釋放。

2 把數據從內核傳送到硬件和從硬件讀取數據。

3 讀取應用程序傳送給設備文件的數據和回送應用程序請求的數據。

4 檢測和處理設備出現的錯誤。

一.驅動設備分類

以 Linux 的方式看待設備可區分爲 3 種基本設備類型字符設備、塊設備、網絡接口。 html

字符設備 

一個字符( char ) 設備是一種能夠看成一個字節流來存取的設備( 如同一個文件 ); 一個字符驅動負責實現這種行爲. 這樣的驅動經常至少實現 open, close, read, 和 write 系統調用. 文本控制檯( /dev/console )和串口( /dev/ttyS0 及其友 )是字符設備的例子, 由於它們很好地展示了流的抽象. 字符設備經過文件系統結點來存取, 例如 /dev/tty1 和 /dev/lp0. 在一個字符設備和一個普通文件之間惟一有關的不一樣就是, 你常常能夠在普通文件中移來移去, 可是大部分字符設備僅僅是數據通道, 你只能順序存取.然而, 存在看起來象數據區的字符設備, 你能夠在裏面移來移去. 例如, frame grabber 常常這樣, 應用程序可使用 mmap 或者 lseek 存取整個要求的圖像. linux

塊設備  ios

如同字符設備, 塊設備經過位於 /dev 目錄的文件系統結點來存取. 一個塊設備(例如一個磁盤)應該是能夠駐有一個文件系統的. 在大部分的 Unix 系統, 一個塊設備只能處理這樣的 I/O 操做, 傳送一個或多個長度常常是 512 字節( 或一個更大的 2 的冪的數 )的整塊. Linux, 相反, 允許應用程序讀寫一個塊設備象一個字符設備同樣 -- 它容許一次傳送任意數目的字節. 結果就是, 塊和字符設備的區別僅僅在內核在內部管理數據的方式上, 而且所以在內核/驅動的軟件接口上不一樣. 如同一個字符設備, 每一個塊設備都經過一個文件系統結點被存取的, 它們之間的區別對用戶是透明的. 塊驅動和字符驅動相比, 與內核的接口徹底不一樣.  

網絡接口 安全

 

任何網絡事務都經過一個接口來進行, 就是說, 一個可以與其餘主機交換數據的設備. 一般, 一個接口是一個硬件設備, 可是它也多是一個純粹的軟件設備, 好比環回接口. 一個網絡接口負責發送和接收數據報文, 在內核網絡子系統的驅動下, 沒必要知道單個事務是如何映射到實際的被髮送的報文上的. 不少網絡鏈接( 特別那些使用 TCP 的)是面向流的, 可是網絡設備卻經常設計成處理報文的發送和接收. 一個網絡驅動對單個鏈接一無所知; 它只處理報文.

二.驅動設備設備號 網絡

 Linux設備驅動中,設備號設一個很重要的概念和變量。每一個設備在 /dev目錄下都有一個對應的文件(節點)。能夠經過 cat /proc/devices 命令查看當前已經加載的設備驅動程序的主設備號。內核可以識別的全部設備都記錄在原碼樹下的 documentation/devices.txt 文件中。在 /dev 目錄下除了字符設備和塊設備節點以外還一般還會存在:fifo管道、socket、軟/硬鏈接、目錄。這些東西沒有主/次設備號。
$ ls -l /dev/rfd0 /dev/fd0
brw-r-----  9 root operator 2, 0 nov 12 13:32 /dev/fd0
crw-r-----  9 root operator 9, 0 nov 12 13:32 /dev/rfd0
   
能夠看到原來顯示文件大小的地方,如今改成顯示兩個用逗號分隔的數字。這是系統用來表示設備的兩個重要的序號,第一個爲主設備號(major number),用來表示設備使用的硬件驅動程序在系統中的序號;第二個爲從設備號(minor number)。

app

$ ls -l /dev/rfd0 /dev/fd0 dom

brw-r-----  9 root operator 2, 0 nov 12 13:32 /dev/fd0 socket

crw-r-----  9 root operator 9, 0 nov 12 13:32 /dev/rfd0 tcp

    能夠看到原來顯示文件大小的地方,如今改成顯示兩個用逗號分隔的數字。這是系統用來表示設備的兩個重要的序號,第一個爲主設備號(major number),用來表示設備使用的硬件驅動程序在系統中的序號;第二個爲從設備號(minor number)。 oop

瞭解這些設備的最基本要求就是對 每一個設備文件的含義瞭如指掌,下面就醫列表的形式列出常見的設備文件以及相應的含義:
----------------------------------------------------------------------
主 設備號        設備類型
               次設備號=文件名          簡要說明
----------------------------------------------------------------------
 0                未命名設備(例如:掛載的非設備)
                 0 = 未空設備號保留
 1 char        內存設備
                 1 = /dev/mem                  直接存取物理內存
                 2 = /dev/kmem               存取通過內核虛擬以後的內存
                 3 = /dev/null                   空設備。任何寫入都將被直接丟棄,任何讀取都將獲得eof。
                 4 = /dev/port                   存取 i/o 端口
                 5 = /dev/zero                 零字節源,只能讀取到無限多的零字節。
                 7 = /dev/full                    滿設備。任何寫入都將失敗,並把errno設爲enospc以表示沒有剩餘空間。
                 8 = /dev/random           隨機數發生器。徹底由用戶的輸入來產生隨機數。  若是用戶中止全部動做,則中止產生新的隨機數。                                     
                 9 = /dev/urandom       更快,可是不夠安全的隨機數發生器。儘量由用戶的輸入來產生隨機數,  若是用戶中止全部動做,則把已經產生的隨機數作爲種子來產生新的隨機數。
                10 = /dev/aio                   異 步 i/o 通知接口
                11 = /dev/kmsg              任何對該文件的寫入都將做爲 printk 的輸出
 1 block        ram disk
                 0 = /dev/ram0               第1個 ram disk (initrd只能使用ram0)
                 1 = /dev/ram1              第2個 ram disk
                   ...
               200 = /dev/ram200      第200個 ramdisk
 4 char        tty(終端)設備
                 0 = /dev/tty0               當前虛擬控制檯
                 1 = /dev/tty1              第1個虛擬控制檯
                   ...
                63 = /dev/tty63       第63個虛擬控制檯
 4 block        若是根文件系統以是以只讀方式掛載的,那麼就不可能建立真正的設備節點,
               此時就使用該設備做爲動態分配的主(major)設備的別名
                 0 = /dev/root
 5 char        其餘 tty 設備
                 0 = /dev/tty              當前 tty 設備
                 1 = /dev/console       系統控制檯
                 2 = /dev/ptmx               全部 pty master 的複用器
 7 char        虛擬控制檯捕捉設備(這些設備既容許讀也容許寫)
                 0 = /dev/vcs               當前虛擬控制檯(vc)的文本內容
                 1 = /dev/vcs1               tty1 的文本內容
                   ...
                63 = /dev/vcs63       tty63 的文本內容
               128 = /dev/vcsa              當前虛擬控制檯(vc)的文本/屬性內容
               129 = /dev/vcsa1       tty1 的文本/屬性內容
                   ...
               191 = /dev/vcsa63      tty63 的文本/屬性內容
代碼:  7 block        迴環設備(用一個普通的磁盤文件來模擬一個塊設備)
               對迴環設備的綁定由 mount(8) 或 losetup(8) 處理
                 0 = /dev/loop0      第1個迴環設備
                 1 = /dev/loop1       第2個迴環設備
                   ...
 8 block        scsi 磁盤(0-15)
                 0 = /dev/sda              第1個 scsi 磁盤(整個磁盤)
                16 = /dev/sdb              第2個 scsi 磁盤(整個磁盤)
                32 = /dev/sdc              第3個 scsi 磁盤(整個磁盤)
                   ...
               240 = /dev/sdp               第16個 scsi 磁盤(整個磁盤)
               分區表示方法以下(以第3個 scsi 磁盤爲例)
                33 = /dev/sdc1              第1個分區
                34 = /dev/sdc2              第2個分區
                   ...
                47 = /dev/sdc15          第15個分區  對於linux/i386來講,分區1-4是主分區,5-15是邏輯分區。
 9 block        metadisk(raid)設備
                 0 = /dev/md0               第1組 metadisk
                 1 = /dev/md1               第2組 metadisk
                   ...
               metadisk 驅動用於將同一個文件系統分割到多個物理磁盤上。
10 char        非串口鼠標,各類雜項設備和特性
                 1 = /dev/psaux       ps/2鼠標
               131 = /dev/temperature       機器內部溫度
               134 = /dev/apm_bios       apm(高級電源管理) bios
               135 = /dev/rtc              實時時鐘(realtime clock)
               144 = /dev/nvram       非易失配置 ram
               162 = /dev/smbus       系統管理總線(system management bus)
               164 = /dev/ipmo              intel的智能平臺管理(intelligent platform management)接口
               173 = /dev/ipmikcs       智能平臺管理(intelligent platformmanagement)接口
               175 = /dev/agpgart      agp圖形地址重映射表(graphics addressremapping table)
               182 = /dev/perfctr       性能監視計數器
               183 = /dev/hwrng      通用硬件隨機數發生器
               184 = /dev/cpu/microcodecpu微代碼更新接口
               186 = /dev/atomicps      進程狀態數據的原子快照
               188 = /dev/smbusbios      smbus(系統管理總線) bios
               200 = /dev/net/tun      tap/tun 網絡設備(tap/tun以軟件的方式實現了網絡設備)
                                      tap模擬了以太網幀(第二層),tun模擬了ip包(第三層)。
               202 = /dev/emd/ctl      加強型 metadisk raid (emd) 控制器
               220 = /dev/mptctl      message passing technology (mpt) control
               223 = /dev/input/uinput      用戶層輸入設備驅動支持
               227 = /dev/mcelog       x86_64 machine check exception driver
               228 = /dev/hpet              hpet driver
               229 = /dev/fuse               fuse(用戶空間的虛擬文件系統)
               231 = /dev/snapshot      系統內存快照
               232 = /dev/kvm              基於內核的虛構機(基於amd svm和intel vt硬件虛擬技術)
11 block        scsi cd-rom 設備
                 0 = /dev/scd0              第1個 scsi cd-rom
                 1 = /dev/scd1              第2個 scsi cd-rom
                   ...
13 char        核心輸入設備
                32 = /dev/input/mouse0               第1個鼠標
                33 = /dev/input/mouse1              第2個鼠標
                   ...
                62 = /dev/input/mouse30      第31個鼠標
                63 = /dev/input/mice               全部鼠標的統一
                64 = /dev/input/event0              第1個事件隊列
                65 = /dev/input/event1               第2個事件隊列
                   ...
                95 = /dev/input/event1               第32個事件隊列
21 char        通用 scsi 設備(一般是scsi光驅)
                 0 = /dev/sg0               第1個通用 scsi 設備
                 1 = /dev/sg1              第2個通用 scsi 設備
                   ...
29 char        通用幀緩衝(frame buffer)設備
                 0 = /dev/fb0              第1個幀緩衝設備
                 1 = /dev/fb1               第2個幀緩衝設備
                   ...
                31 = /dev/fb31              第32個幀緩衝設備
30 char        ibcs-2 兼容設備
                 0 = /dev/socksys      套接字訪問接口
                 1 = /dev/spx               svr3 本地 x 接口
                32 = /dev/inet/ip       網絡訪問接口
                33 = /dev/inet/icmp
                34 = /dev/inet/ggp
                35 = /dev/inet/ipip
                36 = /dev/inet/tcp
                37 = /dev/inet/egp
                38 = /dev/inet/pup
                39 = /dev/inet/udp
                40 = /dev/inet/idp
                41 = /dev/inet/rawip
               此外,ibcs-2 還須要下面的鏈接必須存在
               /dev/ip ->/dev/inet/ip
               /dev/icmp ->/dev/inet/icmp
               /dev/ggp -> /dev/inet/ggp
               /dev/ipip ->/dev/inet/ipip
               /dev/tcp ->/dev/inet/tcp
               /dev/egp ->/dev/inet/egp
               /dev/pup ->/dev/inet/pup
               /dev/udp ->/dev/inet/udp
               /dev/idp ->/dev/inet/idp
               /dev/rawip ->/dev/inet/rawip
               /dev/inet/arp ->/dev/inet/udp
               /dev/inet/rip ->/dev/inet/udp
               /dev/nfsd ->/dev/socksys
               /dev/x0r -> /dev/null
代碼: 36 char        netlink 支持
                 0 = /dev/route       路由, 設備更新, kernel to user
                 3 =/dev/fwmonitor       firewall packet 複製
59 char        sf 防火牆模塊
                 0 = /dev/firewall      與 sf 內核模塊通訊
65 block        scsi 磁盤(16-31)
                 0 = /dev/sdq               第17個 scsi 磁盤(整個磁盤)
                16 = /dev/sdr               第18個 scsi 磁盤(整個磁盤)
                32 = /dev/sds               第19個 scsi 磁盤(整個磁盤)
                   ...
               240 = /dev/sdaf               第32個 scsi 磁盤(整個磁盤)
66 block        scsi 磁盤(32-47)
                 0 = /dev/sdag              第33個 scsi 磁盤(整個磁盤)
                16 = /dev/sdah              第34個 scsi 磁盤(整個磁盤)
                32 = /dev/sdai              第35個 scsi 磁盤(整個磁盤)
                   ...
               240 = /dev/sdav               第48個 scsi 磁盤(整個磁盤)
89 char        i2c 總線接口
                 0 = /dev/i2c-0      第1個i2c 適配器
                 1 = /dev/i2c-1       第2個i2c 適配器
                   ...
98 block        用戶模式下的虛擬塊設備(分區處理方式與 scsi 磁盤相同)
                 0 = /dev/ubda               第1個用戶模式塊設備
                16 = /dev/udbb              第2個用戶模式塊設備
                   ...
103 block        審計(audit)設備
                 0 = /dev/audit      審計(audit)設備
128-135 char        unix98 pty master
               這些設備不該當存在設備節點,而應當經過 /dev/ptmx 接口訪問。
136-143 char        unix98 pty slave
               這些設備節點是自動生成的(伴有適當的權限和模式),不能手動建立。
               方法是經過使用適當的 mount 選項(一般是:mode=0620,gid=)
               將 devpts 文件系統掛載到 /dev/pts 目錄便可。
                 0 = /dev/pts/0       第1個unix98 pty slave
                 1 = /dev/pts/1       第2個unix98 pty slave
                   ...
代碼:153 block        enhancedmetadisk raid (emd) 存儲單元(分區處理方式與 scsi 磁盤相同)
                 0 = /dev/emd/0         第1個存儲單元
                 1 = /dev/emd/0p1      第1個存儲單元的第1個分區
                 2 = /dev/emd/0p2       第1個存儲單元的第2個分區
                   ...
                15 = /dev/emd/0p15      第1個存儲單元的第15個分區
                16 = /dev/emd/1       第2個存儲單元
                32 = /dev/emd/2      第3個存儲單元
                   ...
               240 = /dev/emd/15      第16個存儲單元
180 char        usb 字符設備
                96 = /dev/usb/hiddev0      第1個usb人機界面設備(鼠標/鍵盤/遊戲杆/手寫版等人操做計算機的設備)
                   ...
               111 = /dev/usb/hiddev15       第16個usb人機界面設備
180 block        usb 塊設備(u盤之類)
                 0 = /dev/uba               第1個usb 塊設備
                 8 = /dev/ubb                第2個usb 塊設備
                16 = /dev/ubc              第3個usb 塊設備
                    ...
192 char        內核 profiling 接口
                 0 = /dev/profile          profiling 控制設備
                 1 = /dev/profile0      cpu 0 的 profiling 設備
                 2 = /dev/profile1       cpu 1 的 profiling 設備
                   ...
193 char        內核事件跟蹤接口
                 0 = /dev/trace       跟蹤控制設備
                 1 = /dev/trace0      cpu 0 的跟蹤設備
                 2 = /dev/trace1       cpu 1 的跟蹤設備
                   ...
195 char        nvidia 圖形設備(好比顯卡)
                 0 = /dev/nvidia0               第1個 nvidia 卡
                 1 = /dev/nvidia1              第2個 nvidia 卡
                   ...
               255 = /dev/nvidiactl               nvidia 卡控制設備
202 char        特定於cpu模式的寄存器(model-specific register,msr)
                 0 =/dev/cpu/0/msr                cpu 0 的 msrs
                 1 =/dev/cpu/1/msr               cpu 1 的 msrs
                   ...
203 char        cpu cpuid 信息
                 0 =/dev/cpu/0/cpuid                cpu 0 的 cpuid

                 1 =/dev/cpu/1/cpuid               cpu 1 的 cpuid

相關文章
相關標籤/搜索