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

正文內(nèi)容

solaristm操作系統(tǒng)設(shè)備驅(qū)動(dòng)教程(編輯修改稿)

2024-09-26 12:19 本頁(yè)面
 

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