linux進(jìn)程管理_第1頁
linux進(jìn)程管理_第2頁
linux進(jìn)程管理_第3頁
linux進(jìn)程管理_第4頁
linux進(jìn)程管理_第5頁
已閱讀5頁,還剩80頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

Linux進(jìn)程管理 24 04 2020 2 Linux操作系統(tǒng) Linux是一個(gè)多用戶 多任務(wù)的操作系統(tǒng) 這就意味著多個(gè)用戶可以同時(shí)使用一個(gè)操作系統(tǒng) 而每個(gè)用戶又可以同時(shí)運(yùn)行多個(gè)命令 在這樣的系統(tǒng)中 各種計(jì)算機(jī)資源 如文件 內(nèi)存 CPU等 的分配和管理都以進(jìn)程為單位 為了協(xié)調(diào)多個(gè)進(jìn)程對這些共享資源的訪問 操作系統(tǒng)要跟蹤所有進(jìn)程的活動(dòng) 以及它們對系統(tǒng)資源的使用情況 實(shí)施對進(jìn)程和資源的動(dòng)態(tài)管理 24 04 2020 3 Linux的進(jìn)程及其狀態(tài) 在Linux系統(tǒng)中 進(jìn)程 Process 和任務(wù) Task 是同一個(gè)意思 所以 在內(nèi)核的代碼中 這兩個(gè)名詞常?;煊?Linux進(jìn)程狀態(tài)在Linux系統(tǒng)中 進(jìn)程有以下幾個(gè)狀態(tài) 運(yùn)行態(tài) TASK RUNNING 0 此時(shí) 進(jìn)程正在運(yùn)行 即系統(tǒng)的當(dāng)前進(jìn)程 或者準(zhǔn)備運(yùn)行 即就緒態(tài) 等待態(tài)此時(shí)進(jìn)程在等待一個(gè)事件的發(fā)生或某種系統(tǒng)資源 Linux系統(tǒng)分為兩種等待進(jìn)程 可中斷的 TASK INTERRUPTIBLE 1 和不可中斷的 TASK UNINTERRUPTIBLE 2 可中斷的等待進(jìn)程可以被某一信號 Signal 中斷 而不可中斷的等待進(jìn)程不受信號的打擾 將一直等待硬件狀態(tài)的改變停止態(tài) TASK STOPPED 4 進(jìn)程被停止 通常是通過接收一個(gè)信號 正在被調(diào)試的進(jìn)程可能處于停止?fàn)顟B(tài)僵死態(tài) TASK ZOMBIE 3 由于某些原因被終止的進(jìn)程 但是該進(jìn)程的控制結(jié)構(gòu)task struct仍然保留著 24 04 2020 4 Linux進(jìn)程狀態(tài)轉(zhuǎn)換 停止態(tài)TASK STOPPED 正在運(yùn)行態(tài)擁有cpu 就緒態(tài)Task runing 僵死態(tài)TASK ZOMBIE 不可中斷等待態(tài)TASK UNINTERRUPTIBLE 可中斷等待態(tài)TASK INTERRUPTIBLE 進(jìn)程終止do exit 時(shí)間片到 進(jìn)程調(diào)度schedule 進(jìn)程跟蹤系統(tǒng)調(diào)用執(zhí)行syscall trace sys exit schedule 未申請到所需資源sleep on schedule interruptible 未申請到所需資源sleep on schedule 收到SIG KILL或SIG CONT后執(zhí)行wake up 所需資源滿足或收到信號wake up interruptible 所需資源滿足wake up 24 04 2020 5 進(jìn)程的模式和類型 在Linux系統(tǒng)中 進(jìn)程的執(zhí)行模式劃分為用戶模式和內(nèi)核模式 如果當(dāng)前運(yùn)行的是用戶程序 應(yīng)用程序或者內(nèi)核之外的系統(tǒng)程序 那么對應(yīng)進(jìn)程就在用戶模式下運(yùn)行 如果在用戶程序執(zhí)行過程中出現(xiàn)系統(tǒng)調(diào)用或者發(fā)生中斷事件 就要運(yùn)行操作系統(tǒng) 即核心 程序 進(jìn)程模式就變成內(nèi)核模式 在內(nèi)核模式下運(yùn)行的進(jìn)程可以執(zhí)行機(jī)器的特權(quán)指令 而且 此時(shí)該進(jìn)程的運(yùn)行不受用戶的干預(yù) 即使是root用戶也不能干預(yù)內(nèi)核模式下進(jìn)程的運(yùn)行 按照進(jìn)程的功能和運(yùn)行的程序分類 進(jìn)程可劃分為兩大類 一類是系統(tǒng)進(jìn)程 只運(yùn)行在內(nèi)核模式 執(zhí)行操作系統(tǒng)代碼 完成一些管理性的工作 例如內(nèi)存分配和進(jìn)程切換 另外一類是用戶進(jìn)程 通常在用戶模式中執(zhí)行 并通過系統(tǒng)調(diào)用或在出現(xiàn)中斷 異常時(shí)進(jìn)入內(nèi)核模式 24 04 2020 6 有關(guān)進(jìn)程管理的命令 ps命令ps命令是查看進(jìn)程狀態(tài)的最常用的命令 它可以提供關(guān)于進(jìn)程的許多信息 根據(jù)顯示的信息可以確定哪個(gè)進(jìn)程正在運(yùn)行 哪個(gè)進(jìn)程被掛起 遇到了哪些困難 進(jìn)程已運(yùn)行了多久 進(jìn)程正在使用的資源 進(jìn)程的相對優(yōu)先級 以及進(jìn)程的標(biāo)識號 PID 所有這些信息對用戶都很有用 對于系統(tǒng)管理員來說更為重要 24 04 2020 7 Linux的ps命令格式 ps命令的一般格式是 ps 選項(xiàng) 以下是ps命令常用的選項(xiàng)及其含義 a顯示系統(tǒng)中與tty相關(guān)的所有進(jìn)程的信息 e顯示所有進(jìn)程的信息 f顯示進(jìn)程的所有信息 l以長格式顯示進(jìn)程信息 r只顯示正在運(yùn)行的進(jìn)程 u顯示面向用戶的格式 包括用戶名 CPU及內(nèi)存使用情況等信息 x顯示所有非控制終端上的進(jìn)程信息 pid顯示由進(jìn)程ID指定的進(jìn)程的信息 tty顯示指定終端上的進(jìn)程的信息 24 04 2020 8 Linux的命令ps顯示的信息項(xiàng) UID進(jìn)程屬主的用戶ID號PID進(jìn)程ID號PPID父進(jìn)程的ID號C進(jìn)程最近使用CPU的估算 STIME進(jìn)程開始時(shí)間 以 小時(shí) 分 秒 的形式給出TTY該進(jìn)程建立時(shí)所對應(yīng)的終端 表示該進(jìn)程不占用終端TIME報(bào)告進(jìn)程累計(jì)使用的CPU時(shí)間 注意 盡管覺得有些命令 如sh 已經(jīng)運(yùn)轉(zhuǎn)了很長時(shí)間 但是它們真正使用CPU的時(shí)間往往很短 所以 該字段的值往往是0 00CMD是command 命令 的縮寫 往往表示進(jìn)程所對應(yīng)的命令名 24 04 2020 9 Linux的命令ps顯示的信息項(xiàng) 命令ps auxUSER啟動(dòng)進(jìn)程的用戶 CPU運(yùn)行該進(jìn)程占用CPU的時(shí)間與該進(jìn)程總的運(yùn)行時(shí)間的比例 MEM該進(jìn)程占用內(nèi)存和總內(nèi)存的比例VSZ虛擬內(nèi)存的大小 以KB為單位RSS占用實(shí)際內(nèi)存的大小 以KB為單位STAT表示進(jìn)程的運(yùn)行狀態(tài) 包括以下幾種代碼 D不可中斷的睡眠 R就緒 在可運(yùn)行隊(duì)列中 S睡眠 T被跟蹤或停止 Z終止 僵死 的進(jìn)程 24 04 2020 10 Linux的kill命令 通常終止一個(gè)前臺(tái)進(jìn)程可以使用 Ctrl C 組合鍵 但是 對于一個(gè)后臺(tái)進(jìn)程就須用kill命令來終止 kill命令是通過向進(jìn)程發(fā)送指定的信號來結(jié)束相應(yīng)進(jìn)程 默認(rèn)情況下 采用編號為15的TERM信號 TERM信號將終止所有不能捕獲該信號的進(jìn)程 對于那些可以捕獲該信號的進(jìn)程就要用編號為9的KILL信號 強(qiáng)行殺掉該進(jìn)程 24 04 2020 11 Linuxkill命令的格式 kill s信號 p a 進(jìn)程號 kill l 信號 其中選項(xiàng)各選項(xiàng)的含義如下 s指定需要發(fā)送的信號 既可以是信號名 如KILL 也可以是對應(yīng)信號的號碼 如9 p指定kill命令只是顯示進(jìn)程的pid 進(jìn)程標(biāo)識號 并不真正發(fā)出結(jié)束信號 l顯示信號名稱列表 這也可以在 usr include linux signal h文件中找到 24 04 2020 12 使用kill命令時(shí)應(yīng)注意 1 kill命令可以帶信號號碼選項(xiàng) 也可以不帶 如果沒有信號號碼 kill命令就會(huì)發(fā)出終止信號 TERM 這個(gè)信號可以殺掉沒有捕獲到該信號的進(jìn)程 也可以用kill向進(jìn)程發(fā)送特定的信號 例如 kill 21234它的效果等同于在前臺(tái)運(yùn)行PID為1234的進(jìn)程的時(shí)候 按下 Ctrl C 但是普通用戶只能使用不帶signal參數(shù)的kill命令 或者最多使用 9信號 2 kill可以帶有進(jìn)程ID號作為參數(shù) 當(dāng)用kill向這些進(jìn)程發(fā)送信號時(shí) 必須是這些進(jìn)程的主人 如果試圖撤銷一個(gè)沒有權(quán)限撤銷的進(jìn)程 或者撤銷一個(gè)不存在的進(jìn)程 就會(huì)得到一個(gè)錯(cuò)誤信息 24 04 2020 13 使用kill命令時(shí)應(yīng)注意 3 可以向多個(gè)進(jìn)程發(fā)信號 或者終止它們 4 當(dāng)kill成功地發(fā)送了信號 Shell會(huì)在屏幕上顯示出進(jìn)程的終止信息 有時(shí)這個(gè)信息不會(huì)馬上顯示 只有當(dāng)按下回車鍵使Shell的命令提示符再次出現(xiàn)時(shí)才會(huì)顯示出來 5 信號使進(jìn)程強(qiáng)行終止常會(huì)帶來一些副作用 比如數(shù)據(jù)丟失或終端無法恢復(fù)到正常狀態(tài) 發(fā)送信號時(shí)必須小心 只有在萬不得已時(shí)才用kill信號 9 因?yàn)檫M(jìn)程不能首先捕獲它 要撤銷所有的后臺(tái)作業(yè) 可以鍵入 kill0 因?yàn)橛行┰诤笈_(tái)運(yùn)行的命令會(huì)啟動(dòng)多個(gè)進(jìn)程 跟蹤并找到所有要?dú)⒌舻倪M(jìn)程的PID是件很麻煩的事 這時(shí) 使用 kill0 來終止所有由當(dāng)前Shell啟動(dòng)的進(jìn)程是個(gè)有效的方法 24 04 2020 14 Linux的sleep命令 sleep命令的功能是使進(jìn)程暫停執(zhí)行一段時(shí)間 其一般格式是 sleep時(shí)間值其中 時(shí)間值 參數(shù)以秒為單位 即使進(jìn)程暫停由時(shí)間值所指定的秒數(shù) 此命令大多用于Shell程序設(shè)計(jì)中 使兩條命令執(zhí)行之間停頓指定的時(shí)間 24 04 2020 15 Linux進(jìn)程的數(shù)據(jù)結(jié)構(gòu) 在Linux中 進(jìn)程用task struct表示 所有進(jìn)程被組織到以init task為表頭的雙向鏈表中 見 include linux sched h SET LINKS 宏 該鏈表是全系統(tǒng)唯一的 系統(tǒng)維護(hù)一個(gè)名為task的數(shù)組 task包含指向系統(tǒng)所有進(jìn)程的task struct結(jié)構(gòu)的指針 task數(shù)組默認(rèn)值為512 Linux從系統(tǒng)內(nèi)存分配一個(gè)task struct結(jié)構(gòu)并將其加入task數(shù)組 當(dāng)前運(yùn)行進(jìn)程的結(jié)構(gòu)用current指針指示 24 04 2020 16 Linux內(nèi)核0 11task struct 進(jìn)程控制塊是task struct結(jié)構(gòu) 在include linux sched h中定義task struct結(jié)構(gòu)體中各數(shù)據(jù)項(xiàng)含義 24 04 2020 17 Linux內(nèi)核0 11的task struct structtask struct therearehardcoded don ttouch longstate 1unrunnable runnable 0stoped longcounter longpriority longsignal structsigactionsigaction 32 longblocked bitmapofmaskedsignals intexit code variousfields unsignedlongstart code end code end data brk start stack longpid father pgrp session leader unsignedshortuid euid suidunsignedshortgid egid sgid longalarm longutime stime cutime cstime start time unsignedshortused math filesysteminfo inttty 1ifnotty soitmustbesigned unsignedshortumask structm inode pwd structm inode root structm inode executable unsignedlongclose on exec structfile filp NR OPEN ldtforthistask0 zero1 cs2 ds 24 04 2020 18 Linuxtask struct的信息分類 進(jìn)程的狀態(tài)信息進(jìn)程調(diào)度信息進(jìn)程標(biāo)識信息進(jìn)程通信信息進(jìn)程的鏈接信息進(jìn)程的時(shí)間和定時(shí)器信息有關(guān)文件系統(tǒng)的信息虛擬內(nèi)存信息進(jìn)程上下文信息其它信息 24 04 2020 19 Linux的PCB task struct stateLinux的進(jìn)程狀態(tài)主要分為三類 可運(yùn)行的 TASK RUNNING 相當(dāng)于運(yùn)行態(tài)和就緒態(tài) 被掛起的 TASK INTERRUPTIBLE TASK UNINTERRUPTIBLE和TASK STOPPED 不可運(yùn)行的 TASK ZOMBIE 調(diào)度器主要處理的是可運(yùn)行和被掛起兩種狀態(tài)下的進(jìn)程 其中TASK STOPPED又專門用于SIGSTP等IPC信號的響應(yīng) 而TASK ZOMBIE指的是已退出而暫時(shí)沒有被父進(jìn)程收回資源的 僵尸 進(jìn)程 need resched布爾值 在調(diào)度器中用于表示該進(jìn)程需要申請調(diào)度 24 04 2020 20 Linux的PCB task struct policy在Linux2 4中 進(jìn)程的調(diào)度策略可以有三種選擇 SCHED FIFO 先進(jìn)先出式調(diào)度 除非有更高優(yōu)先級進(jìn)程申請運(yùn)行 否則該進(jìn)程將保持運(yùn)行至退出才讓出CPU SCHED RR 輪轉(zhuǎn)式調(diào)度 該進(jìn)程被調(diào)度下來后將被置于運(yùn)行隊(duì)列的末尾 以保證其他實(shí)時(shí)進(jìn)程有機(jī)會(huì)運(yùn)行 SCHED OTHER 常規(guī)的分時(shí)調(diào)度策略 另外 policy中還包含了一個(gè)SCHED YIELD位 置位時(shí)表示主動(dòng)放棄CPU rt priority用于表征實(shí)時(shí)進(jìn)程的優(yōu)先級 從1 99取值 非實(shí)時(shí)進(jìn)程該項(xiàng)應(yīng)該為0 這一屬性將用于調(diào)度時(shí)的權(quán)值計(jì)算 詳見 就緒進(jìn)程選擇算法 counter該屬性記錄的是當(dāng)前時(shí)間片內(nèi)該進(jìn)程還允許運(yùn)行的時(shí)間 以CPU時(shí)鐘tick值為單位 每個(gè)進(jìn)程的counter初值與nice值有關(guān) nice越小則counter越大 即優(yōu)先級越高的進(jìn)程所允許獲得的CPU時(shí)間也相對越多 并參與 就緒進(jìn)程選擇算法 在Linux2 4中 每個(gè) 非SCHED FIFO實(shí)時(shí) 進(jìn)程都不允許運(yùn)行大于某一時(shí)間片的時(shí)間 一旦超時(shí) 調(diào)度器將強(qiáng)制選擇另一進(jìn)程運(yùn)行 詳見 調(diào)度器工作流程 24 04 2020 21 Linux的PCB task struct nice用戶可支配的進(jìn)程優(yōu)先級 將參與 就緒進(jìn)程選擇算法 同時(shí)該值也決定了該進(jìn)程的時(shí)間片長度cpus allowed以位向量的形式表示可用于該進(jìn)程運(yùn)行的CPU 見 調(diào)度器工作流程 cpus runnable以位向量的形式表示當(dāng)前運(yùn)行該進(jìn)程的CPU 相應(yīng)位為1 如果不在任何CPU上運(yùn)行 則為全1 這一屬性和cpus allowed屬性結(jié)合 可以迅速判斷該進(jìn)程是否能調(diào)度到某一CPU上運(yùn)行 位 與 24 04 2020 22 Linux的PCB task struct processor本進(jìn)程當(dāng)前 或最近 所在CPU編號thread用于保存進(jìn)程執(zhí)行環(huán)境 各個(gè)寄存器的值以及IO操作許可權(quán)映射表 內(nèi)容與TSS相近 因?yàn)門SS以CPUid為索引 而Linux無法預(yù)測被替換下來的進(jìn)程下一次將在哪個(gè)CPU上運(yùn)行 所以這些信息不能保存在TSS中current核心經(jīng)常需要獲知當(dāng)前在某CPU上運(yùn)行的進(jìn)程的task struct 在Linux中用current指針指向這一描述符 current的實(shí)現(xiàn)采用了一個(gè)小技巧以獲得高效的訪問速度 這個(gè)小技巧與Linux進(jìn)程task struct的存儲(chǔ)方式有關(guān) 24 04 2020 23 Linux的PCB task struct schedule datatask struct是用于描述進(jìn)程的數(shù)據(jù)結(jié)構(gòu) 其中包含了指向所運(yùn)行CPU的屬性 在Linux中 另有一個(gè)數(shù)據(jù)結(jié)構(gòu)對應(yīng)于CPU 可以利用它訪問到某CPU上運(yùn)行的進(jìn)程 這個(gè)數(shù)據(jù)結(jié)構(gòu)定義為schedule data結(jié)構(gòu) 包含兩個(gè)屬性 curr指針 指向當(dāng)前運(yùn)行于該CPU上的進(jìn)程的task struct 通常用cpu curr cpu 宏來訪問 last schedule時(shí)間戳 記錄了上一次該CPU上進(jìn)程切換的時(shí)間 通常用last schedule cpu 宏來訪問 為了使該數(shù)據(jù)結(jié)構(gòu)的訪問能與CPU的Cacheline大小相一致 schedule data被組織到以SMP CACHE BYTES為單位的aligned data聯(lián)合數(shù)組中 系統(tǒng)中每個(gè)CPU對應(yīng)數(shù)組上的一個(gè)元素 24 04 2020 24 Linux就緒進(jìn)程選擇算法 Linuxschedule 函數(shù)將遍歷就緒隊(duì)列中的所有進(jìn)程 調(diào)用goodness 函數(shù)計(jì)算每一個(gè)進(jìn)程的權(quán)值weight 從中選擇權(quán)值最大的進(jìn)程投入運(yùn)行 進(jìn)程調(diào)度權(quán)值的計(jì)算分為實(shí)時(shí)進(jìn)程和非實(shí)時(shí)進(jìn)程兩類 對于非實(shí)時(shí)進(jìn)程 SCHED OTHER 影響權(quán)值的因素主要有以下四個(gè) 進(jìn)程當(dāng)前時(shí)間片內(nèi)所剩的tick數(shù) 即task struct的counter值 相當(dāng)于counter越大的進(jìn)程獲得CPU的機(jī)會(huì)也越大 因?yàn)閏ounter的初值與 nice 相關(guān) 因此這一因素一方面代表了進(jìn)程的優(yōu)先級 另一方面也代表了進(jìn)程的 欠運(yùn)行程度 weight p counter 進(jìn)程上次運(yùn)行的CPU是否就是當(dāng)前CPU 如果是 則權(quán)值增加一個(gè)常量 表示優(yōu)先考慮不遷移CPU的調(diào)度 因?yàn)榇藭r(shí)Cache信息還有效 weight PROC CHANGE PENALTY 此次切換是否需要切換內(nèi)存 如果不需要 或者是同一進(jìn)程的兩個(gè)線程間的切換 或者是沒有mm屬性的核心線程 則權(quán)值加1 表示 稍微 優(yōu)先考慮不切換內(nèi)存的進(jìn)程 weight 1 24 04 2020 25 Linux就緒進(jìn)程選擇算法 進(jìn)程的用戶可見的優(yōu)先級nice nice越小則權(quán)值越大 Linux中的nice值在 20到 19之間選擇 缺省值為0 nice 系統(tǒng)調(diào)用可以用來修改優(yōu)先級 weight 20 p nice 對于實(shí)時(shí)進(jìn)程 SCHED FIFO SCHED RR 權(quán)值大小僅由該進(jìn)程的rt priority值決定 weight 1000 p rt priority 1000的基準(zhǔn)量使得實(shí)時(shí)進(jìn)程的權(quán)值比所有非實(shí)時(shí)進(jìn)程都要大 因此只要就緒隊(duì)列中存在實(shí)時(shí)進(jìn)程 調(diào)度器都將優(yōu)先滿足它的運(yùn)行需要 如果權(quán)值相同 則選擇就緒隊(duì)列中位于前列的進(jìn)程投入運(yùn)行 除了以上標(biāo)準(zhǔn)值以外 goodness 還可能返回 1 表示該進(jìn)程設(shè)置了SCHED YIELD位 此時(shí) 僅當(dāng)不存在其他就緒進(jìn)程時(shí)才會(huì)選擇它 如果遍歷所有就緒進(jìn)程后 weight值為0 表示當(dāng)前時(shí)間片已經(jīng)結(jié)束了 此時(shí)將重新計(jì)算所有進(jìn)程 不僅僅是就緒進(jìn)程 的counter值 再重新進(jìn)行就緒進(jìn)程選擇 詳見 調(diào)度器工作流程 24 04 2020 26 Linux的調(diào)度器 Linux的調(diào)度器主要實(shí)現(xiàn)在schedule 函數(shù)中 調(diào)度器工作流程schedule 函數(shù)的基本流程可以概括為四步 1 清理當(dāng)前運(yùn)行中的進(jìn)程2 選擇下一個(gè)投入運(yùn)行的進(jìn)程3 設(shè)置新進(jìn)程的運(yùn)行環(huán)境4 執(zhí)行進(jìn)程上下文切換5 后期整理其中包含了一些鎖操作 就緒隊(duì)列鎖runquque lock 全局核心鎖kernel flag 全局中斷鎖global irq lock 進(jìn)程列表鎖tasklist lock 24 04 2020 27 Linux內(nèi)核0 11進(jìn)程的創(chuàng)建 進(jìn)程創(chuàng)建程序fork cfork c是sys fork 在kernel system call s中 系統(tǒng)調(diào)用的輔助處理函數(shù)集sys fork 其中給出了sys fork 系統(tǒng)調(diào)用中使用的兩個(gè)C語言函數(shù)find empty process 為新進(jìn)程取得不重復(fù)的進(jìn)程號copy process 用于創(chuàng)建并復(fù)制進(jìn)程的代碼段和數(shù)據(jù)段以及環(huán)境還包括進(jìn)程呢哦存區(qū)域驗(yàn)證和內(nèi)存分配函數(shù)Verify area 24 04 2020 28 fork c的主要工作 為task struct申請空閑內(nèi)存頁 并填入新進(jìn)程標(biāo)識號和其他內(nèi)容調(diào)用find empty process 尋找空閑的進(jìn)程槽 processstot 為kernel task page申請內(nèi)存空閑頁面復(fù)制父進(jìn)程的LDP復(fù)制父進(jìn)程的mmap建立文件系統(tǒng)有關(guān)信息 包括文件描述符和i節(jié)點(diǎn)等 24 04 2020 29 Linux進(jìn)程的撤銷exit c 24 04 2020 30 設(shè)計(jì)Linux系統(tǒng)調(diào)用 用戶接口添加系統(tǒng)調(diào)用添加源代碼 添加到內(nèi)核文中的一個(gè)函數(shù)函數(shù)名前綴sys 作為系統(tǒng)調(diào)用的標(biāo)志Asmlinkageintsys yang inti intj j i i returnj 添加代碼到文件 usr src linux kernel sys c鏈接新的系統(tǒng)調(diào)用目的 讓內(nèi)核其它部分知道它的存在打開 usr src linux include asm i386 unistd h該文件包含了系統(tǒng)調(diào)用的清單 用來給每個(gè)系統(tǒng)調(diào)用分配一個(gè)唯一的編號 24 04 2020 31 Linux系統(tǒng)調(diào)用 續(xù) 系統(tǒng)調(diào)用號的定義 define NR nameNNN其中NNN為定義的號 name為新的系統(tǒng)調(diào)用名稱新的定義添加到unist h文件的最后在 usr src linux arch i386 kernel entry S的最后添加代碼 longSYSMBOL NAME sys yang 重新編譯內(nèi)核以root登錄 進(jìn)入 usr src linux目錄 重建內(nèi)核 makemenuconfig 配置新內(nèi)核 makedep 創(chuàng)建新內(nèi)核 makemodules indtall 加入模塊 makeclean 清除多余創(chuàng)建的文件 makebzImage 生成可執(zhí)行內(nèi)核引導(dǎo)文件 makeinstall 安裝新內(nèi)核重新啟動(dòng)系統(tǒng)即可 24 04 2020 32 Linux系統(tǒng)調(diào)用 續(xù) 編程 test c 調(diào)用自己的系統(tǒng)調(diào)用 include include syscall1 char yang int ret main intx y x 100 y yang x printf Thisistheresultofnewkernel n printf d n y 24 04 2020 33 Linux系統(tǒng)調(diào)用 續(xù) 編譯程序gcc o I usr src linux 2 4 20 8 includetesttest c運(yùn)行 test 24 04 2020 34 設(shè)計(jì)動(dòng)態(tài)模塊 模塊的組織 include 說明是個(gè)內(nèi)核功能 include 說明是個(gè)模塊 其他header信息intinit module 聲明是一個(gè)模塊 加載時(shí) 初始化模塊的編碼 期望實(shí)現(xiàn)的其它功能 如read ioctl 等函數(shù)voidcleanup module 卸載時(shí) 注銷模塊的編碼 24 04 2020 35 模塊編程 模塊的編譯 gcc O2 g Wall DMODULE D KERNEL cfilename c filename c為自己編寫的模塊程序源代碼文件模塊的加載insmod命令模塊的卸載rmmod命令 24 04 2020 36 模塊編程 一個(gè)例子testmodule c defineMODULE include include ifCONFIG MODVERSION 1 defineMODVERSIONS include endifintinit module printk Hello Thisisatestingmodule n return0 voidcleanup module printk Sorry Thetestingmoduleisunloadingnow n 24 04 2020 37 模塊編程 模塊的編譯 加載與卸載編譯 gcc O2 g Wall DMODULE D KERNEL ctestmodule c testmodule c為自己編寫的模塊程序源代碼文件加載 insmod ftestmodule o卸載 rmmodtestmodule 24 04 2020 38 Ext文件系統(tǒng)minix文件系統(tǒng)結(jié)構(gòu)文件名14個(gè)字符塊設(shè)備最大容量64M 8 8 1024 1024 1024 1024 EXT2文件系統(tǒng) minix文件系統(tǒng) 24 04 2020 39 EXT2文件系統(tǒng) 磁盤布局 Ext文件系統(tǒng)Minix的第一次擴(kuò)展文件名最大長度255個(gè)字符磁盤分區(qū)大小可達(dá)2GBExt2文件系統(tǒng) 第二代擴(kuò)展文件系統(tǒng)磁盤分區(qū)大小可達(dá)4TB磁盤布局采用了組塊 24 04 2020 40 EXT2文件系統(tǒng) 引導(dǎo)塊和超級塊 引導(dǎo)塊BootBlock每個(gè)硬盤分區(qū)的開頭1024字節(jié) 即0byte至1023byte是分區(qū)的啟動(dòng)扇區(qū) 存放由ROMBIOS自動(dòng)讀入的引導(dǎo)程序和數(shù)據(jù) 但這只對引導(dǎo)設(shè)備有效 而對于非引導(dǎo)設(shè)備 該引導(dǎo)塊不含代碼 這個(gè)塊與ext2沒有任何關(guān)系 超級塊SuperBlock分區(qū)剩余的部分被分為若干個(gè)組 每個(gè)組里均由一個(gè)superblock塊和一個(gè)GroupDescriptors 組描述符 塊組成 Group0中的superblock被內(nèi)核所用 定義了諸如文件系統(tǒng)的靜態(tài)結(jié)構(gòu) 包括塊的大小 總塊數(shù) 每組內(nèi)inode數(shù) 空閑塊 索引結(jié)點(diǎn)數(shù)等全局信息 其他Group中的SuperBlock則僅是Group0中的SuperBlock的一個(gè)拷貝 超級塊的數(shù)據(jù)結(jié)構(gòu)在ext2 fs h定義為structext2 super blockLinux啟動(dòng)時(shí)superblock0的內(nèi)容讀入內(nèi)存 某個(gè)組損壞可用來恢復(fù) 24 04 2020 41 EXT2文件系統(tǒng) 超級塊 structext2 super blockTypeField釋意 u32s inodes count 索引結(jié)點(diǎn)的總數(shù) u32s blocks count 文件系統(tǒng)塊的總數(shù) u32s r blocks count 為超級用戶保留的塊數(shù) u32s free blocks count 空閑塊總數(shù) u32s free inodes count 空閑索引節(jié)點(diǎn)總數(shù) u32s first data block 文件系統(tǒng)中第一個(gè)數(shù)據(jù)塊 u32s log block size 用于計(jì)算邏輯塊的大小 s32s log frag size 用于計(jì)算片的大小 u32s blocks per group 每個(gè)組的塊個(gè)數(shù) u32s frags per group 每個(gè)組的片個(gè)數(shù) u32s inodes per group 每個(gè)組的索引節(jié)點(diǎn)數(shù) u32s mtime 文件系統(tǒng)的安裝時(shí)間 u32s wtime 最后一次對超級塊進(jìn)行寫的時(shí)間 u16s mnt count 安裝計(jì)數(shù) s16s max mnt count 最大可安裝計(jì)數(shù) 24 04 2020 42 EXT2文件系統(tǒng) 超級塊 u16s magic 用于確定文件系統(tǒng)版本的標(biāo)志 ext2 0 xEF53 u16s state 文件系統(tǒng)狀態(tài) u16s errors 當(dāng)檢測到錯(cuò)誤時(shí)如何處理 u16s minor rev level 次版本號 u32s lastcheck 最后一次檢測文件系統(tǒng)狀態(tài)的時(shí)間 u32s checkinterval 兩次對文件系統(tǒng)狀態(tài)進(jìn)行檢測的最大可能時(shí)間間隔 u32s rev level 版本號 以此識別是否支持某些功能 u16s def fesuid 保留塊的默認(rèn)用戶標(biāo)識UID u16s def fesgid 保留塊的默認(rèn)用戶組標(biāo)識GID u32s first ino 第一個(gè)非保留的索引節(jié)點(diǎn)號 u16s inode size 索引結(jié)點(diǎn)結(jié)構(gòu)的大小 u16s block group nr 本Superblock所在的塊組號 u32s reserved 230 保留 Paddingtotheendoftheblock 注意文件系統(tǒng)的狀態(tài) 沒錯(cuò) defineEXT2 valid fs0 x0001有錯(cuò) defineEXT2 ERROR fs0 x0002 24 04 2020 43 EXT2文件系統(tǒng) 組描述符 組描述符GroupDescriptors定義了塊位圖的塊號 索引結(jié)點(diǎn)位圖的塊號 索引結(jié)點(diǎn)表的起始塊號 本組空閑塊的個(gè)數(shù)等組內(nèi)信息 文件系統(tǒng)根據(jù)這些信息來查找數(shù)據(jù)塊位圖 索引結(jié)點(diǎn)位圖 索引結(jié)點(diǎn)表的位置 數(shù)據(jù)結(jié)構(gòu)在ext2 fs h中定義 structext2 group desc TypeField釋意 u32bg block bitmap 指向該組中塊位圖所在塊的指針 u32bg inode bitmap 指向該組中塊節(jié)點(diǎn)位圖所在塊的指針 u32bg inode table 指向該組中節(jié)點(diǎn)的首塊的指針 u16bg free blocks count 本組空閑塊的個(gè)數(shù) u16bg free inodes count 本組空閑索引節(jié)點(diǎn)的個(gè)數(shù) u16bg used dirs count 本組分配給目錄的節(jié)點(diǎn)數(shù) u16bg pad 填充 u32bg reserved 保留 24 04 2020 44 EXT2文件系統(tǒng) 數(shù)據(jù)塊及數(shù)據(jù)塊位圖 數(shù)據(jù)塊位圖DataBlockBitmap這是ext2管理存儲(chǔ)空間的方法 即位圖法 每個(gè)位對應(yīng)一個(gè)數(shù)據(jù)塊 位值為0表示空閑 1表示已經(jīng)分配 數(shù)據(jù)塊位圖定義為一個(gè)塊大小 于是 一個(gè)組中的數(shù)據(jù)塊個(gè)數(shù)就決定了 假設(shè)塊大小為b字節(jié) 可以區(qū)別的塊數(shù)為b 8個(gè)數(shù)據(jù)塊DataBlocks每個(gè)組的數(shù)據(jù)最大個(gè)數(shù)是在塊大小定義后就確定了的 所以組容量也就確定了 假設(shè)塊大小為b字節(jié) 那么組容量就確定為 b 8 b字節(jié)若1塊 4K 則組塊大小 4K 8 4K 128M 24 04 2020 45 EXT2文件系統(tǒng) 索引節(jié)點(diǎn)位圖及索引節(jié)點(diǎn) 索引結(jié)點(diǎn)位圖InodeBitmap與數(shù)據(jù)塊位圖相似 用來表示索引結(jié)點(diǎn)是否已經(jīng)被使用 假設(shè)塊大小為b字節(jié) 每個(gè)索引結(jié)點(diǎn)數(shù)據(jù)結(jié)構(gòu)大小為128字節(jié) 最多可以有b 8個(gè)索引結(jié)點(diǎn) 索引結(jié)點(diǎn)表需要占用的存儲(chǔ)空間大小為 b 8 128字節(jié) 即 b 8 128 b 8 128個(gè)塊索引結(jié)點(diǎn)Inode索引結(jié)點(diǎn)表由若干個(gè)索引結(jié)點(diǎn)數(shù)據(jù)結(jié)構(gòu)組成 需要占用若干個(gè)塊 Ext2中的每個(gè)索引結(jié)點(diǎn)數(shù)據(jù)結(jié)構(gòu)大小為128字節(jié) 每個(gè)索引結(jié)點(diǎn)即對應(yīng)一個(gè)文件或是目錄 是對其除文件名 目錄名 以外的所有屬性的描述 例如 文件類型 文件創(chuàng)建時(shí)間 訪問時(shí)間 修改時(shí)間 文件所占數(shù)據(jù)塊的個(gè)數(shù) 指向數(shù)據(jù)塊的指針 其中 數(shù)據(jù)塊指針是由15個(gè)元組的數(shù)據(jù)組成 24 04 2020 46 EXT2文件系統(tǒng) 索引節(jié)點(diǎn)位圖及索引節(jié)點(diǎn) 前12個(gè)元組 0至11 直接指向數(shù)據(jù)塊 第12號元組 12 是一個(gè)1級子索引 指向的不是數(shù)據(jù)塊 而是存放數(shù)據(jù)塊指針的塊 類似的 第13號元組 13 是一個(gè)2級子索引 第14號元組 14 是一個(gè)3級子索引 這種結(jié)構(gòu)可以適應(yīng)大文件的存儲(chǔ) 假設(shè)文件塊大小為b 則當(dāng)文件長度小于b 12時(shí) 只要用前12個(gè)元組來指向其數(shù)據(jù)塊 當(dāng)文件長度大于b 12時(shí) 則用多級索引機(jī)制來指向其數(shù)據(jù)塊 這體現(xiàn)了Ext2的文件的物理結(jié)構(gòu) 即索引文件 使用索引結(jié)點(diǎn)來指向文件的數(shù)據(jù)塊 并且索引結(jié)點(diǎn)本身是聚集在一起的 24 04 2020 47 24 04 2020 48 EXT2文件系統(tǒng) 索引節(jié)點(diǎn)定義 索引節(jié)點(diǎn)定義ext2 fs h中的structext2 inodestructext2 inode TypeField釋意 u16i mode 文件類型及訪問權(quán)限 u16i uid 文件擁有者的標(biāo)識號UID u32i size 文件大小大小 字節(jié) u32i atime 最后一次訪問時(shí)間 u32i ctime 創(chuàng)建時(shí)間 u32i mtime 該文件內(nèi)容最后修改時(shí)間 u32i dtime 文件刪除時(shí)間 u16i gid 文件的用戶組的組號 u16i links count 文件的鏈接計(jì)數(shù) u32i blocks 文件的數(shù)據(jù)塊個(gè)數(shù) 以512字節(jié)計(jì) u32i flags 打開文件的方式 u32 i block EXT2 N BLOCKS 指向數(shù)據(jù)塊的指針數(shù)組 u32i generation 文件的版本號 用于NFS u32i file acl 文件訪問控制表 ACL已不再使用 u32i dir acl 目錄訪問控制表 ACL已不再使用 u8l i frag 每塊中的片數(shù) u8l i fsize 片的大小 u32l i reserved 保留 24 04 2020 49 EXT2文件系統(tǒng) 目錄與文件 目錄與文件不是所有的文件都需要數(shù)據(jù)塊 有些文件只需要索引結(jié)點(diǎn)即可 Ext2中 目錄是一種特殊的文件 其數(shù)據(jù)塊中的內(nèi)容即目錄表 所包含的文件 當(dāng)然也包括子目錄 的文件名 指向文件的索引節(jié)點(diǎn)號 文件類型 ext2 fs h中數(shù)據(jù)結(jié)構(gòu)的定義 structext2 dir entry 2 u32inode 索引節(jié)點(diǎn)號 u16rec len 目錄項(xiàng)長度 u8name len 文件名長度 u8file type 文件類型 1 普通文件 2 目錄 char name EXT2 NAME LEN 文件名 其中MAX NAME LEN定義為255 即文件名最大長度為255個(gè)字符 字節(jié) 同時(shí) 目錄項(xiàng)取為4的整數(shù) 故 目錄項(xiàng)的長度范圍是12至264字節(jié) 24 04 2020 50 EXT2文件系統(tǒng) 目錄與文件 目錄文件的數(shù)據(jù)塊實(shí)例其中 inode指向0的那一行 表示此文件已經(jīng)被刪除 同時(shí) 上一行的目錄項(xiàng)長度擴(kuò)展為兩者之和 12 16 24 04 2020 51 EXT2文件系統(tǒng) 文件的類型 文件類型Ext2中文件類型有以下幾種 文件類型號描述0未知1普通文件2目錄3字符設(shè)備4塊設(shè)備5管道 Pipe 6套接字7符號指針 24 04 2020 52 EXT2文件系統(tǒng)的操作 兩個(gè)概念文件系統(tǒng)的設(shè)計(jì)目標(biāo)在于 一方面 從用戶的角度看 實(shí)現(xiàn) 按名取存 文件系統(tǒng)的用戶只要知道所需文件的文件名 就可存取文件中的信息 而無需知道這些文件究竟存放在什么地方 另一方面 從系統(tǒng)角度看 文件系統(tǒng)對文件存儲(chǔ)器的存儲(chǔ)空間進(jìn)行組織 分配和回收 負(fù)責(zé)文件的存儲(chǔ) 檢索 共享和保護(hù) 用戶角度的文件系統(tǒng)被稱為VFS 虛擬文件系統(tǒng) 定義在這個(gè)層次上的操作 對于用戶來說是文件系統(tǒng)所呈現(xiàn)所有屬性 比如 列目錄 建立目錄 建立文件 打開文件 讀寫文件 重命名文件等 與每個(gè)操作相對應(yīng)的是實(shí)際文件系統(tǒng)中的一系列底層操作 24 04 2020 53 EXT2文件系統(tǒng)的操作 索引結(jié)點(diǎn)操作 24 04 2020 54 EXT2文件系統(tǒng)的操作 文件操作 24 04 2020 55 EXT2硬盤空間管理 存儲(chǔ)空間的分配回收需要考慮兩個(gè)因素避免文件碎片時(shí)效Ext2中新建立的文件并不是馬上就分配數(shù)據(jù)塊 而是分配索引結(jié)點(diǎn) 當(dāng)有數(shù)據(jù)存入時(shí) 再分配數(shù)據(jù)塊 故存儲(chǔ)空間的分配與回收也分成兩個(gè)部分索引結(jié)點(diǎn)的創(chuàng)建與刪除數(shù)據(jù)塊的分配與回收 24 04 2020 56 EXT2硬盤空間管理 創(chuàng)建索引結(jié)點(diǎn) 創(chuàng)建索引結(jié)點(diǎn)Ext2使用ext2 new inode 來創(chuàng)建一個(gè)新的索引結(jié)點(diǎn) 創(chuàng)建成功則返回索引結(jié)點(diǎn)號 否則返回NULL 這個(gè)函數(shù)包括了以下幾個(gè)步驟 get empty inode 返回一個(gè)空結(jié)點(diǎn) lock super 互斥操作 即對superblock的P 操作 如果索引結(jié)點(diǎn)是目錄 則將其分配到空閑塊最多的組中 如果索引結(jié)點(diǎn)不是目錄 則從頭開始 順序查找 一個(gè)空結(jié)點(diǎn)分配給該文件 順序查找 的算法是 24 04 2020 57 EXT2硬盤空間管理 創(chuàng)建索引結(jié)點(diǎn) load inode bitmap 載入選中的組的索引結(jié)點(diǎn)位圖塊 找到選擇首個(gè)空閑索引結(jié)點(diǎn) 分配之 并將對應(yīng)位圖位填成1 將組描述符中的空閑索引結(jié)點(diǎn)個(gè)數(shù)減1 將SuperBlock中的空閑索引結(jié)點(diǎn)個(gè)數(shù)減1 填充剛剛分配的索引結(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu) 比如 文件屬性 創(chuàng)建時(shí)間 訪問時(shí)間等等 將新的索引結(jié)點(diǎn)插入索引結(jié)點(diǎn)hash表 加速查詢 mark indoe dirty 將索引結(jié)點(diǎn)號填入superblock的dirtyinodelist中 unlock super 互斥操作完畢 解鎖 即 對superblock的V 操作 返回新分配的索引結(jié)點(diǎn)號 24 04 2020 58 EXT2硬盤空間管理 索引結(jié)點(diǎn)的刪除 索引結(jié)點(diǎn)的刪除Ext2使用ext2 free inode 來刪除一個(gè)索引結(jié)點(diǎn) 在此之前 內(nèi)核必須已經(jīng)事先完成了一系列的操作 刪除文件占用的數(shù)據(jù)塊 索引結(jié)點(diǎn)已經(jīng)從hash表中刪除 包含該索引結(jié)點(diǎn)的目錄中索引結(jié)點(diǎn)號置0 前一個(gè)目錄項(xiàng)長度重新計(jì)算等 此函數(shù)包含以下步驟 lock super 互斥操作 對superblock加鎖 根據(jù)索引結(jié)點(diǎn)號以及索引結(jié)點(diǎn)總數(shù)來計(jì)算該索引結(jié)點(diǎn)所在的組號 load inode bitmap 從所在的組中調(diào)入索引結(jié)點(diǎn)位圖 將對應(yīng)位置0 clear inode 釋放該索引結(jié)點(diǎn)所占用的cache空間 將組描述符中的空閑索引結(jié)點(diǎn)個(gè)數(shù)增1 將SuperBlock中的空閑索引結(jié)點(diǎn)個(gè)數(shù)增1 從SuperBlock的dirtyinodelist中清除該索引結(jié)點(diǎn) uplock super 互斥操作完畢 對superblock解鎖 24 04 2020 59 EXT2硬盤空間管理 數(shù)據(jù)塊尋址 數(shù)據(jù)塊尋址ext2的單個(gè)文件所占有的數(shù)據(jù)塊組織方式 在 硬盤數(shù)據(jù)結(jié)構(gòu) 部分中已經(jīng)分析過了 即15個(gè)元組長度的數(shù)據(jù) 前12個(gè)直接指向數(shù)據(jù)塊 后3個(gè)分別采用1級 2級 3級索引方法 最大可支持的文件大小為2TB 塊大小 文件大小上限與索引級數(shù)的關(guān)系如下圖 24 04 2020 60 EXT2硬盤空間管理 分配數(shù)據(jù)塊 分配數(shù)據(jù)塊內(nèi)核使用ext2 getblk 函數(shù)給需要數(shù)據(jù)空間的文件分配數(shù)據(jù)塊 多個(gè)塊與文件間的組織形式即前面所述的數(shù)據(jù)塊尋址方式 多級索引 為了在ext2分區(qū)中找到空閑的數(shù)據(jù)塊 ext2使用ext2 alloc block 函數(shù) 為了減少文件的碎片 Ext2文件系統(tǒng)盡量從已經(jīng)分配給該文件的最后一個(gè)數(shù)據(jù)塊開始尋找空閑塊 Ext2采用了預(yù)先分配數(shù)據(jù)塊的方法 文件不僅僅得到其所申請的數(shù)據(jù)塊 還得被預(yù)先 額外 分配了最多達(dá)8個(gè)的連續(xù)數(shù)據(jù)塊 Ext2 inode info數(shù)據(jù)結(jié)構(gòu)中 i prealloc count域保存了預(yù)先分配給文件而沒有被使用的數(shù)據(jù)塊 而I prealloc block域則保存著下一個(gè)將被預(yù)分配的塊號 24 04 2020 61 EXT2硬盤空間管理 分配數(shù)據(jù)塊 Ext2 alloc block 及Ext2 getblk 的工作細(xì)節(jié) Ext2 alloc block 函數(shù)得到一個(gè)指向索引結(jié)點(diǎn)和goal的指針 Goal 是一個(gè)代表下一個(gè)將被分配的最優(yōu)新塊的邏輯塊號 Ext2 getblk 根據(jù)以下規(guī)則來設(shè)置goal參數(shù) 即判斷最優(yōu)的原則 如果已經(jīng)被分配以及預(yù)先被分配給文件的塊 是連續(xù)的塊的話 goal即預(yù)先分配的數(shù)據(jù)塊的邏輯塊號加1 如果上述規(guī)則不滿足 并且至少一個(gè)塊已經(jīng)被預(yù)先分配 則goal即這些預(yù)先分配的數(shù)據(jù)塊中的某個(gè)塊的邏輯塊號 如果上述規(guī)則不滿足 則goal即為文件的索引結(jié)點(diǎn)所在的組的第一個(gè)數(shù)據(jù)塊的邏輯塊號 Ext2 alloc block 函數(shù)檢查goal是否指向一個(gè)預(yù)先分配給該文件的一個(gè)塊 是 則返回該塊的邏輯塊號 否則 忽略所有已經(jīng)預(yù)分配的塊 調(diào)用ext2 new block 函數(shù) 查找新的空閑數(shù)據(jù)塊 24 04 2020 62 EXT2硬盤空間管理 分配數(shù)據(jù)塊 ext2 new block 函數(shù)查找空閑塊的策略如果傳遞給ext2 alloc block 函數(shù)的預(yù)分配塊 goal 空閑 則分配之否則 檢查緊跟預(yù)分配塊之后的64個(gè)塊是否有空閑如果這64個(gè)塊中沒有空閑的塊 則考慮所有的組 從包含goal的組開始過搜索對于每一個(gè)組 查找連續(xù)的8個(gè)空閑塊 如果沒有 則查找單個(gè)空閑塊 一旦空閑塊找到 搜索即停止 firstmatch算法 結(jié)束分配之前 ext2 new block 仍然試圖預(yù)分配8個(gè)連接的空閑塊 24 04 2020 63 EXT2硬盤空間管理 釋放數(shù)據(jù)塊 釋放數(shù)據(jù)塊當(dāng)一個(gè)進(jìn)程刪除文件或是將文件長度置0的時(shí)候 所有分配給該文件的數(shù)據(jù)塊將被回收 此時(shí)調(diào)用的函數(shù)是ext2 truncate 該函數(shù)調(diào)用的參數(shù)是文件的索引結(jié)點(diǎn)地址 此函數(shù)將掃描索引結(jié)點(diǎn)中i block數(shù)組 得到分配給該文件的數(shù)據(jù)塊的塊號信息 所有這些數(shù)據(jù)塊 將由ext2 free blocks 函數(shù)負(fù)責(zé)回收 Ext2 free blocks 函數(shù)調(diào)用的參數(shù)有 文件的索引結(jié)點(diǎn) 要被釋放的數(shù)據(jù)塊的首地址 塊號 要被連續(xù)釋放的塊數(shù) 此函數(shù)首先調(diào)用lock super 給superblock上鎖 然后進(jìn)行如下操作 得到數(shù)據(jù)塊位圖 將要被釋放的數(shù)據(jù)塊所對應(yīng)的位圖中的位置0 將組描述符中的 空閑塊數(shù) 域 bg free blocks count 增1 將superblock中的 空閑塊數(shù) 域 s free blocks count 增1 最后 再調(diào)用uplock super 給superblock解鎖 24 04 2020 64 Ext2的普通文件讀寫實(shí)現(xiàn) 虛擬文件系統(tǒng) VFS 上對文件的讀寫是通過系統(tǒng)調(diào)用read 或write 來實(shí)現(xiàn)的 從文件系統(tǒng)的層次看 這些系統(tǒng)調(diào)用對應(yīng)著一系列的 底層 操作 下面分析Ext2文件系統(tǒng)的寫操作過程 Ext2的寫操作函數(shù)是ext2 file write 它有4個(gè)參數(shù) fd文件描述符 buf寫入數(shù)據(jù)的緩沖區(qū)地址 count寫入的字節(jié)大小 ppos指向保存文件地址指針上述寫函數(shù)的工作過程如下步驟 剔除對該文件擁有特權(quán)的特權(quán)用戶 將寫入地址移動(dòng)到文件需要寫入的地方 計(jì)算文件內(nèi)的地址與文件系統(tǒng)中塊的地址的對應(yīng)關(guān)系 寫操作前準(zhǔn)備 24 04 2020 65 Ext2的普通文件讀寫實(shí)現(xiàn) 寫操作前準(zhǔn)備 a 調(diào)用ext2 getblk 得到空閑數(shù)據(jù)塊b 等待可能存在的讀操作完成c 將寫緩沖區(qū)的數(shù)據(jù)復(fù)制到數(shù)據(jù)塊d 調(diào)用update vm cache 將cache中的數(shù)據(jù)同步 更新文件索引結(jié)點(diǎn)中的i size域 設(shè)置索引結(jié)點(diǎn)中與時(shí)間相關(guān)域 比如 文件訪問時(shí)間 修改時(shí)間 更新ppos指針 返回已經(jīng)寫入文件的字節(jié)數(shù) 24 04 2020 66 類Ext2文件系統(tǒng) 結(jié)構(gòu)設(shè)計(jì) Ext2文件系統(tǒng)是一個(gè)實(shí)際可用的文件系統(tǒng) 實(shí)在是太龐大了 為了進(jìn)行簡單的模擬 基于Ext2的思想和算法 設(shè)計(jì)一個(gè)類Ext2的文件系統(tǒng) 實(shí)現(xiàn)Ext2文件系統(tǒng)的一個(gè)功能子集 并且用現(xiàn)有操作系統(tǒng)上的文件來代替硬盤進(jìn)行硬件模擬 設(shè)計(jì)文件系統(tǒng)應(yīng)該考慮的幾個(gè)層次介質(zhì)的物理結(jié)構(gòu)物理操作 設(shè)備驅(qū)動(dòng)程序完成文件系統(tǒng)的組織結(jié)構(gòu) 邏輯組織結(jié)構(gòu) 對組織結(jié)構(gòu)其上的操作為用戶使用文件系統(tǒng)提供的接口類ext2文件系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)塊的定義為簡單起見 邏輯塊大小與物理塊大小均定義為512字節(jié) 由于位圖只占用一個(gè)塊 因此 每個(gè)組的數(shù)據(jù)塊個(gè)數(shù)以及索引結(jié)點(diǎn)的個(gè)數(shù)均確定為512 8 4096 進(jìn)一步 每組的數(shù)據(jù)容量確定為4096 512B 2MB 另外 模擬系統(tǒng)中 假設(shè)只有一個(gè)用戶 故可以省略去文件的所有者ID的域 組描述符為簡單起見 只定義一個(gè)組 因此 組描述符只占用一個(gè)塊 同時(shí) superblock塊省略 其功能由組描述符塊代替 即組描述符塊中需要增加文件系統(tǒng)大小 索引結(jié)點(diǎn)的大小 卷名等原屬于superblock的域 由此可得組描述符的數(shù)據(jù)結(jié)構(gòu)如下 見下頁 24 04 2020 67 類Ext2文件系統(tǒng) 組描述符 structext2 group desc 類型bytes域釋意char 16bg volume name 16 卷名 u162bg block bitmap 保存塊位圖的塊號 u162bg inode bitmap 保存索引結(jié)點(diǎn)位圖的塊號 u162bg inode table 索引結(jié)點(diǎn)表的起始塊號 u162bg free blocks count 本組空閑塊的個(gè)數(shù) u162bg free inodes count 本組空閑索引結(jié)點(diǎn)的個(gè)數(shù) u162bg used dirs count 本組目錄的個(gè)數(shù)char 4bg pad 4 填充 0 xff 合計(jì)32個(gè)字節(jié) 由于只有一個(gè)組 且占用一個(gè)塊 故需要填充剩下的512 32 480字節(jié) 24 04 2020 68 類Ext2文件系統(tǒng) 索引結(jié)點(diǎn) 索引結(jié)點(diǎn)數(shù)據(jù)結(jié)構(gòu)由于容量已經(jīng)確定 文件最大即為2MB 需要4096個(gè)數(shù)據(jù)塊 索引結(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)中 仍然采用多級索引機(jī)制 由于文件系統(tǒng)總塊數(shù)必然小于4096 2 所以只需要13個(gè)二進(jìn)制位即可對塊進(jìn)行全局計(jì)數(shù) 實(shí)際實(shí)現(xiàn)用unsignedint16位變量 即2字節(jié)表示1個(gè)塊號 在一級子索引中 如果一個(gè)數(shù)據(jù)塊都用來存放塊號 則可以存放512 2 256個(gè) 因此 只使用一級子索引可以容納最大的文件為256 512 128KB 需要使用二級子索引 只使用二級子索引時(shí) 索引結(jié)點(diǎn)中的一個(gè)指針可以指向256 256個(gè)塊 即256 256 512 8MB 已經(jīng)可以滿足要求了 為了盡量 像 ext2 也為了簡單起見 索引結(jié)點(diǎn)的直接索引定義6個(gè) 一級子索引定義1個(gè) 二級子索引定義1個(gè) 總計(jì)8個(gè)指針 24 04 2020 69 類Ext2文件系統(tǒng) 索引結(jié)點(diǎn) 索引結(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)定義structext2 inode 類型字節(jié)長度域釋意 u162i mode 文件類型及訪問權(quán)限 u162i blocks 文件的數(shù)據(jù)塊個(gè)數(shù) u324i

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論