SCO UNIX 下裝置驅動程式開發(轉)

BSDLite發表於2007-08-11
SCO UNIX 下裝置驅動程式開發(轉)[@more@]一.相關概念
---- 1裝置號和裝置驅動程式
---- 裝置號是一個數字,他是裝置的標誌。這些裝置在系統上有對應的特殊檔案存在。裝置號由兩部分組成,即主裝置號和次裝置號,高位元組為主裝置號和底位元組為次裝置號.主裝置號標誌裝置的型別,它告訴核心有哪個驅動程式來處理該裝置的請求,次裝置號由相應的裝置驅動程式解釋,它標誌著某個具體的物理裝置。
---- ex. 八串卡,它的主裝置號是相同的,次裝置號是不同的。

---- 2裝置節點

---- unix 把裝置作為特殊的檔案處理,稱裝置檔案,也即裝置節點。裝置節點提供了物理裝置和它對應的驅動程式的介面。0新增裝置節點的命令格式為

---- mknod 裝置名字 [b/c] 主裝置號 次裝置號

---- 它將為裝置檔案產生一個目錄項和對應的i節點。

---- 3裝置驅動程式

---- 裝置驅動程式是物理裝置和作業系統之間的軟體介面,它由一組子程式組成,他負責與物理裝置通訊,併為作業系統的核心提供統一的介面。使用者級的程式透過裝置檔案來訪問裝置,但實際裝置的讀寫則由裝置驅動程式完成.

---- 裝置驅動程式分兩類:字元裝置驅動程式和塊裝置驅動程式。

二.UNIX 系統裝置驅動程式的設計和開發
---- 1驅動程式提供核心的例程:
---- 常見的有:xxxinit(),xxxxopen(),xxxxclose(),xxxxread(),xxxxwrite(),xxxxioctl(),xxxxhalt(); 等等,依此類推。這裡的xxxx是裝置驅動程式的字首,與裝置名相同,在本例中為mytt,這組例程為裝置驅動程式入口例程,下面分別對各個例程作一說明:

---- xxxxinit: 初始化裝置, 由系統在啟動時由核心自動呼叫

---- xxxxhalt: 系統關閉時核心呼叫以關閉裝置

---- xxxxopen: 獲得對一個裝置的存取,當一使用者程式呼叫檔案系統呼叫open 時,核心呼叫以此例程

---- xxxxclose:取消對一個裝置的存取,當一使用者程式呼叫檔案系統例程close時,核心呼叫此例程

---- xxxxread: 從裝置中讀取資料,當使用者程式呼叫檔案系統例程read時,核心呼叫此例程,實現數 據從系統地址空間到使用者地址空間的傳遞。

---- xxxxwrite: 向裝置寫資料,當使用者程式呼叫檔案系統例程write 時,核心呼叫此例程,實現資料從使用者地址空間向系統地址空間的傳遞,併傳送到物理裝置。

---- xxxxintr: 處理裝置中斷,當裝置向系統發出中斷請求時,核心呼叫此例程來處理中斷

---- xxxxstart: 啟動一個驅動程式的存取,該例程也系統啟動期間由核心自動呼叫。 與xxinit例程的區別是:xxinit例程在系統初啟時即被核心用,而xxstart例程的呼叫則在系統中斷系統已初始化完之後才呼叫。

---- xxxxioct1: 控制字元裝置,使用者程式呼叫檔案系統用ioct1時,核心呼叫此例程

---- 這些例程都是可選的。

---- 2驅動程式的引數傳遞:

---- 系統核心為每個程式分配和維護一個核心資料結構USER,該結構包含程式執行時所需的全部資訊。變數u是當前活動程式的USER資料結構,它包含的資訊僅為核心私有,驅動程式會頻繁使用其中的很多元素,較常用的有:

---- u.u_base: 使用者資料區的地址,含有要傳送的讀/寫資料。當使用者呼叫檔案讀/寫系統功能時,地址引數就存在該單元中。

---- u.u_offset:傳遞的資料檔案的起始地址

---- u.u_count: 包含傳遞的位元組數

---- u.u_error: 檔案系統呼叫返回時的全域性變數errno的值

---- 使用者資料區的資料透過核心例程,passc(),cpass(),copyin(),copyout()來傳遞,passc(),cpass()能夠自動維護u結構,copyin(),copyout()必須手動維護u結構。

---- 3驅動程式的除錯:

---- 1)透過printf語句,將要觀察的變數等列印出來

---- 2)自己編寫測試程式除錯,一個簡單的讀寫終端裝置的程式

---- 3)核心出錯時,可以用crash

#卸出記憶體映象
#ldsysdump filename
# crash -d filename

---- 4裝置驅動程式的安裝:

---- 裝置驅動程式的安裝,通常遵循如下步驟:

---- 1) 獲取可用主裝置號,命令為:

/etc/conf/cf.d/configure - j NEXTMAJOR
返回 - 主裝置號,如120 。

---- 2) 建立裝置檔案節點,命令為:
mknod /dev/mytt c 120 0
"/dev/mytt" 指我所做的裝置檔案,"c"
指字元裝置,"120" 指主裝置號,"0" 指次裝置號。

---- 3) 配置系統 ,命令為:

cd/etc/conf/cf.d
./configure -m 120 -c -14 -T2 -v
4 -a myttinit myttopen myttclose
myttread myttwrite myttioct1

option:
l4 中斷優先順序
T2 裝置使用的中斷模式(0-3)
V4 需要中斷相量


---- 4) 檢查裝置mytt是否已加入系統,命令為:

./configure -j mytt

---- 如返回120 則表示mytt 已加入系統,且主裝置為120 。 如返回資訊為"no sueh device " 則系統中沒有名為mytt 的裝置,上述命令也可以在配置系統之前檢查一下系統中是否同名裝置存在。如有的話,可以先將該裝置刪除,然後再加入新裝置。 要刪除一指定裝置,則必須知道其主裝置號。 取主裝置號命令如上面所示,步驟如下:

./configure -j mytt
./configure -m 120 -c -d
則從核心中刪除裝置 mytt


---- 5) 編譯驅動程式原始碼,將生成的.o 檔案拷入/etc/conf/pack.d 目錄

---- 編譯驅動程式原始碼命令列:

cc -c -D_INKERNEL mytt.c

mkdir /etc/conf/pack.d/mytt

cp mytt.o /etc/conf/pack.d/mytt/Driver.o


---- 6) 重鍵核心

cd/etc/conf/cf.d

./link_unix


---- 回答兩個Y,則在根目錄下生成一個新的核心unix,舊的核心檔案被儲存為unix.o1d 驅動程式已安裝完畢,需重新啟動unix系統,裝置驅動程式才能有效這時系統自動執行myttinit(),在主控臺顯示資訊,表示裝置驅動程式已安裝。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617542/viewspace-947403/,如需轉載,請註明出處,否則將追究法律責任。

相關文章