




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
Linux系統(tǒng)概述
第1章Linux系統(tǒng)概述
Linux作為一個(gè)多任務(wù)、多用戶的操作系統(tǒng),以其很好的穩(wěn)定性贏得了廣大用戶,並迅速發(fā)展成為操作系統(tǒng)中的主流。本章簡單介紹Linux的基本概念、Linux操作系統(tǒng)的組成及Linux內(nèi)核分析方法1.1Linux的特徵及組成
Linux系統(tǒng)是包含內(nèi)核、系統(tǒng)工具、完整的開發(fā)環(huán)境和應(yīng)用的類Unix操作系統(tǒng)。這個(gè)系統(tǒng)是由全世界各地的成千上萬的程式員設(shè)計(jì)和實(shí)現(xiàn)的。1984年,RichardStallman創(chuàng)立了GNU工程,其目標(biāo)是開發(fā)一個(gè)完全免費(fèi)的類Unix系統(tǒng)及其應(yīng)用程式。1991年,芬蘭赫爾辛基大學(xué)一位名叫Linus
Torvalds的學(xué)生開始了開放源代碼的Linux雛形的設(shè)計(jì)。其目的是建立不受任何商品化軟體的版權(quán)制約的、全世界都能自由使用的Unix相容產(chǎn)品1.1Linux的特徵及組成
Linux系統(tǒng)是包含內(nèi)核、系統(tǒng)工具、完整的開發(fā)環(huán)境和應(yīng)用的類Unix操作系統(tǒng)。這個(gè)系統(tǒng)是由全世界各地的成千上萬的程式員設(shè)計(jì)和實(shí)現(xiàn)的。1984年,RichardStallman創(chuàng)立了GNU工程,其目標(biāo)是開發(fā)一個(gè)完全免費(fèi)的類Unix系統(tǒng)及其應(yīng)用程式。1991年,芬蘭赫爾辛基大學(xué)一位名叫Linus
Torvalds的學(xué)生開始了開放源代碼的Linux雛形的設(shè)計(jì)。其目的是建立不受任何商品化軟體的版權(quán)制約的、全世界都能自由使用的Unix相容產(chǎn)品由於Linux是一套具有Unix全部功能的免費(fèi)操作系統(tǒng),它在眾多的軟體中佔(zhàn)有很大的優(yōu)勢,為廣大的電腦愛好者提供了學(xué)習(xí)、探索以及修改電腦操作系統(tǒng)內(nèi)核的機(jī)會(huì)1.1.1Linux的主要特性1開放性
開放性是指系統(tǒng)遵循遵循開放系統(tǒng)互連(OpenSystemsInterconnection,OSI)國際標(biāo)準(zhǔn)。凡遵循國際標(biāo)準(zhǔn)所開發(fā)的硬體和軟體,都能彼此相容,可方便地實(shí)現(xiàn)互連。2多用戶
多用戶是指系統(tǒng)資源可以被不同用戶各自擁有使用,即每個(gè)用戶對自己的資源(例如:檔、設(shè)備)有特定的許可權(quán),互不影響。Linux和Unix都具有多用戶的特性。
1.1.1Linux的主要特性3多任務(wù)
多任務(wù)是現(xiàn)代電腦的最主要的一個(gè)特點(diǎn)。它是指電腦同時(shí)執(zhí)行多個(gè)程式,而且各個(gè)程式的運(yùn)行互相獨(dú)立。4良好的用戶介面
Linux向用戶提供了兩種介面:用戶介面和系統(tǒng)調(diào)用5設(shè)備獨(dú)立性
設(shè)備獨(dú)立性是指操作系統(tǒng)把所有外部設(shè)備統(tǒng)一當(dāng)作成文件來看待,只要安裝它們的驅(qū)動(dòng)程式,任何用戶都可以像使用檔一樣,操縱、使用這些設(shè)備,而不必知道它們的具體存在形式。
1.1.1Linux的主要特性6.豐富的網(wǎng)路功能
完善的內(nèi)置網(wǎng)路是Linux的一大特點(diǎn)。Linux在通信和網(wǎng)路功能方面優(yōu)於其他操作系統(tǒng)。7可靠的系統(tǒng)安全
Linux採取了許多安全技術(shù)措施,包括對讀、寫進(jìn)行許可權(quán)控制、帶保護(hù)的子系統(tǒng)、審計(jì)跟蹤、核心授權(quán)等,這為網(wǎng)路多用戶環(huán)境中的用戶提供了必要的安全保障。
8良好的可移植性
可移植性是指將操作系統(tǒng)從一個(gè)平臺(tái)轉(zhuǎn)移到另一個(gè)平臺(tái)使它仍然能按其自身的方式運(yùn)行的能力。
1.1.2Linux的組成
通常操作系統(tǒng)由內(nèi)核和一些系統(tǒng)服務(wù)程式(命令解釋、庫檔、鏈接和編譯程序等)組成。內(nèi)核是操作系統(tǒng)的靈魂,它為用戶進(jìn)程提供了一個(gè)虛擬機(jī)介面。用戶進(jìn)程可以並行運(yùn)行、公平的佔(zhàn)用系統(tǒng)資源而互不干擾。1.
Linux內(nèi)核
內(nèi)核是系統(tǒng)的心臟,是運(yùn)行程式和管理像磁片和印表機(jī)等硬體設(shè)備的核心程式。它從用戶那裏接受命令並把命令送給內(nèi)核去執(zhí)行。
2.
Linux
shell
shell是系統(tǒng)的用戶介面,提供了用戶與內(nèi)核進(jìn)行交互操作的一種介面。它接收用戶輸入的命令並把它送入內(nèi)核去執(zhí)行。
1.1.2Linux的組成3.
Linux檔結(jié)構(gòu)/homebinprocusrbootlibdevetcvarzhengweiYMbinlibmantmplogrunspool1.1.2Linux的組成3.
Linux檔結(jié)構(gòu)名稱
角色root
root檔系統(tǒng)中的內(nèi)容包括:引導(dǎo)系統(tǒng)的必備檔,檔系統(tǒng)的掛裝資訊以及系統(tǒng)修復(fù)工具和備份工具等。/usr/usr檔系統(tǒng)中包含通常操作中不需要進(jìn)行修改的命令程式檔、程式庫、手冊和其他文檔等。/var/var檔系統(tǒng)中包含經(jīng)常變化的檔,例如印表機(jī)、郵件、新聞等的假脫機(jī)目錄、日誌檔、格式化後的手冊頁以及臨時(shí)檔等。
/homehome中包含用戶的主目錄,用戶的數(shù)據(jù)保存在其主目錄中
/proc
/proc檔系統(tǒng)並不保存在磁片上,相反,操作系統(tǒng)在內(nèi)存中創(chuàng)建這一檔系統(tǒng)。
(1)root檔系統(tǒng)
root檔系統(tǒng)中包含一些關(guān)鍵檔,同時(shí)其內(nèi)容也比較小。如果root檔系統(tǒng)被破壞,操作系統(tǒng)就無法正確引導(dǎo)。root檔系統(tǒng)中包含的檔和目錄見表1.2。表1.2root檔系統(tǒng)中的檔和目錄/vmlinuz
檔。系統(tǒng)的標(biāo)準(zhǔn)引導(dǎo)映像,通常以壓縮形式出現(xiàn)。
/bin
包含引導(dǎo)過程必需的命令,也可由普通用戶使用。/sbin和/bin類似,儘管其中的命令可由普通用戶使用,但由於這些命令屬於系統(tǒng)級命令,因此無特殊需求不使用其中的命令。/etc
包含與特定電腦相關(guān)的配置檔。/rootroot用戶的主目錄。/lib
root檔系統(tǒng)中的程式要使用的共用庫保存在該目錄中。表1.2root檔系統(tǒng)中的檔和目錄/lib/modules包含可裝載的內(nèi)核模組。/dev
包含設(shè)備檔。/tmp包含臨時(shí)檔。引導(dǎo)後運(yùn)行的程式應(yīng)當(dāng)在/var/tmp中保存檔,因?yàn)槠渲械目捎每臻g大一些。/boot
包含引導(dǎo)裝載程式要使用的檔。內(nèi)核映像通常保存在這個(gè)目錄中。因?yàn)槎鄠€(gè)內(nèi)核映像會(huì)佔(zhàn)用很多磁片空間,因此可將該目錄放置在單獨(dú)的檔系統(tǒng)中。
/mnt臨時(shí)檔系統(tǒng)的掛裝點(diǎn)。/usr,/var,
/home,/proc其他檔系統(tǒng)的掛裝點(diǎn)。(2)/usr檔系統(tǒng)
/usr文件系統(tǒng)中包含所有的程序文件以及聯(lián)機(jī)文檔,因此其內(nèi)容通常很大。/usr檔系統(tǒng)中包含的檔和目錄見表1.3。表1.3/usr檔系統(tǒng)中的目錄/usr/X11R6
包含X窗口系統(tǒng)的所有檔。
/usr/X386
和/usr/X11R6類似,但包含X11的Release5。/usr/bin
絕大多數(shù)用戶命令。其他命令包含在/bin和/usr/local/bin中。/usr/sbin
root檔系統(tǒng)中不需要的系統(tǒng)管理命令。/usr/man/usr/info/usr/doc
分別包含手冊頁、GNUInfo文檔以及其他雜項(xiàng)文檔。/usr/include
C語言的頭檔。
/usr/lib
程式和子系統(tǒng)所使用的不變的數(shù)據(jù)檔。/usr/local
本地掛裝的軟體和其他檔的存放位置。
(3)/var文件系統(tǒng)
/var包含系統(tǒng)運(yùn)行過程中經(jīng)常發(fā)生變化的檔。/var檔系統(tǒng)中包含的目錄見表1.4。表1.4/var檔系統(tǒng)中的目錄/var/catman格式化手冊頁的高速緩存。/var/lib包含系統(tǒng)運(yùn)行時(shí)經(jīng)常改變的檔。
/var/local安裝/usr/local中的程式的可變數(shù)據(jù)。/var/lock包含鎖檔。
/var/log包含程式產(chǎn)生的日誌檔。
/var/run該目錄包含在下次引導(dǎo)之前有效的、和系統(tǒng)相關(guān)的資訊/var/spool
排隊(duì)任務(wù)的假脫機(jī)目錄
/var/tmp包含大的臨時(shí)檔,或者保存時(shí)間較長的臨時(shí)檔。(4)/proc檔系統(tǒng)
/proc檔系統(tǒng)並不保存在磁片上,操作系統(tǒng)在內(nèi)存中創(chuàng)建這一檔系統(tǒng)。/proc檔系統(tǒng)中包含的檔和目錄見表1.5。表1.5/proc檔系統(tǒng)中的檔和目錄/proc/1該目錄中包含進(jìn)程號為1的進(jìn)程資訊。每個(gè)進(jìn)程在/proc目錄下有一個(gè)以自己的進(jìn)程號為名稱的目錄。
/proc/cpuinfo
有關(guān)CPU名稱、型號、性能和類型的資訊。/proc/devices
當(dāng)前內(nèi)核中的設(shè)備驅(qū)動(dòng)程式列表。
/proc/dma當(dāng)前使用的DMA通道。
/proc/filesystems內(nèi)核支持的檔系統(tǒng)。
/proc/interrupts當(dāng)前使用的中斷資訊。/proc/ioports當(dāng)前使用的I/O端口。/proc/kcore系統(tǒng)物理記憶體的映像。
4.
Linux實(shí)用工具
標(biāo)準(zhǔn)的Linux系統(tǒng)都有一套叫做實(shí)用工具的程式,它們是專門的程式,例如編輯器、執(zhí)行標(biāo)準(zhǔn)的計(jì)算操作等。用戶也可以產(chǎn)生自己的工具。
1.2Linux內(nèi)核的主要組成部分
操作系統(tǒng)一般由內(nèi)核和一些系統(tǒng)程式組成,同時(shí),還有一些應(yīng)用程式幫助用戶完成特定任務(wù)。內(nèi)核是操作系統(tǒng)的靈魂,它負(fù)責(zé)管理磁片上的檔、記憶體,負(fù)責(zé)啟動(dòng)並運(yùn)行程式,負(fù)責(zé)從網(wǎng)路上接收和發(fā)送數(shù)據(jù)包等等。
Linux內(nèi)核主要是由進(jìn)程調(diào)度、記憶體管理、虛擬檔系統(tǒng)、網(wǎng)路介面和進(jìn)程間通信五部分組成。
(1)進(jìn)程調(diào)度負(fù)責(zé)控制進(jìn)程對CPU的訪問,調(diào)度程式使用一種策略確保所有的進(jìn)程都能公平的訪問CPU,並且確保內(nèi)核在任意時(shí)刻能執(zhí)行必要的硬體操作。
(2)記憶體管理負(fù)責(zé)管理系統(tǒng)的物理記憶體,實(shí)現(xiàn)多進(jìn)程安全享享電腦的記憶體。
1.2Linux內(nèi)核的主要組成部分
(3)虛擬檔系統(tǒng)通過將各種設(shè)備抽象為一種公共介面,從而遮罩了各種硬體設(shè)備的細(xì)節(jié)。虛擬檔系統(tǒng)可以分為邏輯檔系統(tǒng)和設(shè)備驅(qū)動(dòng)程式兩部分。
(4)網(wǎng)路介面提供了對各種網(wǎng)路標(biāo)準(zhǔn)的存取和各種網(wǎng)路硬體的支持,實(shí)現(xiàn)了對各種網(wǎng)路標(biāo)準(zhǔn)和網(wǎng)路硬體的訪問。網(wǎng)路介面可分為網(wǎng)路協(xié)議和網(wǎng)路驅(qū)動(dòng)程式。網(wǎng)路協(xié)議部分負(fù)責(zé)實(shí)現(xiàn)每一種可能的網(wǎng)路傳輸協(xié)議。網(wǎng)路設(shè)備驅(qū)動(dòng)程式負(fù)責(zé)與硬體設(shè)備通訊,每一種可能的硬體設(shè)備都有相應(yīng)的設(shè)備驅(qū)動(dòng)程式。1.2Linux內(nèi)核的主要組成部分
(5)進(jìn)程間通信子系統(tǒng)實(shí)現(xiàn)了系統(tǒng)內(nèi)部進(jìn)程間的多種通信機(jī)制。這五個(gè)子系統(tǒng)互相依賴,但相對來說進(jìn)程調(diào)度處在比較重要的地位。其他子系統(tǒng)需要掛起和恢復(fù)進(jìn)程的運(yùn)行都必須依靠進(jìn)程調(diào)度子系統(tǒng)的參與。
1.2.1記憶體管理
對任何一臺(tái)電腦而言,其記憶體以及其他資源都是有限的。為了讓有限的物理記憶體滿足應(yīng)用程式對內(nèi)存的大需求量,Linux採用了稱為“虛擬記憶體”的記憶體管理方式。Linux將記憶體劃分為容易處理的“記憶體頁”,在系統(tǒng)運(yùn)行過程中,應(yīng)用程式對內(nèi)存的需求大於物理記憶體時(shí),Linux可將暫時(shí)不用的記憶體頁交換到硬碟上,這樣,空閒的記憶體頁可以滿足應(yīng)用程式的記憶體需求,應(yīng)用程式卻不會(huì)注意到記憶體交換發(fā)生。
Linux的記憶體管理子系統(tǒng)採用分頁方式管理和使用物理記憶體資源。它根據(jù)不同的晶片採用不同層次的頁表系統(tǒng)(例如Alpha採用三層頁表,Intel採用兩層頁表)實(shí)現(xiàn)了進(jìn)程的邏輯地址空間到物理記憶體地址的映射。因此兩個(gè)進(jìn)程可以訪問相同的地址空間而使用不同的物理記憶體。1.2.1記憶體管理1.2.1記憶體管理1.2.1記憶體管理
為了改善系統(tǒng)的運(yùn)行性能,Linux內(nèi)核採用了多種Cach技術(shù):緩存Cach、頁面Cach、交換Cach和硬體Cach。緩存Cach:它中存儲(chǔ)的是塊設(shè)備驅(qū)動(dòng)模組使用的緩存數(shù)據(jù)。緩存Cach大小固定,使用設(shè)備識別字和塊號進(jìn)行標(biāo)識。它能大大的提高內(nèi)核對外設(shè)的訪問速度。頁面Cach:它被用來加快對磁片上影像和數(shù)據(jù)的訪問速度。它緩存一個(gè)檔中邏輯頁面的內(nèi)容,使用檔和文件中的偏移進(jìn)行標(biāo)識。交換Cach:只有被修改的頁面才被再次寫入到交換區(qū)中,那些已經(jīng)在交換區(qū)中有備份,而且沒有修改的頁面將被直接丟棄。這樣可以大大的提高虛存交換的速度。硬體Cach:用在進(jìn)程中的地址轉(zhuǎn)換,將用過的虛擬地址到物理地址的轉(zhuǎn)換緩存起來,當(dāng)需要進(jìn)行地址轉(zhuǎn)換時(shí),系統(tǒng)不是直接去找頁表,而是在緩存中找。由於Linux系統(tǒng)採用多級頁表系統(tǒng),因此這種技術(shù)可以大大的加快進(jìn)程運(yùn)行速度。1.2.1記憶體管理
記憶體管理子系統(tǒng)由三個(gè)模組組成:體系結(jié)構(gòu)相關(guān)模組、體系結(jié)構(gòu)獨(dú)立模組和系統(tǒng)調(diào)用模組。
(1)體系結(jié)構(gòu)相關(guān)模組:實(shí)現(xiàn)了一個(gè)物理記憶體管理硬體的虛擬介面。(2)體系結(jié)構(gòu)獨(dú)立模組:該模組實(shí)現(xiàn)了進(jìn)程地址空間映射和虛擬記憶體交換,負(fù)責(zé)決定那些記憶體頁交換到檔系統(tǒng)中去。(3)系統(tǒng)調(diào)用介面:該模組用來為用戶進(jìn)程提供有限的訪問許可權(quán)。該模塊允許用戶分配和釋放存儲(chǔ)區(qū),將記憶體影像到I/O檔上。1.2.2進(jìn)程調(diào)度
進(jìn)程實(shí)際是某特定應(yīng)用程式的一個(gè)運(yùn)行實(shí)體。在Linux系統(tǒng)中,能夠同時(shí)運(yùn)行多個(gè)進(jìn)程,Linux通過在短的時(shí)間間隔內(nèi)輪流運(yùn)行這些進(jìn)程而實(shí)現(xiàn)“多任務(wù)”。進(jìn)程是系統(tǒng)分配資源的最小單位。一個(gè)進(jìn)程就是一個(gè)運(yùn)行實(shí)體。在Linux中,所有資源都是以進(jìn)程為對象來進(jìn)行分配的。Linux系統(tǒng)是一個(gè)多任務(wù)的系統(tǒng),進(jìn)程調(diào)度就是要保障各個(gè)進(jìn)程能公平的使用系統(tǒng)的CPU資源。
1.2.2進(jìn)程調(diào)度
Linux內(nèi)核在保障進(jìn)程運(yùn)行效率的實(shí)現(xiàn)方面具有很多特點(diǎn):(1)Linux設(shè)計(jì)了一系列的數(shù)據(jù)結(jié)構(gòu),它們能準(zhǔn)確地描述進(jìn)程的狀態(tài)和其資源使用情況,以便能公平有效地使用系統(tǒng)資源。Linux的調(diào)度演算法能確保不出現(xiàn)某些進(jìn)程過度佔(zhàn)用系統(tǒng)資源而導(dǎo)致另一些進(jìn)程無休止地等待的情況。這一方法從根本上保證了系統(tǒng)的高效和穩(wěn)定。(2)Linux的進(jìn)程創(chuàng)建採用了Copyonwrite技術(shù),即不拷貝父進(jìn)程的空間,而是拷貝父進(jìn)程的頁表,使父進(jìn)程和子進(jìn)程共用物理空間,並將這個(gè)共用空間的訪問許可權(quán)置為只讀。當(dāng)父進(jìn)程和子進(jìn)程的某一方進(jìn)行寫操作時(shí),Linux檢測到一個(gè)非法操作,這時(shí)才將要寫的頁進(jìn)行複製。這一做法免除了只讀頁的複製,從而降低了開銷。
1.2.2進(jìn)程調(diào)度
進(jìn)程調(diào)度子系統(tǒng)可以分為四個(gè)模組:調(diào)度策略模組、體系結(jié)構(gòu)相關(guān)模組、體系結(jié)構(gòu)獨(dú)立模組和系統(tǒng)調(diào)用介面模組。(1)調(diào)度策略模組:該模組主要負(fù)責(zé)判斷哪個(gè)進(jìn)程將訪問CPU。策略的制定必須保證所有進(jìn)程可以得到比較公正的待遇。(2)體系結(jié)構(gòu)相關(guān)模組:該模組被設(shè)計(jì)為將電腦特定體系結(jié)構(gòu)抽象為一種公共介面。這些模組負(fù)責(zé)和CPU通信實(shí)現(xiàn)進(jìn)程的掛起和運(yùn)行。它們知道如何為進(jìn)程保留那些寄存器和狀態(tài)資訊以及如何執(zhí)行彙編代碼來實(shí)現(xiàn)進(jìn)程的掛起和運(yùn)行。(3)體系結(jié)構(gòu)獨(dú)立模組:該模組和調(diào)度策略模組通信決定下一個(gè)該運(yùn)行的進(jìn)程,然後調(diào)用體系結(jié)構(gòu)相關(guān)模組來恢復(fù)進(jìn)程的運(yùn)行。另外該模組還調(diào)用記憶體管理模組保證要運(yùn)行的進(jìn)程的記憶體得到的恢復(fù)。(4)系統(tǒng)調(diào)用介面模組:該模組只允許用戶進(jìn)程訪問內(nèi)核明確公佈的資源。這樣將用戶進(jìn)程對內(nèi)核的以來限制在一個(gè)很少變化的介面範(fàn)圍內(nèi)。
1.2.3設(shè)備驅(qū)動(dòng)程式
設(shè)備驅(qū)動(dòng)程式是Linux內(nèi)核的主要部分。和操作系統(tǒng)的其他部分類似,設(shè)備驅(qū)動(dòng)程式運(yùn)行在高特權(quán)級的處理器環(huán)境中,從而可以直接對硬體進(jìn)行操作,但正因?yàn)槿绱?,任何一個(gè)設(shè)備驅(qū)動(dòng)程式的錯(cuò)誤都可能導(dǎo)致操作系統(tǒng)的崩潰。設(shè)備驅(qū)動(dòng)程式實(shí)際控制操作系統(tǒng)和硬體設(shè)備之間的交互。設(shè)備驅(qū)動(dòng)程式提供一組操作系統(tǒng)可理解的抽象介面完成和操作系統(tǒng)之間的交互,而與硬體相關(guān)的具體操作細(xì)節(jié)由設(shè)備驅(qū)動(dòng)程式完成。一般而言,設(shè)備驅(qū)動(dòng)程式和設(shè)備的控制晶片有關(guān)。例如,如果電腦硬碟是小型電腦系統(tǒng)介面(SmallComputerSystemInterface,SCSI)的硬碟,則需要使用SCSI驅(qū)動(dòng)程式,而不是IDE(IntegratedDriveElectronics)驅(qū)動(dòng)程式。1.2.4檔系統(tǒng)
Linux虛擬文件系統(tǒng)為用戶提供了一個(gè)一種公共的接口,而不需要了解物理設(shè)備或邏輯系統(tǒng)的細(xì)節(jié)。系統(tǒng)允許系統(tǒng)管理員將在任何物理設(shè)備上的邏輯文件系統(tǒng)掛接在文件目錄中。Linux支持幾種可執(zhí)行檔格式。
Linux的虛擬檔系統(tǒng)由五個(gè)模組組成:設(shè)備驅(qū)動(dòng)模組、設(shè)備獨(dú)立介面模組、邏輯檔系統(tǒng)模組、系統(tǒng)獨(dú)立介面模組和系統(tǒng)調(diào)用模組。
1.2.4檔系統(tǒng)
Linux虛擬檔系統(tǒng)為用戶提供了一個(gè)一種公共的介面,而不需要瞭解物理設(shè)備或邏輯系統(tǒng)的細(xì)節(jié)。系統(tǒng)允許系統(tǒng)管理員將在任何物理設(shè)備上的邏輯檔系統(tǒng)掛接在檔目錄中。Linux支持幾種可執(zhí)行檔格式。
Linux的虛擬檔系統(tǒng)由五個(gè)模組組成:設(shè)備驅(qū)動(dòng)模組、設(shè)備獨(dú)立介面模組、邏輯檔系統(tǒng)模組、系統(tǒng)獨(dú)立介面模組和系統(tǒng)調(diào)用模組。(1)設(shè)備驅(qū)動(dòng)模組:該模組和具體的設(shè)備控制器相關(guān)。Linux支持大量的設(shè)備控制程式。(2)設(shè)備獨(dú)立介面模組:該模組提供了一種一致的設(shè)備視圖。(3)邏輯檔系統(tǒng)模組:針對不同的檔系統(tǒng)都有一個(gè)對應(yīng)的邏輯檔系統(tǒng)模組。Linux主要採用EXT2(SecondExtendedFileSystem)檔系統(tǒng)。
1.2.4檔系統(tǒng)
(4)系統(tǒng)獨(dú)立介面模組:該模組提供了一種獨(dú)立於硬體和邏輯檔系統(tǒng)的統(tǒng)一視圖,它採用面向字元和麵向塊的檔介面來表示所有的資源。(5)系統(tǒng)介面模組:該模組限制了用戶對系統(tǒng)中功能的訪問保證了系統(tǒng)的安全。
1.2.5網(wǎng)路
TCP/IP協(xié)議是Internet的標(biāo)準(zhǔn)協(xié)議,同時(shí)也是事實(shí)上的工業(yè)標(biāo)準(zhǔn)。Linux的網(wǎng)路實(shí)現(xiàn)支持BSD套接字,支持全部的TCP/IP協(xié)議。Linux內(nèi)核的網(wǎng)路部分由BSD套接字、網(wǎng)路協(xié)議層和網(wǎng)路設(shè)備驅(qū)動(dòng)程式組成。
Linux網(wǎng)路介面子系統(tǒng)支持多種網(wǎng)路設(shè)備並支持各種網(wǎng)路協(xié)議,它將網(wǎng)路設(shè)備和協(xié)議的實(shí)現(xiàn)細(xì)節(jié)抽象化,使用戶不需要知道目前使用的網(wǎng)路設(shè)備和網(wǎng)路協(xié)議。
1.2.5網(wǎng)路Linux網(wǎng)路介面子系統(tǒng)由五個(gè)模組組成:網(wǎng)路設(shè)備驅(qū)動(dòng)模組、設(shè)備獨(dú)立介面模組、網(wǎng)路協(xié)議模組、協(xié)議獨(dú)立介面模組和系統(tǒng)調(diào)用介面模組。
1.2.5網(wǎng)路Linux網(wǎng)路介面子系統(tǒng)由五個(gè)模組組成:網(wǎng)路設(shè)備驅(qū)動(dòng)模組、設(shè)備獨(dú)立介面模組、網(wǎng)路協(xié)議模組、協(xié)議獨(dú)立介面模組和系統(tǒng)調(diào)用介面模組。(1)網(wǎng)路設(shè)備驅(qū)動(dòng)模組:該模組針對各種網(wǎng)路設(shè)備進(jìn)行編寫,它負(fù)責(zé)和硬體的通信工作。(2)設(shè)備獨(dú)立介面模組:該模組抽象了網(wǎng)路設(shè)備的實(shí)現(xiàn)細(xì)節(jié),為子系統(tǒng)上層模組提供了一個(gè)一致的設(shè)備視圖。(3)網(wǎng)路協(xié)議模組:該模組中每個(gè)都實(shí)現(xiàn)了相應(yīng)的網(wǎng)路傳輸協(xié)議。(4)網(wǎng)路協(xié)議獨(dú)立介面模組:該模組提供了一個(gè)與網(wǎng)路硬體和網(wǎng)路協(xié)議無關(guān)的介面,這樣內(nèi)核可以在一個(gè)統(tǒng)一的視圖下訪問網(wǎng)路。(5)系統(tǒng)調(diào)用模組:該模組限制了用戶進(jìn)程對子系統(tǒng)中各種功能的訪問。1.2.6其他
除上述主要組成部分之外,內(nèi)核還包含一些一般性的任務(wù)和機(jī)制,這些任務(wù)和機(jī)制可使Linux內(nèi)核的各個(gè)部分有效地組合在一起,它們是上述主要部分高效工作的必要保證。
Linux是單塊結(jié)構(gòu)的操作系統(tǒng)。為了可方便地在內(nèi)核中添加新的組件,Linux支持可動(dòng)態(tài)裝載和卸載的模組,這樣可方便地在內(nèi)核中添加新的組件或卸載不再需要的內(nèi)核組件。1.2.6其他Linux提供了多種進(jìn)程間的通信機(jī)制,其中,信號和管道是最基本的兩種。此外,Linux也提供SystemV的進(jìn)程間通信機(jī)制,包括消息佇列、信號燈及共用記憶體。為了支持不同機(jī)器之間的進(jìn)程通信,Linux還引入了BSD的Socket機(jī)制。1.2.6其他Linux提供了多種進(jìn)程間的通信機(jī)制,其中,信號和管道是最基本的兩種。此外,Linux也提供SystemV的進(jìn)程間通信機(jī)制,包括消息佇列、信號燈及共用記憶體。為了支持不同機(jī)器之間的進(jìn)程通信,Linux還引入了BSD的Socket機(jī)制。
Linux內(nèi)核採用了數(shù)據(jù)抽象技術(shù)。設(shè)備驅(qū)動(dòng)程式、檔和網(wǎng)路協(xié)議等模組都作為一個(gè)獨(dú)立的模組存在,並且它們都支持一種公共的介面。1.2.6其他Linux內(nèi)核還採用了分層的技術(shù),將那些於硬體相關(guān)的模組和其他模組嚴(yán)格地分離,因此當(dāng)系統(tǒng)移植到其他平臺(tái)時(shí),不需要對內(nèi)核做太大的修改。圖1.2說明了上述Linux內(nèi)核的重要組成部分及其相互關(guān)係。圖1.2Linux內(nèi)核的重要組成部分
用戶級程式
系統(tǒng)調(diào)用介面虛擬檔系統(tǒng)管理記憶體管理器進(jìn)程管理器抽象網(wǎng)路程式檔系統(tǒng)驅(qū)動(dòng)程式TCP/IP協(xié)議驅(qū)程IDE硬碟驅(qū)動(dòng)程式軟碟驅(qū)動(dòng)程式IDE硬碟軟碟以太網(wǎng)卡驅(qū)動(dòng)程式以太網(wǎng)卡1.3Linux內(nèi)核分析
所有主要Linux發(fā)行版本(如Craftworks,Debian、Slackware和Redhat)都包含了源碼在內(nèi)。Linux系統(tǒng)核心就是從這些源碼中構(gòu)造出來的。
Linux核心代碼的版本編號很簡單。任何偶數(shù)編號的核心(如2.0.30)都是穩(wěn)定的發(fā)行版而奇數(shù)編號的核心(如2.1.42)都是正在開發(fā)的核心。開發(fā)版的核心是試用版本,但具有最新的特徵並支持最新的設(shè)備。1.3.1核心源碼的組織
核心源碼的頂層是/usr/src/linux目錄,在此目錄下可以看到大量子目錄:
arch這個(gè)子目錄包含了所有體系結(jié)構(gòu)相關(guān)的核心代碼。它還包含每種支持的體系結(jié)構(gòu)的子目錄,如i386。
include這個(gè)目錄包括了用來重構(gòu)核心的大多數(shù)include檔。對於每種支持的體系結(jié)構(gòu)分別有一個(gè)子目錄。
init此目錄包含核心啟動(dòng)代碼。
mm此目錄包含了所有的記憶體管理代碼。與具體體系結(jié)構(gòu)相關(guān)的記憶體管理代碼位於arch/mm目錄下,例如arch/i386/mm/fault.c。
1.3.1核心源碼的組織drivers系統(tǒng)中所有的設(shè)備驅(qū)動(dòng)都位于該目錄中。它又進(jìn)一步劃分成幾類設(shè)備驅(qū)動(dòng),如block。
ipc此目錄包含了核心的進(jìn)程間通訊代碼。
modules此目錄僅僅包含已建好的模組。
fs所有的檔系統(tǒng)代碼。它也被劃分成對應(yīng)不同檔系統(tǒng)的子目錄,如vfat和ext2。
kernel主要核心代碼。同時(shí)與處理器結(jié)構(gòu)相關(guān)代碼都放在arch/kernel目錄下。
net核心的網(wǎng)路部分代碼。
lib此目錄包含了核心的庫代碼。與處理器結(jié)構(gòu)相關(guān)庫代碼被放在arch/lib/目錄下。
scripts此目錄包含用於配置核心的腳本檔(如awk和tk腳本)。1.3.2Linux內(nèi)核源代碼的組成
閱讀核心某個(gè)部分經(jīng)常要用到好幾個(gè)其他的相關(guān)檔,對於源代碼的閱讀,要想比較順利,事先最好對源代碼的知識背景有一定的瞭解。閱讀linux內(nèi)核源代碼的基本要求是:
1、操作系統(tǒng)的基本知識。
2、對C語言比較熟悉,最好要有組合語言的知識和GNUC對標(biāo)準(zhǔn)C的擴(kuò)展的知識的瞭解。另外,在閱讀之前還應(yīng)該知道Linux內(nèi)核源代碼的整體分佈情況。
Linux內(nèi)核源代碼的組成如下1系統(tǒng)啟動(dòng)與初始化在基於intel的系統(tǒng)上,Linux可以通過loadlin.exe或者LILO將核心載入記憶體並將控制傳遞給它。這部分程式位於arch/i386/kerneld/head.s。此檔完成一些處理器相關(guān)操作並跳轉(zhuǎn)到init/main.c中的main()例程。
2記憶體管理這部分代碼主要位於mm目錄裏,而與處理器結(jié)構(gòu)相關(guān)部分在arch/mm中。頁面出錯(cuò)處理代碼位於mm下的memory.c檔中,記憶體映射與頁面cache代碼位於filemap.c中。buffercache則在mm/buffer.c中實(shí)現(xiàn),swapcache位於mm/swap_state.c和mm/swapfile.c中。Linux內(nèi)核源代碼的組成3核心大多數(shù)通用代碼位於kernel目錄下,而處理器相關(guān)代碼被放在arch/kernel中。調(diào)度管理程式位於kernel/sched.c,fork代碼位於kernel/fork.c。底層部分處理及中斷處理的代碼位於include/linux/interrupt.h裏。在/linux/sched.h中可以找到task_struct的描敘。
4PCIPCI偽設(shè)備驅(qū)動(dòng)位於drivers/pci/pci.c且其系統(tǒng)通用定義放在include/linux/pci.h中。每個(gè)處理器結(jié)構(gòu)具有特殊的PCIBIOS代碼,AlphaAXP的位於arch/alpha/kernel/bios32.c中。Linux內(nèi)核源代碼的組成如下5進(jìn)程間通訊進(jìn)程間通訊所有代碼都在ipc目錄中。系統(tǒng)VIPC對象都包含一個(gè)ipc_perm結(jié)構(gòu),它在include/linux/ipc.h中描敘。系統(tǒng)V消息在ipc/msg.c中實(shí)現(xiàn),共用記憶體在ipc/shm.c而信號燈位於ipc/sem.c中。管道在ipc/pipe.c中實(shí)現(xiàn)。
6中斷處理核心的中斷處理代碼總是與微處理器結(jié)構(gòu)相關(guān)。Intel系統(tǒng)的中斷處理代碼位於arch/i386/kernel/irq.c中,其定義位於include/asm-i386/irq.h中。
Linux內(nèi)核源代碼的組成如下7設(shè)備驅(qū)動(dòng)
Linux核心源碼的大多數(shù)都是設(shè)備驅(qū)動(dòng)。所有Linux的設(shè)備驅(qū)動(dòng)源碼都放在drivers目錄中並分成以下幾類:
/block塊設(shè)備驅(qū)動(dòng)包括IDE(在ide.c中)驅(qū)動(dòng)。如果想尋找這些可包含檔系統(tǒng)的設(shè)備的初始化過程則應(yīng)該在drivers/block/genhd.c中的device_setup()。當(dāng)安裝一個(gè)nfs檔系統(tǒng)時(shí)不但要初始化硬碟還需初始化網(wǎng)路。塊設(shè)備包括IDE與SCSI設(shè)備。
/char此目錄包含字元設(shè)備的驅(qū)動(dòng),如ttys,串行口以及滑鼠。Linux內(nèi)核源代碼的組成7設(shè)備驅(qū)動(dòng)
Linux核心源碼的大多數(shù)都是設(shè)備驅(qū)動(dòng)。所有Linux的設(shè)備驅(qū)動(dòng)源碼都放在drivers目錄中並分成以下幾類:
/cdrom包含所有LinuxCDROM代碼。在這裏可以找到某些特殊的CDROM設(shè)備(如SoundblasterCDROM)。IDE介面的CD驅(qū)動(dòng)位於drivers/block/ide-cd.c中而SCSICD驅(qū)動(dòng)位於drivers/scsi/scsi.c中。
/pci它包含了PCI偽設(shè)備驅(qū)動(dòng)源碼。這裏可以找到關(guān)於PCI子系統(tǒng)映射與初始化的代碼。另外位於arch/alpha/kernel/bios32.c中的AlphaAXPPCI補(bǔ)丁代碼也值得一讀。
Linux內(nèi)核源代碼的組成7設(shè)備驅(qū)動(dòng)
Linux核心源碼的大多數(shù)都是設(shè)備驅(qū)動(dòng)。所有Linux的設(shè)備驅(qū)動(dòng)源碼都放在drivers目錄中並分成以下幾類:
/scsi這裏可以找到所有的SCSI代碼以及Linux支持的SCSI設(shè)備的設(shè)備驅(qū)動(dòng)。
/net包含網(wǎng)路驅(qū)動(dòng)源碼,如tulip.c中的DECChip21040PCI以太網(wǎng)驅(qū)動(dòng)。
/sound所有的聲卡驅(qū)動(dòng)源碼。
Linux內(nèi)核源代碼的組成8檔系統(tǒng)
EXT2檔系統(tǒng)的源碼位於fs/ext2中,其數(shù)據(jù)結(jié)構(gòu)定義位於include/linux/ext2_fs.h,ext2_fs_i.h以及ext2_fs_sb.h中。虛擬檔系統(tǒng)數(shù)據(jù)結(jié)構(gòu)在include/linux/fs.h中描敘且其代碼在fs//中。buffercache和update核心後臺(tái)進(jìn)程在fs/buffer.c中實(shí)現(xiàn)。
9網(wǎng)路網(wǎng)路代碼位於net目錄而大多數(shù)包含檔位於include/net中。BSD套介面代碼位於net/socket.c中。IPV4的INET套介面代碼位於net/ipv4/af_inet.c中。通用協(xié)議支撐代碼(包括sk_buff處理過程)位於net/core中,同時(shí)TCP/IP網(wǎng)路代碼位於net/ipv4中。網(wǎng)路設(shè)備驅(qū)動(dòng)位於drivers/net中。
Linux內(nèi)核源代碼的組成10核心模組核心模組代碼部分位於核心中部分位於modules包中。核心代碼位於kernel/modules.c且其數(shù)據(jù)結(jié)構(gòu)與核心後臺(tái)進(jìn)程kerneld消息位於include/linux/module.h和include/linux/kerneld.h目錄中。同時(shí)必要時(shí)需查閱include/linux/elf.h中的ELF檔格式。1.3.3Linux內(nèi)核分析方法
Linux的最大的優(yōu)點(diǎn)之一就是它的源碼公開。首先是可以從中學(xué)到很多的電腦的底層知識,如後面將講到的系統(tǒng)的引導(dǎo)和硬體提供的中斷機(jī)制等;其他,如虛擬存儲(chǔ)的實(shí)現(xiàn)機(jī)制、多任務(wù)機(jī)制、系統(tǒng)保護(hù)機(jī)制等等,這些都是非讀源碼不能體會(huì)的。其次是可以從操作系統(tǒng)的整體結(jié)構(gòu)中,體會(huì)整體設(shè)計(jì)在軟體設(shè)計(jì)中的份量和作用,以及一些宏觀設(shè)計(jì)的方法和技巧:Linux的內(nèi)核為上層應(yīng)用提供一個(gè)與具體硬體不相關(guān)的平臺(tái);同時(shí)在內(nèi)核內(nèi)部,它又把代碼分為與體系結(jié)構(gòu)和硬體相關(guān)的部分,和可移植的部分;再例如,Linux雖然不是微內(nèi)核的,但它把大部分的設(shè)備驅(qū)動(dòng)處理成相對獨(dú)立的內(nèi)核模組,這樣減小了內(nèi)核運(yùn)行的開銷,增強(qiáng)了內(nèi)核代碼的模組獨(dú)立性。
1.3.3Linux內(nèi)核分析方法
再是能從對內(nèi)核源碼的分析中,體會(huì)到它在解決某個(gè)具體細(xì)節(jié)問題時(shí)的巧妙方法,如Linux通過Botoom_half機(jī)制來加快系統(tǒng)對中斷的處理。最重要的是:在源碼的分析過程中,讀者將會(huì)被慢慢地、潛移默化地專業(yè)化。專業(yè)的程式員總是把代碼的清晰性,相容性,可移植性放在很重要的位置。1.3.3Linux內(nèi)核分析方法
然而,由於內(nèi)核代碼的冗長,和內(nèi)核體系結(jié)構(gòu)的龐雜,所以分析內(nèi)核也是一個(gè)很艱難、很需要毅力的事;在缺乏指導(dǎo)和交流的情況下尤其如此。只有方法正確,才能事半功倍。下麵介紹分析代碼時(shí)的幾種方法:
1.弄懂源碼的檔組織形式要分析Linux內(nèi)核源碼,首先必須找到各個(gè)模組的位置,即搞清楚源碼的檔組織形式。
2.以程式流程為線索,一線串珠第二種方法是“以程式流程為線索、一線串珠”,就是指根據(jù)程式的執(zhí)行流程,把程式執(zhí)行過程所涉及到的代碼分析清楚。這種方法最典型的應(yīng)用有兩個(gè):一是系統(tǒng)的初始化過程;二是應(yīng)用程式的執(zhí)行流程:從程式的裝載,到運(yùn)行,一直到程式的退出。
1.3.3Linux內(nèi)核分析方法
然而,由於內(nèi)核代碼的冗長,和內(nèi)核體系結(jié)構(gòu)的龐雜,所以分析內(nèi)核也是一個(gè)很艱難、很需要毅力的事;在缺乏指導(dǎo)和交流的情況下尤其如此。只有方法正確,才能事半功倍。下麵介紹分析代碼時(shí)的幾種方法:
3.以數(shù)據(jù)結(jié)構(gòu)為基點(diǎn),觸類旁通結(jié)構(gòu)化程式設(shè)計(jì)思想認(rèn)為:數(shù)據(jù)結(jié)構(gòu)+演算法=程式。數(shù)據(jù)結(jié)構(gòu)體現(xiàn)了整個(gè)系統(tǒng)的構(gòu)架,所以數(shù)據(jù)結(jié)構(gòu)通常都是代碼分析的很好的著手點(diǎn),對Linux內(nèi)核分析尤其如此。
4.以功能為中心,各個(gè)擊破從功能上看,整個(gè)Linux系統(tǒng)可看作由進(jìn)程管理機(jī)制、記憶體管理機(jī)制、檔系統(tǒng)、硬體驅(qū)動(dòng)、系統(tǒng)調(diào)用等幾個(gè)部分組成。以功能為中心、各個(gè)擊破,就是指從這五個(gè)功能入手,通過源碼分析,找出Linux是怎樣實(shí)現(xiàn)這些功能的。
1.3.3Linux內(nèi)核分析方法
然而,由於內(nèi)核代碼的冗長,和內(nèi)核體系結(jié)構(gòu)的龐雜,所以分析內(nèi)核也是一個(gè)很艱難、很需要毅力的事;在缺乏指導(dǎo)和交流的情況下尤其如此。只有方法正確,才能事半功倍。下麵介紹分析代碼時(shí)的幾種方法:
5.使用閱讀源代碼的工具和交叉參考網(wǎng)站分析核心的一部分代碼通常會(huì)要查看其他的幾個(gè)相關(guān)的檔,而且這些檔可能還不在同一個(gè)子目錄下,很快就會(huì)忘記原來在幹什麼。因此,沒有一個(gè)好的工具是不行的。由於大多數(shù)人常用Window系列平臺(tái),在此介紹一個(gè)Window下的一個(gè)閱讀源代碼的工具:SourceInsight。該軟體可以從因特網(wǎng)下載。思考與練習(xí)
1.什麼是操作系統(tǒng)?它有哪些基本功能與基本特徵?
2.怎樣理解“操作系統(tǒng)本身是一個(gè)併發(fā)系統(tǒng)”?
3.什麼是批處理、即時(shí)、分時(shí)系統(tǒng)?它們有什麼特徵?各適用哪些場合?
4網(wǎng)路操作系統(tǒng)最基本的功能是什麼?它最使你感興趣的是什麼?
2.1操作系統(tǒng)的啟動(dòng)
一般來說,操作系統(tǒng)的引導(dǎo)過程分兩個(gè)步驟。首先,電腦硬體經(jīng)過開機(jī)自檢(PowerOnSelf-Test,POST)之後,從軟碟或硬碟的固定位置裝載一小段代碼,這段代碼一般稱為“引導(dǎo)裝載器”。然後,由引導(dǎo)裝載器負(fù)責(zé)裝入並運(yùn)行操作系統(tǒng)。引導(dǎo)裝載器非常小,一般只有幾百個(gè)位元組,而操作系統(tǒng)龐大而複雜。上述分成兩階段的引導(dǎo)過程,可將電腦中的固化軟體保持得足夠小,同時(shí)也便於實(shí)現(xiàn)對不同操作系統(tǒng)的引導(dǎo)。2.1.1系統(tǒng)引導(dǎo)過程簡介
系統(tǒng)啟動(dòng)過程主要由以下幾個(gè)步驟組成(以硬碟啟動(dòng)為例):(1)開機(jī)(2)BIOS加電自檢(PowerOnSelfTest,POST),記憶體地址為0ffff:0000(3)將硬碟第一個(gè)扇區(qū)(0頭0道1扇區(qū),也就是BootSector)讀入記憶體地址0000:7c00處。(4)檢查(WORD)0000:7dfe是否等於0xaa55,若不等於則轉(zhuǎn)去嘗試其他啟動(dòng)介質(zhì),如果沒有其他啟動(dòng)介質(zhì)則顯示"NoROMBASIC"然後死機(jī)。(5)跳轉(zhuǎn)到0000:7c00處執(zhí)行MBR中的程式。(6)MBR首先將自己複製到0000:0600處,然後繼續(xù)執(zhí)行。(7)在主分區(qū)表中搜索標(biāo)誌為活動(dòng)的分區(qū)。如果發(fā)現(xiàn)沒有活動(dòng)分區(qū)或有不止一個(gè)活動(dòng)分區(qū),則停止。(8)將活動(dòng)分區(qū)的第一個(gè)扇區(qū)讀入記憶體地址0000:7c00處。(9)檢查(WORD)0000:7dfe是否等於0xaa55,若不等於則顯示"MissingOperatingSystem"然後停止,或嘗試軟碟啟動(dòng)。(10)跳轉(zhuǎn)到0000:7c00處繼續(xù)執(zhí)行特定系統(tǒng)的啟動(dòng)程式。(11)啟動(dòng)系統(tǒng)。以上步驟中2,3,4,5步是由BIOS的引導(dǎo)程式完成。6,7,8,9,10步由MBR中的引導(dǎo)程式完成。一般多系統(tǒng)引導(dǎo)程式(如SmartBootManager、BootStar、PQBoot等)都是將標(biāo)準(zhǔn)主引導(dǎo)記錄替換成自己的引導(dǎo)程式,在運(yùn)行系統(tǒng)啟動(dòng)程式之前讓用戶選擇要啟動(dòng)的分區(qū)。而某些系統(tǒng)自帶的多系統(tǒng)引導(dǎo)程式(如LILO,NTLoader等)則可以將自己的引導(dǎo)程式放在系統(tǒng)所處分區(qū)的第一個(gè)扇區(qū)中,在Linux中即為是兩個(gè)扇區(qū)的SuperBlock。注:以上各步驟中使用的是標(biāo)準(zhǔn)MBR,其他多系統(tǒng)引導(dǎo)程式的引導(dǎo)過程與此不同。2.1.2硬碟結(jié)構(gòu)
1.硬碟參數(shù)當(dāng)硬碟的容量還非常小的時(shí)候,人們採用與軟碟類似的結(jié)構(gòu)生產(chǎn)硬碟。硬碟盤片的每一條磁軌都具有相同的扇區(qū)數(shù)。由此產(chǎn)生了所謂的3D參數(shù)(DiskGeometry)以及相應(yīng)的尋址方式。到目前為止,通常還是沿用這種CHS(Cylinder/Head/Sector)來表示硬碟參數(shù)。其中:磁頭數(shù)(Heads)表示硬碟總共有幾個(gè)磁頭,也就是有幾面盤片,最大為256(用8個(gè)二進(jìn)位位存儲(chǔ));柱面數(shù)(Cylinders)表示硬碟每一面盤片上有幾條磁軌,最大為1024(用10個(gè)二進(jìn)位位存儲(chǔ));扇區(qū)數(shù)(Sectorspertrack)表示每一條磁軌上有幾個(gè)扇區(qū),最大為63(用6個(gè)二進(jìn)位位存儲(chǔ))。每個(gè)扇區(qū)一般是512個(gè)位元組。2.基本INT13H調(diào)用簡介
BIOSint13H調(diào)用是BIOS提供的磁片基本輸入輸出中斷調(diào)用,它可以完成磁片(包括硬碟和軟碟)的複位、讀寫、校驗(yàn)、定位、診斷和格式化等功能。它使用的是CHS尋址方式,因此最大只能訪問8GB左右的硬碟(本文中如不作特殊說明,均以1M=1048576位元組為單位)。3.現(xiàn)代硬碟結(jié)構(gòu)簡介在老式硬碟中,由於每個(gè)磁軌的扇區(qū)數(shù)相等,所以外道的記錄密度要遠(yuǎn)低於內(nèi)道,因此會(huì)浪費(fèi)很多磁片空間。為了進(jìn)一步提高硬碟容量,人們改用等密度結(jié)構(gòu)生產(chǎn)硬碟。也就是說,外圈磁軌的扇區(qū)比內(nèi)圈磁軌多。採用這種結(jié)構(gòu)後,硬碟不再具有實(shí)際的3D參數(shù),尋址方式也改為線性尋址,即以扇區(qū)為單位進(jìn)行尋址。為了與使用3D尋址的老軟體相容(如使用BIOSINT13H介面的軟體),在硬碟控制器內(nèi)部安裝了一個(gè)地址翻譯器,由它負(fù)責(zé)將老式3D參數(shù)翻譯成新的線性參數(shù)。不同的工作模式(如LBA、LARGE、NORMAL)對應(yīng)不同的3D參數(shù)。4.擴(kuò)展INT13H
雖然現(xiàn)代硬碟都已經(jīng)採用了線性尋址,但是由於基本INT13H的制約,使用BIOS的INT13H介面的程式(如DOS等)還只能訪問8G以內(nèi)的硬碟空間。為了打破這一限制,Microsoft等幾家公司制定了擴(kuò)展INT13H標(biāo)準(zhǔn)(ExtendedINT13H),採用線性尋址方式存取硬碟,突破了8G的限制,並還加入了對可拆卸介質(zhì)(如活動(dòng)硬碟)的支持。2.1.3引導(dǎo)扇區(qū)
1.BootSector的組成
BootSector也就是硬碟的第一個(gè)扇區(qū),它由MBR(MasterBootRecord),DPT(DiskPartitionTable)和BootRecordID三部分組成。MBR又稱作主引導(dǎo)記錄,佔(zhàn)用BootSector的前446個(gè)位元組(0to0x1BD),存放系統(tǒng)主引導(dǎo)程式(它負(fù)責(zé)從活動(dòng)分區(qū)中裝載並運(yùn)行系統(tǒng)引導(dǎo)程式)。DPT即主分區(qū)表佔(zhàn)用64個(gè)位元組(0x1BEto0x1FD),記錄了磁片的基本分區(qū)資訊。主分區(qū)表分為四個(gè)分區(qū)項(xiàng),每項(xiàng)16位元組,分別記錄了每個(gè)主分區(qū)的資訊(因此最多可以有四個(gè)主分區(qū))。BootRecordID即引導(dǎo)區(qū)標(biāo)記佔(zhàn)用兩個(gè)位元組(0x1FEand0x1FF),對於合法引導(dǎo)區(qū),它等於0xAA55,這是判別引導(dǎo)區(qū)是否合法的標(biāo)誌。BootSector的具體結(jié)構(gòu)如下圖所示:2.分區(qū)表結(jié)構(gòu)簡介分區(qū)表由四個(gè)分區(qū)項(xiàng)構(gòu)成,每一項(xiàng)的結(jié)構(gòu)如下:BYTEState:分區(qū)狀態(tài),0=未啟動(dòng),0x80=啟動(dòng)(注意此項(xiàng))BYTEStartHead:分區(qū)起始磁頭號WORDStartSC:分區(qū)起始扇區(qū)和柱面號,底字節(jié)的低6位為扇區(qū)號,高2位為柱面號的第9,10位,高位元組為柱面號的低8位BYTEType:分區(qū)類型,如0x0B=FAT32,0x83=Linux等,00表示此項(xiàng)未用BYTEEndHead:分區(qū)結(jié)束磁頭號WORDEndSC:分區(qū)結(jié)束扇區(qū)和柱面號,定義同前DWORDRelative:線上性尋址方式下的分區(qū)相對扇區(qū)地址(對於基本分區(qū)即為絕對地址)DWORDSectors:分區(qū)大小(總扇區(qū)數(shù))
在DOS/Windows系統(tǒng)下,基本分區(qū)必須以柱面為單位劃分(Sectors*Heads個(gè)扇區(qū)),如對於CHS為764/256/63的硬碟,分區(qū)的最小尺寸為256*63*512/1048576=7.875MB。由於硬碟的第一個(gè)扇區(qū)已經(jīng)被引導(dǎo)扇區(qū)佔(zhàn)用,所以一般來說,硬碟第一個(gè)磁軌(0頭0道)的其餘62個(gè)扇區(qū)是不會(huì)被分區(qū)佔(zhàn)用的。某些分區(qū)軟體甚至將第一個(gè)柱面全部空出來。3.擴(kuò)展分區(qū)由於主分區(qū)表中只能分四個(gè)分區(qū),無法滿足需求,因此設(shè)計(jì)了一種擴(kuò)展分區(qū)格式。基本上說,擴(kuò)展分區(qū)的資訊是以鏈表形式存放的,但也有一些特別的地方。
首先,主分區(qū)表中要有一個(gè)基本擴(kuò)展分區(qū)項(xiàng),所有擴(kuò)展分區(qū)都隸屬於它,也就是說其他所有擴(kuò)展分區(qū)的空間都必須包括在這個(gè)基本擴(kuò)展分區(qū)中。對於DOS/Windows來說,擴(kuò)展分區(qū)的類型為0x05或0x0F(LBA模式)。除基本擴(kuò)展分區(qū)以外的其他所有擴(kuò)展分區(qū)則以鏈表的形式級聯(lián)存放,後一個(gè)擴(kuò)展分區(qū)的資料項(xiàng)目記錄在前一個(gè)擴(kuò)展分區(qū)的分區(qū)表中,但兩個(gè)擴(kuò)展分區(qū)的空間並不重疊。
擴(kuò)展分區(qū)類似於一個(gè)完整的硬碟,必須進(jìn)一步分區(qū)才能使用。但每個(gè)擴(kuò)展分區(qū)中只能存在一個(gè)其他分區(qū)。此分區(qū)在DOS/Windows環(huán)境中即為邏輯盤。因此每一個(gè)擴(kuò)展分區(qū)的分區(qū)表(同樣存儲(chǔ)在擴(kuò)展分區(qū)的第一個(gè)扇區(qū)中)中最多只能有兩個(gè)分區(qū)資料項(xiàng)目(包括下一個(gè)擴(kuò)展分區(qū)的資料項(xiàng)目)。以上所有擴(kuò)展分區(qū)表中的第二個(gè)分區(qū)項(xiàng)(指向下一個(gè)擴(kuò)展分區(qū))的相對扇區(qū)地址均相對於主擴(kuò)展分區(qū),而不是前一個(gè)擴(kuò)展分區(qū)。
2.2Linux的引導(dǎo)過程
不同電腦平臺(tái)引導(dǎo)過程的區(qū)別主要在於第一階段的引導(dǎo)過程。對PC機(jī)上的Linux系統(tǒng)而言,電腦(即BIOS)負(fù)責(zé)從軟碟或硬碟的第一個(gè)扇區(qū)(即引導(dǎo)扇區(qū))中讀取引導(dǎo)裝載器,然後,由引導(dǎo)裝載器從磁片或其他位置裝入操作系統(tǒng)。從軟碟引導(dǎo)時(shí),BIOS讀取並運(yùn)行引導(dǎo)扇區(qū)中的代碼。引導(dǎo)扇區(qū)中的代碼讀取軟碟前幾百個(gè)塊(依賴於實(shí)際的內(nèi)核大小),然後將這些代碼放置在預(yù)先定義好的記憶體位置。利用軟碟引導(dǎo)Linux時(shí),沒有檔系統(tǒng),內(nèi)核處於連續(xù)的扇區(qū)中,這樣安排可簡化引導(dǎo)過程。但是,如果利用LILO(LInuxLOader)也可從包含檔系統(tǒng)的軟碟上引導(dǎo)Linux。
從硬碟引導(dǎo)時(shí),由於硬碟是可分區(qū)的,因此引導(dǎo)過程比軟碟複雜一些。BIOS首先讀取並運(yùn)行硬碟主引導(dǎo)記錄中的代碼,這些代碼首先檢驗(yàn)主引導(dǎo)記錄中的分區(qū)表,尋找到活動(dòng)分區(qū)(即標(biāo)誌為可引導(dǎo)分區(qū)的分區(qū)),然後讀取並運(yùn)行活動(dòng)分區(qū)之引導(dǎo)扇區(qū)中的代碼。活動(dòng)分區(qū)引導(dǎo)扇區(qū)的作用和軟碟引導(dǎo)扇區(qū)的作用一樣:從分區(qū)中讀取內(nèi)核映象並啟動(dòng)內(nèi)核。和軟碟引導(dǎo)不同的是,內(nèi)核映象保存在硬碟分區(qū)檔系統(tǒng)中,而不象軟碟那樣保存在後續(xù)的連續(xù)扇區(qū)中,因此,硬碟引導(dǎo)扇區(qū)中的代碼還需要定位內(nèi)核映象在檔系統(tǒng)中的位置,然後裝載內(nèi)核並啟動(dòng)內(nèi)核。Linux系統(tǒng)的常見引導(dǎo)方式有兩種:LILO引導(dǎo)和Loadin引導(dǎo);其中LILO可實(shí)現(xiàn)多重引導(dǎo),Loadin可在DOS下引導(dǎo)Linux。此外,Linux內(nèi)核也自帶了一個(gè)bootsect-loader。由於bootsect-loader只能實(shí)現(xiàn)Linux的引導(dǎo),不像前兩個(gè)那樣具有很大的靈活性,所以在普通應(yīng)用場合實(shí)際上很少使用。但由於bootsect-loader短小、沒有多餘的代碼、並且是內(nèi)核源碼的有機(jī)組成部分。下麵將主要對bootsect-loader檔進(jìn)行分析。bootsect-loader在內(nèi)和源碼中對應(yīng)的程式是/arch/i386/boot/bootsect.s。幾個(gè)相關(guān)檔是:(1)/arch/i386/boot/bootsect.s(2)/include/linux/config.h(3)/include/asm/boot.h(4)/include/linux/autoconf.h2.2.1Linux系統(tǒng)引導(dǎo)過程分析
開啟Intelx86PC的電源後,機(jī)器就會(huì)開始執(zhí)行ROMBIOS的一系列系統(tǒng)測試動(dòng)作,包括檢查RAM、鍵盤、顯示器和軟硬磁片等。接著控制權(quán)轉(zhuǎn)移給ROM中的啟動(dòng)程式(ROMbootstraproutine);該程式會(huì)將磁片上的第0軌第0扇區(qū)(稱為bootsector或MasterBootRecord,MBR,系統(tǒng)的引導(dǎo)程式就放在此處)讀入記憶體,放入自0x07C0:0x0000開始的512個(gè)位元組處;然後處理機(jī)跳轉(zhuǎn)到該處開始執(zhí)行(位於該處的)MBR引導(dǎo)程式,CS:IP=0x07C0:0x0000。加電後處理機(jī)運(yùn)行在與8086相相容的實(shí)模式下。如果要用bootsect-loader進(jìn)行系統(tǒng)引導(dǎo),則必須把bootsect.s編譯連接後對應(yīng)的二進(jìn)位代碼置於MBR;當(dāng)ROMBIOS把bootsect.s編譯連接後對應(yīng)的二進(jìn)位代碼裝入記憶體後,機(jī)器的控制權(quán)就完全轉(zhuǎn)交給bootsect;也就是說,bootsect將是第一個(gè)被讀入記憶體中並執(zhí)行的程式。Bootsect接管機(jī)器控制權(quán)後,將依次進(jìn)行以下一些動(dòng)作:(1)首先,bootsect將它“自己”(自位置0x07C0:0x0000開始的512個(gè)位元組)從被ROMBIOS載入的地址0x07C0:0x0000處搬到0x9000:0000處;這一任務(wù)由bootsect.s的前十條指令完成;第十一條指令“jmpigo,INITSEG”則把機(jī)器跳轉(zhuǎn)到“新”的bootsect的“jmpigo,INITSEG”後的那條指令“go:movdi,#0x4000-12”;之後,繼續(xù)執(zhí)行bootsect的剩下的代碼;在bootsect.s中定義了幾個(gè)常量:BOOTSEG=0x07C0bios載入MBR的約定位置的段址;INITSEG=0x9000bootsect.s的前十條指令將自己搬到此處(段址)SETUPSEG=0x9020裝入Setup.s的段址SYSSEG=0x1000系統(tǒng)區(qū)段址這些常量的定義可參見/include/asm/boot.h;在下面的分析中這些常量會(huì)經(jīng)常用到。(2)以0x9000:0x4000-12為棧底,建立自己的棧區(qū);其中0x9000:0x4000-12到0x9000:0x4000的一十二個(gè)位元組預(yù)留作磁片參數(shù)表區(qū);(3)在0x9000:0x4000-12到0x9000:0x4000的一十二個(gè)預(yù)留位元組中建立新的磁片參數(shù)表。由於設(shè)計(jì)者考慮到有些老的bios不能準(zhǔn)確地識別磁片每個(gè)磁軌的扇區(qū)數(shù),使得bios建立的磁片參數(shù)表妨礙磁片的最高性能發(fā)揮,所以設(shè)計(jì)者在bios建立的磁片參數(shù)表的基礎(chǔ)上使用枚舉法測試,試圖建立準(zhǔn)確的“新”的磁片參數(shù)表(這是在後繼步驟中完成的);並把參數(shù)表的位置由原來的0x0000:0x0078搬到0x9000:0x4000-12;且修改老的磁片參數(shù)表區(qū)使之指向新的磁片參數(shù)表;(4)接下來是load_setup子過程;它調(diào)用0x13中斷的第2號服務(wù);把第0道第2扇區(qū)開始的連續(xù)的setup_sects(為常量4)個(gè)扇區(qū)讀到緊鄰bootsect的記憶體區(qū);,即0x9000:0x0200開始的2048個(gè)位元組;而這四個(gè)扇區(qū)的內(nèi)容就是/arch/i386/boot/setup.s編譯連接後對應(yīng)的二進(jìn)位代碼。換句話說,如果要用bootsect-loader進(jìn)行系統(tǒng)引導(dǎo),不僅必須把bootsect.s編譯連接後對應(yīng)的二進(jìn)位代碼置於MBR,而且還要將\把setup.s編譯連接後對應(yīng)的二進(jìn)位代碼置於緊跟MBR後的連續(xù)的四個(gè)扇區(qū)中。由於setup.s對應(yīng)的可執(zhí)行碼是由bootsect裝載的,所以可以根據(jù)需要修改bootsect來設(shè)置setup.s對應(yīng)的可執(zhí)行碼;(5)load_setup子過程的惟一出口是probe_loop子過程;該過程通過枚舉法測試磁片“每個(gè)磁軌的扇區(qū)數(shù)”;(6)接下來幾個(gè)子過程比較清晰:顯示“Loading”;讀入系統(tǒng)到0x1000:0x0000;關(guān)掉軟驅(qū)馬達(dá);根據(jù)的5步測出的“每個(gè)磁軌的扇區(qū)數(shù)”確定磁片類型;最後跳轉(zhuǎn)到0x9000:0x0200,即setup.s對應(yīng)的可執(zhí)行碼的入口,將機(jī)器控制權(quán)轉(zhuǎn)交setup.s;整個(gè)bootsect代碼運(yùn)行完畢。引導(dǎo)過程執(zhí)行完後的記憶體映像圖如圖2.3所示。完成了系統(tǒng)的引導(dǎo)後,系統(tǒng)將進(jìn)入到初始化處理階段。系統(tǒng)的初始化分為實(shí)模式和保護(hù)模式兩部分。為了簡單起見,在上面的分析中,忽略了對大內(nèi)核的處理的分析。因?yàn)閷Υ髢?nèi)核的處理,只是此引導(dǎo)過程中的一個(gè)很小的部分,並不影響對整體的把握。2.2.2實(shí)模式下的初始化
實(shí)模式下的初始化,主要是指從內(nèi)核引導(dǎo)成功後,到進(jìn)入保護(hù)模式之前系統(tǒng)所做的一些處理。在內(nèi)核源碼中對應(yīng)的程式是/arch/i386/boot/setup.s;以下部分主要對該檔進(jìn)行分析。這部分的分析要弄懂它的處理流程和INITSEG(9000:0000)段參數(shù)表的建立的過程。該參數(shù)表包含了很多硬體參數(shù),這些都是以後進(jìn)行保護(hù)模式下初始化以及核心建立的基礎(chǔ)。相關(guān)檔有:
/arch/i386/boot/bootsect.s/include/linux/config.h/include/asm/boot.h /include/asm/segment.h/include/linux/version.h/include/linux/compile.h
setup.s完成在實(shí)模式下版本檢查,並將硬碟、滑鼠及記憶體的參數(shù)寫入到INITSEG中,並負(fù)責(zé)進(jìn)入保護(hù)模式。實(shí)模式下的初始化過程如圖2.4及圖2.5所示:
圖2.4實(shí)模式下的初始化過程1圖2.5實(shí)模式下的初始化過程2表2.1INITSEG(9000:0000)段參數(shù)表:(參見include/linux/tty.h)參數(shù)名偏移量(段址均為0x9000)長度Byte參考檔PARAM_CURSOR_POS0x00002arch/i386/boot/video.sextendedmemSize0x00022arch/i386/boot/setup.sPARAM_VIDEO_PAGE0x00042arch/i386/boot/video.sPARAM_VIDEO_MODE0x00061arch/i386/boot/video.sPARAM_VIDEO_COLS0x00071arch/i386/boot/video.s未用0x00082include/linux/tty.hPARAM_VIDEO_EGA_BX0x000a2arch/i386/boot/video.s未用0x000c2include/linux/tty.hPARAM_VIDEO_LINES0x000e1arch/i386/boot/video.sPARAM_HAVE_VGA0x000f1arch/i386/boot/video.sPARAM_FONT_POINTS0x00102arch/i386/boot/video.sPARAM_LFB_WIDTH0x00122arch/i386/boot/video.sPARAM_LFB_HEIGHT0x00142arch/i386/boot/video.sPARAM_LFB_DEPTH0x00162arch/i386/boot/video.sPARAM_LFB_BASE0x00184arch/i386/boot/video.sPARAM_LFB_SIZE0x001c4arch/i386/boot/video.s暫未用①0x00204include/linux/tty.hPARAM_LFB_LINELENGTH0x00242arch/i386/boot/video.sPARAM_LFB_COLORS0x00266arch/i386/boot/video.s暫未用②0x002c2arch/i386/boot/video.sPARAM_VESAPM_SEG0x002e2arch/i386/boot/video.sPARAM_VESAPM_OFF0x00302arch/i386/boot/video.sPARAM_LFB_PAGES0x00322arch/i386/boot/video.s保留0x0034--0x003f
include/linux/tty.hAPMBIOSVersion③0x00402arch/i386/boot/setup.sBIOScodesegment0x00422arch/i386/boot/setup.sBIOSentryoffset0x00444arch/i386/boot/setup.sBIOS16bitcodeseg0x00482arch/i386/boot/setup.sBIOSdatasegment0x004a2arch/i386/boot/setup.s支持32位標(biāo)誌④0x004c2arch/i386/boot/setup.sBIOScodeseglength0x004e4arch/i386/boot/setup.sBIOSdataseglength0x00522arch/i386/boot/setup.shd0參數(shù)0x008016arch/i386/boot/setup.shd0參數(shù)0x009016arch/i386/boot/setup.sPS/2device標(biāo)誌⑤0x01ff1arch/i386/boot/setup.s
注:①include/linux/tty.h:CL_MAGICandCL_OFFSEThere②include/linux/tty.h:unsignedcharrsvd_size;//0x2cunsignedcharrsvd_pos;//0x2d③0表示沒有電源管理(APM)BIOS④0x0002置位表示支持32位模式⑤0表示沒有,0x0aa表示有滑鼠器2.2.3保護(hù)模式下的初始化
保護(hù)模式下的初始化,是指處理機(jī)進(jìn)入保護(hù)模式後到運(yùn)行系統(tǒng)第一個(gè)內(nèi)核程式過程中,系統(tǒng)所做的一些處理。保護(hù)模式下的初始化在內(nèi)核源碼中對應(yīng)的程式是/arch/i386/boot/compressed/head.s和/arch/i386/kernel/head.s;以下部分主要是針對這兩個(gè)檔進(jìn)行的分析。在i386體系結(jié)構(gòu)中,因?yàn)閕386本身的問題,在"arch/alpha/kernel/head.s"中需要更多的設(shè)置,最終是通過callSYMBOL_NAME(start_kernel)轉(zhuǎn)到start_kernel()這個(gè)體系結(jié)構(gòu)無關(guān)的函數(shù)中去執(zhí)行了。
在i386系統(tǒng)中,當(dāng)內(nèi)核以bzImage的形式壓縮,即大內(nèi)核方式(BIG_KERNEL)壓縮時(shí)就需要預(yù)先處理bootsect.s和setup.s,按照大核模式使用$(CPP)處理生成bbootsect.s和bsetup.s,然後再編譯生成相應(yīng)的.o檔,並使用"arch/i386/boot/compressed/build.c"生成的build工具,將實(shí)際的內(nèi)核(未壓縮的,含kernel中的head.s代碼)與"arch/i386/boot/compressed"下的head.s和misc.c合成到一起,其中的head.s代替了"arch/i386/kernel/head.s"的位置,由Bootloader引導(dǎo)執(zhí)行(startup_32入口),然後它調(diào)用misc.c中定義的decompress_kernel()函數(shù),使用"lib/inflate.c"中定義的gunzip()將內(nèi)核解壓到0x100000,再轉(zhuǎn)到其上執(zhí)行"arch/i386/kernel/head.s"中的startup_32代碼。幾個(gè)有關(guān)檔是:/arch/i386/boot/compressed/head.s/arch/i386/kernel/head.s//arch/i386/boot/compressed/MISC.c/arch/i386/boot/setup.s/include/asm/segment.h/arch/i386/kernel/traps.c/include/i386/desc.h/include/asm-i386/processor.h保護(hù)模式下的初始化過程大致如下:1./arch/i386/kernel/head.s流程因?yàn)樵趕etup.s最後的是一條轉(zhuǎn)跳指令,跳到內(nèi)核第一條指令並開始執(zhí)行。指令中指向的是記憶體中的絕對地址,無法依此判斷轉(zhuǎn)跳到了head.s。但是可以通過Makefile簡單的確定head.s位於內(nèi)核的前端。在arch/i386的Makefile中定義了HEAD:=arch/i386/kernel/head.o
在Linux總的Makefile中的語句includearch/$(ARCH)/Makefile說明HEAD定義在該檔中有效。由如下語句:vmlinux:$(CONFIGURATION)init/main.oinit/version.olinuxsubdirs$(LD)$(LINKFLAGS)$(HEAD)init/main.oinit/version.o\$(ARCHIVES)\$(FILESYSTEMS)\$(DRIVERS)\$(LIBS)-ovmlinux$(NM)vmlinux|grep-v'\(compiled\)\|\(\.o$$\)\|\(a\)'|sort>System.map從這個(gè)依賴關(guān)係可以獲得大量的資訊:(1)$(HEAD)即head.o
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 藝術(shù)品租賃合同
- 會(huì)議場地租賃合同協(xié)議書
- 保密協(xié)議商業(yè)合同
- 無錫工藝職業(yè)技術(shù)學(xué)院《工程安全健康與環(huán)境管理》2023-2024學(xué)年第二學(xué)期期末試卷
- 寧夏民族職業(yè)技術(shù)學(xué)院《賓館酒店管理》2023-2024學(xué)年第二學(xué)期期末試卷
- 菏澤家政職業(yè)學(xué)院《輕工行業(yè)清潔生產(chǎn)及污染控制技術(shù)》2023-2024學(xué)年第二學(xué)期期末試卷
- Unit 5 Revealing Nature Developing ideas The Secret Language of Plants教學(xué)設(shè)計(jì) 2024-2025學(xué)年高中英語人教版選擇性必修第二冊
- 沈陽醫(yī)學(xué)院《機(jī)器人工程專業(yè)導(dǎo)論》2023-2024學(xué)年第二學(xué)期期末試卷
- 寧夏財(cái)經(jīng)職業(yè)技術(shù)學(xué)院《主題閱讀(1)》2023-2024學(xué)年第二學(xué)期期末試卷
- 山東勝利職業(yè)學(xué)院《化工原理一》2023-2024學(xué)年第二學(xué)期期末試卷
- 2025年云南省昆明國家高新技術(shù)產(chǎn)業(yè)開發(fā)區(qū)招聘合同聘用制專業(yè)技術(shù)人員47人歷年高頻重點(diǎn)模擬試卷提升(共500題附帶答案詳解)
- 1.1青春的邀約 教學(xué)課件 2024-2025學(xué)年七年級道德與法治下冊(統(tǒng)編版2024)
- 《1億有多大》(說課稿)-2024-2025學(xué)年四年級上冊數(shù)學(xué)人教版001
- DeepSeek從入門到精通 -指導(dǎo)手冊
- 2025年蘇州經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院高職單招職業(yè)技能測試近5年常考版參考題庫含答案解析
- 衰老細(xì)胞代謝重編程-洞察分析
- 化工開停車培訓(xùn)
- 2024年財(cái)政部會(huì)計(jì)法律法規(guī)答題活動(dòng)題目及答案一
- 貨物學(xué) 課件1.1貨物的基本概念與內(nèi)涵
- 2024年01月廣州期貨交易所2024年招考筆試歷年參考題庫附帶答案詳解
- (2024年)中國傳統(tǒng)文化介紹課件
評論
0/150
提交評論