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

worldblog發表於2007-12-13
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/.o


---- 6) 重鍵核心

cd/etc/conf/cf.d ./link_unix


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

實達集團公司
李巧霞

一.相關概念

---- 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/10752043/viewspace-992533/,如需轉載,請註明出處,否則將追究法律責任。

相關文章