freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內容

solaristm操作系統(tǒng)設備驅動教程(編輯修改稿)

2025-09-26 12:19 本頁面
 

【文章內容簡介】 sys 86,255 date time /devices/pci@0,0:devctl 在 Solaris OS 中,主設備編號在您安裝驅動程序時被選定,這樣就不會與其他主設備編號沖突。內核使用主設備編號將 I/O 請求與正確地驅動程序代碼關聯(lián)起來。然后內核使用這種關聯(lián),在用戶讀寫設備文件時,決定執(zhí)行那個驅 動程序。所有設備和它們的主設備編號都羅列在 /etc/name_to_major 文件中。 % grep 86 /etc/name_to_major pci 86 次設備編號在驅動程序中分配。次設備編號必須將每個設備驅動程序映射到一個具體的設備實例。次設備編號通常指子設備。例如,磁盤驅動程序可以與具有多個磁盤驅動器的硬件控制器設備通信。次設備節(jié)點沒有必要使用物理表示。 下面的例子展示了 md 設備的實例 0、 1 和 2。數(shù)字 0、 1 和 2 是次設備編號。 brwr 1 root sys 85, 0 Nov 3 09:43 md@0:0,0,blk crwr 1 root sys 85, 0 Nov 3 09:43 md@0:0,0,raw brwr 1 root sys 85, 1 Nov 3 09:43 md@0:0,1,blk crwr 1 root sys 85, 1 Nov 3 09:43 md@0:0,1,raw brwr 1 root sys 85, 2 Nov 3 09:43 md@0:0,2,blk crwr 1 root sys 85, 2 Nov 3 09:43 md@0:0,2,raw 在 sd@0,0:h 名稱中, h 代表次設備節(jié)點。當驅動程序接收到一個次設備節(jié)點 h 的請求時,驅動程序實際接收的是對應的次設備編號。 sd 節(jié)點的驅動程序將這個次設備編號解釋為磁盤的一個具體部分,例如掛載在 /export 的分區(qū) 7。 第 2 章,模板驅動程序例子 展示了如何在驅動程序中使用 ddi_get_instance(9F) 例程來獲得正在使用的設備實例編號。 第 2 章 模板驅動程序例子 本章將介紹如何開發(fā)一個簡單可用的驅動程序,闡釋如何編寫驅動程序和配置文件,以及如何編譯、加載和測試驅動程序。 本章所述的驅動程序是一個偽設備驅動程序,每當輸入一個入口點時,它只向系統(tǒng)日志寫入一條消息。本驅動程序論證了任何一個字符驅動程序都必須實現(xiàn)的最小功能。本驅動程序可以用作構建復雜驅動程序的一個模板。 本章討論了下列驅動程序開發(fā) 步驟: ? 模板驅動程序例子概述 ? 編寫模板驅動程序 ? 編寫設備配置文件 ? 構建和安裝驅動程序 ? 測試模板驅動程序 ? 完整的驅動程序源代碼 模板驅動程序例子概述 1. 創(chuàng)建一個目錄,用于開發(fā)驅動 程序和打開一個名為 的新文本文件。 2. 編寫可加載模塊配置的入口點: _init(9E)、 _info(9E) 和 _fini(9E)。 3. 編寫自動配置的入口點: attach(9E)、 detach(9E)、 getinfo(9E) 和 prop_op(9E)。 4. 編寫用戶上下文的入口點: open(9E)、 close(9E)、 read(9E) 和 write(9E)。 5. 定義數(shù)據(jù)結構:字符和塊操作結 構 cb_ops(9S)、設備操作結構 dev_ops(9S),以及模塊連接結構 modldrv(9S) 和 modlinkage(9S)。 6. 創(chuàng)建驅動程序配置文件 。 7. 構建和安裝驅動程序。 8. 通過加載驅動程序、讀寫設備節(jié)點和卸載驅動程序來測試驅動程序。 本例中要創(chuàng)建的入口點如下圖所示。 圖 21 dummy 例子的入口點 編寫模板驅動程序 本節(jié)講述本驅動程序所包含的入口點和數(shù)據(jù)結構,并介紹了其定義。所有這些數(shù)據(jù)結構和幾乎所有這些入口點對于任何字符設備驅動程序都是必需的。 本節(jié)講述下列入口點和數(shù)據(jù)結構: ? 可加載模塊配置入口點 ? 自動配置入口點 ? 用戶上下文入口點 ? 字符和塊操作結構 ? 設備操作結構 ? 模塊連接結構 首先,創(chuàng)建一個目錄,用于開發(fā)驅動程序。本驅動程序名為 dummy,因為本驅動 程序不做任何實際工作。接下來打開一個新文本文件,名為 。 編寫可加載模塊配置入口點 不管什么類型,每個內核模塊必須至少定義以下 3 個可加載模塊配置入口點: ? _init(9E) 例程初始化可加載模塊。 _init(9E) 例程必須至少調用 mod_install(9F) 函數(shù)并返回 mod_install(9F) 所返回的成功或失敗值。 ? _info(9E) 例程返回關于可加載模塊的信息。 _info(9E) 例程必須至少調用 mod_info(9F) 函數(shù)并返回 mod_info(9F) 所返回的值。 ? _fini(9E) 例程為卸載準備可加載模塊。 _fini(9E) 例程必須至少調用 mod_remove(9F) 函數(shù) 并返回 mod_remove(9F) 所返回的成功或失敗值。當 mod_remove(9F) 返回成功值時, _fini(9E) 例程必須撤消 _init(9E) 例程所做的每一件事。 mod_install(9F)、 mod_info(9F) 和 mod_remove(9F) 函數(shù)在每個驅動程序里的用法都完全相同,不管驅動程序的功能是什么。您無需關心這些函數(shù)的參數(shù)的值應該是什么。您可以從本例復制這些函數(shù)調用并將它們粘貼到您所編寫的任何驅動程序中。 在本節(jié)中,下列代碼被添加到 源文件中: /* Loadable module configuration entry points */ int _init(void) { cmn_err(CE_NOTE, Inside _init)。 return(mod_install(amp。ml))。 } int _info(struct modinfo *modinfop) { cmn_err(CE_NOTE, Inside _info)。 return(mod_info(amp。ml, modinfop))。 } int _fini(void) { cmn_err(CE_NOTE, Inside _fini)。 return(mod_remove(amp。ml))。 } 聲明可加載模塊配置入口點 _init(9E)、 _info(9E) 和 _fini(9E) 例程名稱對于任何特定的內核模塊都不惟一。在模塊中對它們進行定義時,可以定制這些例程的行為,但這些例程的名稱都不惟一。這些 3 個例程是在 頭文件中聲明的。在 文件中需要包含 頭文件。請勿在 聲明這 3 個例程。 定義模塊初始化入口點 _init(9E) 例程返回類型 int 且不帶參數(shù)。 _init(9E) 例程必須調用 mod_install(9F) 函數(shù)并返回 mod_install(9F) 所返回的成功或失敗值。 mod_install(9F) 函數(shù)帶有一個參數(shù),該參數(shù)是一種 modlinkage(9S) 結構。請參閱 定義模塊連接結構 ,了解信息 modlinkage(9S) 結構的有關信息。 每當輸入一個入口點時,本驅動程序都應該寫一條消息。使用 cmn_err(9F) 函數(shù)可以將一條消息寫入系統(tǒng)日志。 cmn_err(9F) 函數(shù)通常 用于報告錯誤狀態(tài)。 cmn_err(9F) 函數(shù)對于調試也很有用,且這種調試方式與在用戶程序中使用打印語句的方式相同。 cmn_err(9F) 函數(shù)需要包含 頭文件、 頭文件和 頭文件。 cmn_err(9F) 函數(shù)帶有兩個參數(shù)。第一個參數(shù)是一個常量,用于指示錯誤消息的嚴重性。本驅動程序所寫的消息不是錯誤消息,而只是測試消息。將 CE_NOTE 用于該嚴重性常量的值。 cmn_err(9F) 函數(shù)的第二個參數(shù)是一個字符串消息。 下列代碼是應當輸入 文件的 _init(9E) 例程。 ml 結構就是 定義模塊連接結構 中所討論的 modlinkage(9S) 結構。 int _init(void) { cmn_err(CE_NOTE, Inside _init)。 return(mod_install(amp。ml))。 } 定義模塊信息入口點 _info(9E) 例程返回類型 int,它帶有一個參數(shù), 該參數(shù)是一個指向不透明的 modinfo 結構的指針。_info(9E) 例程必須返回 mod_info(9F) 函數(shù)所返回的值。 mod_info(9F) 函數(shù)帶有兩個參數(shù)。 mod_info(9F) 的第一個參數(shù)是一個 modlinkage(9S) 結構。請參閱 定義模塊連接結構 ,了解 modlinkage(9S) 結構的有關信息。 mod_info(9F) 的第二個參數(shù)是同一個 modinfo 結構指針,它也是 _info(9E) 例程的參數(shù)。如果出現(xiàn)錯誤, mod_info(9F) 函數(shù)則返回模塊信息或返回零。 使用 cmn_err(9F) 函數(shù)可以將消息寫 入系統(tǒng)日志,并且其方式與您過去在 _init(9E) 入口點中使用 cmn_err(9F) 函數(shù)的方式相同。 下列代碼是應當輸入 文件的 _info(9E) 例程。 定義模塊連接結構 中討論了 ml 結構。modinfop 參數(shù)是指向某一不透明結構的一個指針,系統(tǒng)用該結構來傳遞模塊信息。 int _info(struct modinfo *modinfop) { cmn_err(CE_NOTE, Inside _info)。 return(mod_info(amp。ml, modinfop))。 } 定義模塊卸載入口點 _fini(9E) 例程返回類型 int 且不帶參數(shù)。 _fini(9E) 例程必須調用 mod_remove(9F) 函數(shù)并返回 mod_remove(9F) 所返回的成功或失敗值。 當 mod_remove(9F) 返回成功值時, _fini(9E) 例程必須撤消 _init(9E) 例程所做的每一件事。 _fini(9E) 例程必須調用 mod_remove(9F) 因為 _init(9E) 例程調用了 mod_install(9F)。 _fini(9E) 例程必須取消分配已經(jīng)分配的一切,關閉已經(jīng)打開的一切,并刪除 in _init(9E) 例程中已經(jīng)創(chuàng)建的一切。 加載模塊時可以隨時調用 _fini(9E) 例程。在正常的操作中, _fini(9E) 例程經(jīng)常失敗。這種情況是很正常的,因為內核允許模塊決定是否可以卸載模塊。如果 mod_remove(9F) 返回成功值,則模塊判定該設備是分離的,該模塊可以卸載。如果 mod_remove(9F) 返回失敗值 , 模塊則判定該設備不是分離的,且該模塊不能卸載。 調用 mod_remove(9F) 時會有下列操作發(fā)生: ? 內核檢查本驅動程序是否在執(zhí)行。下列條件中若有一個為真,則本驅 動程序在執(zhí)行: ? 本驅動程序管理的設備節(jié)點是打開的。 ? 依賴于本驅動程序的另一個模塊是是打開的。如果某一模塊是用 N 選項與被指定為該 N 選項參數(shù)的驅動程序連接在一起的,則該模塊依賴于該驅動程序。請參閱 ld(1) 手冊頁,了解更多信息。 ? 如果本驅動程序在執(zhí)行,則 mod_remove(9F) 和 _fini(9E) 都返回失敗值。 ? 如果本驅動程序未執(zhí)行,則 該內核調用該驅動程序的 detach(9E) 入口點。 ? 如果 detach(9E) 返回失敗值,則 mod_remove(9F) 和 _fini(9E) 返回失敗值。 ? 如果 detach(9E) 返回成功值,則 mod_remove(9F) 返回成功值, _fini(9E) 繼續(xù)其清理工作。 mod_remove(9F) 函數(shù)帶有一個參數(shù),該參數(shù)是一個 modlinkage(9S) 結構。請參閱 定義模塊連接結構 ,了解 modlinkage(9S) 結構的有關信息。 使用 cmn_err(9F) 函數(shù)可以將消息寫入系統(tǒng)日志,并且其方式與您過去在 _init(9E) 入口點中使用 cmn_err(9F) 函數(shù)的方式相同。 下列代碼是應當輸入 文件的 _fini(9E) 例程。 定義模塊連接結構 中討論了 ml 結構。 int _fini(void) { cmn_err(CE_NOTE, Inside _fini)。 return(mod_remove(amp。ml))。 } 包含 可加載的模塊配置頭文件 _init(9E)、 _info(9E)、 _fini(9E) 和 mod_install(9F) 函數(shù)都要求包含 頭文件。 cmn_err(9F) 函數(shù)要求包含 頭文件、 頭文件和 頭文件。
點擊復制文檔內容
黨政相關相關推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1