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

正文內(nèi)容

linux操作系統(tǒng)源代碼詳細(xì)分析-資料下載頁(yè)

2025-06-29 08:01本頁(yè)面
  

【正文】 用于這種目的程序稱為modprobe。有關(guān)的modprobe代碼超出了本書的范圍,但是在Linux的每個(gè)發(fā)行版本中都包含有它。本節(jié)的剩余部分將討論同modprobe協(xié)同工作,以裝載內(nèi)核模塊的內(nèi)核代碼。 1. request_module 24432:作為函數(shù)說(shuō)明之前的注釋,request_module是一個(gè)函數(shù)。內(nèi)核的其他模塊在需要裝載其他內(nèi)核模塊的時(shí)候,都必須調(diào)用這個(gè)函數(shù)。就像內(nèi)核處理其他工作一樣,這種調(diào)用也是為當(dāng)前運(yùn)行的進(jìn)程進(jìn)行的。從進(jìn)程的角度來(lái)看,這種調(diào)用的請(qǐng)求通常是隱含的—正在執(zhí)行進(jìn)程其他請(qǐng)求的內(nèi)核可能會(huì)發(fā)現(xiàn),必須調(diào)入一個(gè)模塊才能夠完成該請(qǐng)求。例如,請(qǐng)參見10070行,這里是一些將在第7章中討論的代碼。 24446:以內(nèi)核中的一個(gè)獨(dú)立進(jìn)程的形式執(zhí)行exec_modprobe函數(shù)(24384行)。這并不能只通過(guò)函數(shù)的簡(jiǎn)單調(diào)用實(shí)現(xiàn),因?yàn)閑xec_modprobe要繼續(xù)調(diào)用exec來(lái)執(zhí)行一個(gè)程序。因此,對(duì)函數(shù)exec_modprobe的簡(jiǎn)單調(diào)用將永遠(yuǎn)不會(huì)有返回。 這和使用fork以準(zhǔn)備exec調(diào)用十分類似,你可以認(rèn)為kernel_thread對(duì)內(nèi)核來(lái)說(shuō)就是較低版本的fork,雖然兩者有很大不同。fork是從指定函數(shù)開始執(zhí)行新的進(jìn)程,而不是從調(diào)用者的當(dāng)前位置開始運(yùn)行。正如fork一樣,kernel_thread返回的值是新進(jìn)程的進(jìn)程號(hào)。 24448:和fork一樣,從kernel_thread返回的負(fù)值表示內(nèi)部錯(cuò)誤。 24455:正如函數(shù)中論述的一樣,大部分的信號(hào)將因當(dāng)前進(jìn)程而被暫時(shí)阻塞。 24462:等待exec_modprobe執(zhí)行完畢,同時(shí)指出所需要的模塊是已經(jīng)成功裝入內(nèi)存,還是裝載失敗了。 24465:結(jié)束運(yùn)行,恢復(fù)信號(hào)。如果exec_modprobe返回錯(cuò)誤代碼,則打印錯(cuò)誤消息。 2. exec_modprobe 24384:exec_modprobe運(yùn)行為內(nèi)核增加內(nèi)核模塊的程序。這里的模塊名是一個(gè)void*的指針,而不是char*的指針。原因簡(jiǎn)單說(shuō)來(lái)就是kernel_thread 產(chǎn)生的函數(shù)通常都使用void*指針參數(shù)。 24386:設(shè)置modprobe的參數(shù)列表和環(huán)境。modprobe_path(24363行)用來(lái)定位modprobe程序的位置。它可以通過(guò)內(nèi)核的sysctl特性來(lái)修改,這一點(diǎn)將在第11章中介紹(參見30388行)。這意味著root可以動(dòng)態(tài)選擇不同于/sbin/modprobe的程序來(lái)運(yùn)行,以適應(yīng)當(dāng)modprobe被安裝到其他地方或者使用修改過(guò)的modprobe替換掉了原有的modprobe之類的情況。24400:(正如代碼中描述的一樣)出于安全性考慮,丟棄所有掛起的信號(hào)和信號(hào)句柄(handlers)。這里最重要的部分是對(duì)flush_signal_handlers的調(diào)用(28041行),它使用內(nèi)核默認(rèn)的信號(hào)句柄代替所有用戶定義的信號(hào)句柄。如果在此時(shí)有信號(hào)被傳送到內(nèi)核,它將獲得默認(rèn)響應(yīng)—通常是忽略信號(hào)或殺死進(jìn)程。但是不管怎樣都不會(huì)引起安全風(fēng)險(xiǎn)。由于該函數(shù)從觸發(fā)它的進(jìn)程中分離出來(lái)(如前所述),所以,不管原始進(jìn)程在此處是否改變其原來(lái)分配的信號(hào),句柄都不會(huì)產(chǎn)生任何影響。 中國(guó)24405:關(guān)閉調(diào)用進(jìn)程打開的所有文件。最重要的是,這意味著modprobe程序不再?gòu)恼{(diào)用進(jìn)程中繼承標(biāo)準(zhǔn)輸入輸出和標(biāo)準(zhǔn)錯(cuò)誤。這很有可能會(huì)引起安全漏洞(這可能是在替代modprobe的程序中引起的問(wèn)題,但是modprobe本身實(shí)際上并不關(guān)心這個(gè)差異)。 24413:modprobe程序作為root運(yùn)行,它擁有root所擁有的所有權(quán)限。和整個(gè)內(nèi)核中其他地方一樣,請(qǐng)注意root使用用戶ID號(hào)0的假定在這里已經(jīng)被寫入程序。用戶ID號(hào)和權(quán)能系統(tǒng)(capability system,在接下來(lái)的幾行中會(huì)用到)將在第7章中介紹。 中國(guó)24421:試圖執(zhí)行modprobe程序。如果嘗試失敗,內(nèi)核將使用printk打印錯(cuò)誤消息并返回錯(cuò)誤代碼。這里是可能產(chǎn)生printk的緩沖器過(guò)載的地點(diǎn)之一。module_name的長(zhǎng)度并沒(méi)有明確限制,就我們對(duì)該調(diào)用的看法而言,它可能長(zhǎng)達(dá)一百萬(wàn)個(gè)字符。為防止printk緩沖器過(guò)載,你必需遍歷所有對(duì)于該函數(shù)的調(diào)用(實(shí)際上是對(duì)request_module的調(diào)用),以保證每個(gè)調(diào)用者使用足夠短的、不會(huì)為printk造成麻煩的模塊名。 24427:當(dāng)execve成功執(zhí)行時(shí),它不會(huì)返回任何結(jié)果,因此本處是不可能執(zhí)行到的。但是編譯器卻并不知道這一點(diǎn),因此,此處使用了return語(yǔ)句以保證gcc不出錯(cuò)。 對(duì)于內(nèi)核的進(jìn)一步討論將超出本章的既定范圍,因此在這個(gè)問(wèn)題上我們到此為止。然而本書中也包括了其他必需的內(nèi)核代碼。在讀完第4章和第5章之后,也許你會(huì)希望再次仔細(xì)研讀一下這部分內(nèi)容。有關(guān)這個(gè)問(wèn)題的兩個(gè)文件是include/linux/(從15529行開始)和/kernel/(從24476行開始)。和sys_create_module(24586行)、sys_init_module(24637行)、sys_delete_module(24860行)和sys_query_module(25148行)四個(gè)函數(shù)需要特別注意一樣,struct module(15581行)也要特別引起注意。這些函數(shù)實(shí)現(xiàn)了modprobe及insmod、lsmod和rmmod所使用的系統(tǒng)調(diào)用,以完成模塊的裝載、定位和卸載。 內(nèi)核觸發(fā)直接回調(diào)內(nèi)核程序的現(xiàn)象看起來(lái)很令人奇怪。但是,實(shí)際上進(jìn)行的工作不止于此。例如,modprobe必須實(shí)際訪問(wèn)磁盤以搜尋要裝載的模塊。而且更為重要的一點(diǎn)是,這種方法賦予root對(duì)內(nèi)核模塊系統(tǒng)更多的控制能力。這主要是因?yàn)閞oot也可以運(yùn)行modprobe及相關(guān)程序。因此,root既可以手工裝載、查詢、卸載模塊,也可以由內(nèi)核自動(dòng)完成。 配置與編譯內(nèi)核 你可能僅僅研讀、欣賞而并不修改Linux內(nèi)核源代碼。但是,更普遍的情況是,用戶有強(qiáng)烈的愿望去改進(jìn)內(nèi)核代碼并完成相應(yīng)的測(cè)試,這樣我們就需要知道如何重建內(nèi)核。本節(jié)就是要告訴你如何實(shí)現(xiàn)這一點(diǎn),而最終則歸結(jié)于如何把你所做的修改發(fā)行給別人,以使得每個(gè)人都能從你的工作中受益。 配置內(nèi)核 編譯內(nèi)核的第一步就是配置內(nèi)核,這是增加或者減少對(duì)內(nèi)核特性的支持及修改內(nèi)核的一些特性的必要步驟。例如,你可以要求內(nèi)核為自己的聲卡指定一個(gè)不同的DMA通道。如果內(nèi)核配置和你的需要相同,那么你可以直接跳過(guò)本節(jié),否則請(qǐng)繼續(xù)閱讀以下內(nèi)容。 為了完成內(nèi)核的配置,請(qǐng)先切換到root用戶,然后轉(zhuǎn)入如下內(nèi)核源程序目錄: cd /usr/src/linux 接著敲入如下命令組: make configmake menuconfigmake xconfig 這三條命令都可以用來(lái)配置內(nèi)核,但它們發(fā)揮作用的方式各不相同: * make config—三種方法中最簡(jiǎn)單也是最枯燥的一種。但是最基本的一點(diǎn)是,它可以適應(yīng)任何情況。通過(guò)為每一個(gè)內(nèi)核支持的特性向用戶提問(wèn)的方式來(lái)決定在內(nèi)核中需要包含哪些特性。對(duì)于大多數(shù)問(wèn)題,你只要回答y(yes,把該特性編譯進(jìn)內(nèi)核中)、m(作為模塊編譯)或者n(no,根本不對(duì)該特性提供支持)。在決定之前用戶應(yīng)該考慮清楚,因?yàn)檫@個(gè)過(guò)程是不可逆的。如果你在該過(guò)程中犯了錯(cuò)誤,就只能按Ctrl+C退出。你也可以敲入?以獲取幫助。圖21顯示了這種方法在X終端上運(yùn)行的情況。
圖21 運(yùn)行中的make config 幸運(yùn)的是,這種方法還有一些智能。例如,如果你對(duì)SCSI支持回答no,那么系統(tǒng)就不會(huì)再詢問(wèn)你有關(guān)SCSI的細(xì)節(jié)問(wèn)題了。而且你可以只按回車鍵以接受默認(rèn)的選擇,也就是當(dāng)前的設(shè)置(因此,如果當(dāng)前內(nèi)核將對(duì)于SCSI的支持編譯進(jìn)了內(nèi)核,在這個(gè)問(wèn)題上按回車鍵就意味著繼續(xù)把對(duì)SCSI的支持編譯進(jìn)內(nèi)核中)。即使是這樣,大部分用戶還是寧愿使用另外的兩種方法。 * make menuconfig—一種基于終端的配置機(jī)制,用戶擁有通過(guò)移動(dòng)光標(biāo)來(lái)進(jìn)行瀏覽等功能。圖22顯示了在X終端上運(yùn)行的make menuconfig。雖然在控制臺(tái)上顯示的是彩色,但是在終端上的顯示仍然相當(dāng)單調(diào)。使用menuconfig必須要有相應(yīng)的ncurses類庫(kù)。 * make xconfig—這是我最喜歡的一種配置方式。只有你能夠在X server上用root用戶身份運(yùn)行X應(yīng)用程序時(shí),這種配置方式才可以使用(有些偏執(zhí)的用戶就不愿意使用這種方式)。你還必須擁有Tcl窗口系統(tǒng),這實(shí)際上還意味著你必須擁有Tcl、Tk以及一個(gè)正在運(yùn)行的X安裝程序。作為補(bǔ)償,用戶獲得的是更漂亮的、基于X系統(tǒng)的以及和menuconfig功能相同的配置方法。圖23顯示了在這種方法運(yùn)行過(guò)程中打開“可裝載模塊支持(Loadable module support)”子窗口的情況。 如上所述,這三種方法都實(shí)現(xiàn)了相同的功能:。而唯一的區(qū)別在于創(chuàng)建這個(gè)文件時(shí)的難易程度不同。 構(gòu)建內(nèi)核 構(gòu)建內(nèi)核要做的工作要比配置內(nèi)核所做的工作少得多。雖然有幾種方式都能實(shí)現(xiàn)這一功能,但是選擇哪一種依賴于你希望怎樣對(duì)系統(tǒng)進(jìn)行設(shè)置。長(zhǎng)期以來(lái),我已經(jīng)形成了如下的習(xí)慣。雖然這種習(xí)慣比我所必須要做的略微多一些,但是它包含了所有基本的問(wèn)題。首先,如果你還不在內(nèi)核源程序目錄中,請(qǐng)先再次轉(zhuǎn)入這一目錄: cd /usr/src/linux 現(xiàn)在,切換到root用戶,使用下面顯示的命令生成內(nèi)核?,F(xiàn)在在shell中敲入下面的命令,注意make命令因?yàn)榭臻g關(guān)系分成了兩行,但實(shí)際上這在shell輸入時(shí)是一個(gè)只有一行的命令: make dep clean zlilo bootmodules modules_install 當(dāng)給出了如上多個(gè)目標(biāo)時(shí),除非前面所有的目標(biāo)都成功了,否則make能夠知道沒(méi)有必要繼續(xù)嘗試下面的目標(biāo)。因此,如果make能夠運(yùn)行結(jié)束,成功退出,那么這就意味著所有的目標(biāo)都正確構(gòu)建了。現(xiàn)在你可以重新啟動(dòng)機(jī)器以運(yùn)行新的內(nèi)核。 備份的重要性 中國(guó)當(dāng)修改(fooling)內(nèi)核時(shí),你必須準(zhǔn)備一個(gè)能夠啟動(dòng)的備用內(nèi)核。實(shí)現(xiàn)該目的的一種方式是通過(guò)配置Linux加載程序(LILO)以允許用戶選擇啟動(dòng)的內(nèi)核映象,其中之一是從沒(méi)有修改過(guò)的內(nèi)核的備份(我總是這樣做的)。 如果你比較有耐心,那么你就可以使用zdisk目標(biāo)而不使用zlilo目標(biāo);它可以把能夠啟動(dòng)的內(nèi)核映象寫入軟盤中。這樣你就可以通過(guò)在啟動(dòng)時(shí)插入軟盤的方式啟動(dòng)你的測(cè)試內(nèi)核;如果沒(méi)有插入軟盤,則啟動(dòng)正常的內(nèi)核。 但是請(qǐng)注意:內(nèi)核模塊并沒(méi)有被裝載到軟盤中,它們實(shí)際上是裝在硬盤中的(除非你愿意承擔(dān)更多的麻煩)。因此,如果你弄亂了內(nèi)核模塊,即使是zdisk目標(biāo)也救不了你。實(shí)際上,上面提到的這兩種方法都存在這個(gè)問(wèn)題。雖然有比較好的解決方法可用,但是最簡(jiǎn)單的方法(也就是我所使用的方法)是把備份內(nèi)核作為嚴(yán)格獨(dú)立的內(nèi)核來(lái)編譯,而不使用可裝載模塊的支持。通過(guò)這種方法,即使我弄亂了內(nèi)核而不得不使用備份啟動(dòng)系統(tǒng),那么不管問(wèn)題是實(shí)驗(yàn)性內(nèi)核不正確還是內(nèi)核模塊的原因都無(wú)關(guān)緊要。不管怎樣,在備份的內(nèi)核中已經(jīng)有我需要的所有東西了。 由于用戶所做的修改可能導(dǎo)致系統(tǒng)的崩潰,如損壞磁盤上的數(shù)據(jù)等等,并不僅僅只是打亂設(shè)備驅(qū)動(dòng)程序或文件系統(tǒng),在測(cè)試新內(nèi)核之前,備份系統(tǒng)的最新數(shù)據(jù)也是一個(gè)英明的決策(雖然設(shè)備驅(qū)動(dòng)程序的開發(fā)不是本書的主題,但是必需指出的是,設(shè)備驅(qū)動(dòng)程序的缺陷可能會(huì)引起系統(tǒng)的物理?yè)p壞。例如顯示器是不能備份的,而且因價(jià)格昂貴而不易替換)。作為一個(gè)潛在的內(nèi)核黑客,你的最佳投資(當(dāng)然是讀過(guò)本書以后)是一個(gè)磁帶驅(qū)動(dòng)器和充足的磁帶。 發(fā)布你的改進(jìn) 中國(guó)下面是有關(guān)發(fā)布你所做修改的一些基本規(guī)則: * 檢查最新發(fā)行版本,確保你所處理的不是已經(jīng)解決了的問(wèn)題。 * 遵守Linux 內(nèi)核代碼編寫的風(fēng)格。簡(jiǎn)要的說(shuō)就是8字符縮進(jìn)以及Kamp。R括號(hào)風(fēng)格(if,else,for,while,switch或者do后面同一行中緊跟著開括號(hào))。在內(nèi)核源程序目錄下面的文檔編寫和代碼風(fēng)格文件給出了完整的規(guī)則,不過(guò)我們已經(jīng)介紹了其中的關(guān)鍵部分。注意本書中包含的源程序代碼為節(jié)省空間而進(jìn)行了大量的重新編輯,在該過(guò)程中我可能打破了其中的一些規(guī)則。 * 獨(dú)立發(fā)行相對(duì)無(wú)關(guān)的修改。這樣,只想使用你所做的某部分修改的人就可以十分方便地獲得想要的東西,而不用一次檢驗(yàn)所有的修改內(nèi)容。 * 讓使用你所做修改的用戶清楚他們可以從你的修改中獲取什么。同樣,你也應(yīng)該給出這些問(wèn)題的可信度。你是15min之前才匆匆完成你的修改,甚至還沒(méi)有時(shí)間對(duì)它們進(jìn)行編譯,還是已經(jīng)在你和你的朋友的系統(tǒng)中已長(zhǎng)期穩(wěn)定地運(yùn)行過(guò)這個(gè)修改? 假設(shè)現(xiàn)在你已經(jīng)準(zhǔn)備好發(fā)行自己的修改版本了,那么要做的第一步是建立一個(gè)說(shuō)明你所做的修改的文件。你可以使用diff程序自動(dòng)創(chuàng)建這個(gè)文件。結(jié)果或者被稱為diffs,或者在Linux中更普遍的被稱為補(bǔ)?。╬atch)。 發(fā)布的過(guò)程十分簡(jiǎn)單。,而你修改過(guò)的源程序代碼在linuxmy目錄下,那么只要進(jìn)行如下的簡(jiǎn)單工作就可以了(只有在鏈接不存在的情況下才需要執(zhí)行l(wèi)n): 現(xiàn)在。(警告:如上所述,兩個(gè)源程序間的所有差別都會(huì)包含在這個(gè)補(bǔ)丁文件中。diff不能區(qū)分修改部分之間的關(guān)系,所以就把它們都羅列了出來(lái)。)如果補(bǔ)丁文件相對(duì)較小,你可以使用郵件直接發(fā)往內(nèi)核郵件列表。如果補(bǔ)丁很大,那么就需要通過(guò)FTP或者Web站點(diǎn)發(fā)布。這時(shí)發(fā)給郵件列表的信件中就只需要包含一個(gè)URL。 Linux內(nèi)核郵件列表的常見問(wèn)題解答(FAQ)文件位于~rreilova/ linux/。該FAQ中包含了郵件列表的訂閱、郵件發(fā)布及閱讀郵件列表的注意事項(xiàng)等等。
點(diǎn)擊復(fù)制文檔內(nèi)容
化學(xué)相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1