linux內(nèi)核完全注釋(課件)第六章_第1頁
linux內(nèi)核完全注釋(課件)第六章_第2頁
linux內(nèi)核完全注釋(課件)第六章_第3頁
linux內(nèi)核完全注釋(課件)第六章_第4頁
linux內(nèi)核完全注釋(課件)第六章_第5頁
已閱讀5頁,還剩50頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

Linux操作系統(tǒng)內(nèi)核分析湘潭大學(xué)信息工程學(xué)院講課內(nèi)容設(shè)備管理簡介硬盤驅(qū)動虛擬盤驅(qū)動塊設(shè)備的操作方式P132圖6-2設(shè)備管理模塊讀處理過程進(jìn)程向緩沖區(qū)模塊提出讀塊(2扇區(qū))請求。緩沖區(qū)模塊檢查該塊是否已經(jīng)被緩沖。如果已經(jīng)被緩沖,則直接返回緩沖的塊;否則,向設(shè)備管理模塊提出讀請求。設(shè)備管理模塊接受請求。如果設(shè)備不忙,則向設(shè)備發(fā)送命令;否則,把請求插入到設(shè)備的請求隊(duì)列中。緩沖區(qū)模塊掛起進(jìn)程。設(shè)備控制器從設(shè)備中讀入數(shù)據(jù)到自己的緩沖區(qū)中,并產(chǎn)生中斷。設(shè)備中斷處理程序把數(shù)據(jù)從控制器緩沖區(qū)讀到內(nèi)存緩沖區(qū),然后喚醒進(jìn)程。P248第267設(shè)備管理模塊寫處理過程緩沖區(qū)模塊決定要回寫被緩沖的塊。如果該塊是臟的,向設(shè)備管理模塊提出寫請求。設(shè)備管理模塊接受請求。如果設(shè)備不忙,則向設(shè)備發(fā)送命令和數(shù)據(jù);否則,把請求插入到設(shè)備的請求隊(duì)列中。緩沖區(qū)模塊掛起進(jìn)程。設(shè)備控制器把數(shù)據(jù)寫入到設(shè)備并產(chǎn)生中斷。設(shè)備中斷處理程序喚醒進(jìn)程。低級讀寫流程根據(jù)緩沖區(qū)頭創(chuàng)建一個(gè)請求隊(duì)列中沒有請求把請求插入到設(shè)備的請求隊(duì)列中向設(shè)備發(fā)送命令是否說明設(shè)備空閑設(shè)備號設(shè)備是通過主設(shè)備號和次設(shè)備號(兩者構(gòu)成了物理設(shè)備號)來進(jìn)行區(qū)分的主設(shè)備號:區(qū)分不同類型的設(shè)備(P131表6-2)次設(shè)備號:區(qū)分相同類型設(shè)備中的個(gè)體邏輯設(shè)備號用于區(qū)分不同的設(shè)備,邏輯設(shè)備號=主設(shè)備號<<8+次設(shè)備號#defineMAJOR(a)(((unsigned)(a))>>8)#defineMINOR(a)((a)&0xff)P395第33、34行邏輯設(shè)備號塊設(shè)備請求項(xiàng)structrequest{ intdev; //邏輯設(shè)備號,-1表示是自由的請求項(xiàng) intcmd;//命令(P395第26—29) interrors;//如果超過MAX_ERRORS,要重置設(shè)備 unsignedlongsector;//要讀或?qū)懙拈_始扇區(qū) unsignedlongnr_sectors;//要讀或?qū)懙臄?shù)量 char*buffer;//數(shù)據(jù)緩沖區(qū)指針 structtask_struct*waiting;//等待請求完成的進(jìn)程隊(duì)列 structbuffer_head*bh;//緩沖區(qū)頭指針 structrequest*next;//同一設(shè)備的下一個(gè)請求項(xiàng)};P131或P134第23行塊設(shè)備請求項(xiàng)數(shù)組為方便查找空閑請求項(xiàng),建立了請求項(xiàng)數(shù)組。 structrequestrequest[NR_REQUEST];//定義在ll_rw_blk.c(P150第21行)

#defineNR_REQUEST 32//定義在blk.h(P134第15行)塊設(shè)備結(jié)構(gòu)每個(gè)塊設(shè)備都有自己的獨(dú)立的請求隊(duì)列。為方便管理隊(duì)列,建立了塊設(shè)備結(jié)構(gòu)。 structblk_dev_struct{ void(*request_fn)(void);//設(shè)備獨(dú)有的請求處理函數(shù)指針 structrequest*current_request; //請求隊(duì)列頭指針}; //blk.h(P134第45行或P130)塊設(shè)備結(jié)構(gòu)Linux支持多種塊設(shè)備,為所有這些塊設(shè)備結(jié)構(gòu)建立了一個(gè)數(shù)組,數(shù)組下標(biāo)就是設(shè)備的主設(shè)備號。structblk_dev_structblk_dev[NR_BLK_DEV]//P151第32行#defineNR_BLK_DEV 7數(shù)據(jù)結(jié)構(gòu)間的關(guān)系P132圖6-1設(shè)備管理模塊接口設(shè)備管理模塊文件管理模塊(緩沖區(qū))ll_rw_block中斷管理模塊hd_interruptfloppy_interrupt初始化模塊blk_dev_inithd_initfloppy_initsetup初始化voidblk_dev_init(void)//定義在ll_rw_blk.c(P153第157行)作用:完成請求項(xiàng)數(shù)組的初始化voidhd_init(void)//定義在hd.c(P146第343行)voidfloppy_init(void)//定義在floppy.c(P168第457行)longrd_init(longmem_start,intlength)//定義在ramdisk.c(P155第52行)低級讀寫操作voidll_rw_block(intrw,structbuffer_head*bh)//定義在ll_rw_blk.c(P153第145行)作用:完成低級讀寫操作參數(shù):rw——讀寫命令 bh——緩沖區(qū)頭指針電梯算法磁頭朝一個(gè)方向運(yùn)動來滿足該方向上最近的請求。當(dāng)該方向上所有的請求都處理完之后,則反方向來處理其它請求。例如:磁頭正在第5柱面處理請求,磁頭向內(nèi)運(yùn)動,其后有5個(gè)請求到達(dá),分別是第7、2、6、1、8柱面上的請求。則處理順序是:567821電梯算法在一般情況下,所有請求都能獲得合適的處理。但是,在極端情況下仍然會造成餓死現(xiàn)象。例如:上例中,如果不斷的有第5柱面之后的處理請求,則第1、2柱面的處理請求會餓死。電梯算法改進(jìn) 57572

5

672567

1

2567128對于請求Q,如果隊(duì)列中存在A1和A2,1、滿足A1<Q<A2,則把Q插入到A1和A2中2、滿足Q<A2<A1,則把Q插入到A1和A2中3、否則插入到隊(duì)列最后IN_ORDER#defineIN_ORDER(s1,s2)((s1)->cmd<(s2)->cmd||((s1)->cmd==(s2)->cmd&&((s1)->dev<(s2)->dev||((s1)->dev==(s2)->dev&&(s1)->sector<(s2)->sector))))P134第40行read、write、reada、writea宏可以簡單理解為s1<s2是否為真add_request(IN_ORDER(tmp,req)||!IN_ORDER(tmp,tmp->next)&&IN_ORDER(req,tmp->next)IN_ORDER(tmp,req)&&IN_ORDER(req,tmp->next)||!IN_ORDER(tmp,tmp->next)&&IN_ORDER(req,tmp->next)tmp<req<req->nextreq<tmp->next<tmpll_rw_block根據(jù)緩沖區(qū)頭創(chuàng)建一個(gè)請求隊(duì)列中沒有請求把請求插入到設(shè)備的請求隊(duì)列中向設(shè)備發(fā)送命令是否說明設(shè)備空閑make_requestP150圖6-4講課內(nèi)容設(shè)備管理簡介硬盤驅(qū)動虛擬盤驅(qū)動硬盤分類按照接口分,硬盤可以分為

IDE(ATA)硬盤 SCSI硬盤 FC硬盤 SATA硬盤

硬盤內(nèi)部結(jié)構(gòu)硬盤參數(shù)表在setup.s中,Linux通過BIOS調(diào)用讀取了硬盤的參數(shù),并保存在物理地址0x90080處(第1塊硬盤)和物理地址0x90090處(第2塊硬盤)。(參見P44表3-3)硬盤參數(shù)表位移大小說明0x002B柱面數(shù)0x021B磁頭數(shù)0x032BAT硬盤為00x052B寫前預(yù)補(bǔ)償柱面號*40x071BAT硬盤為00x081B控制字節(jié)位0未用位4未用位1保留(0)位5有壞區(qū)圖則置1位2允許復(fù)位位6禁止ECC重試位3若磁頭數(shù)大于8則為1,否則為0位7禁止訪問重試0x091BAT硬盤為00x0A1BAT硬盤為00x0B1BAT硬盤為00x0C2B磁頭著陸柱面號0x0E1B每磁道扇區(qū)數(shù)0x0F1B保留硬盤結(jié)構(gòu)structhd_i_struct{ inthead,sect,cyl,wpcom,lzone,ctl;};//定義在hd.c(P139第45行)硬盤分區(qū)表一個(gè)硬盤最多可以分為4個(gè)區(qū),每個(gè)分區(qū)用一個(gè)整數(shù)標(biāo)識(次設(shè)備號) 0對應(yīng)第一個(gè)硬盤 1、2、3、4對應(yīng)第一個(gè)硬盤的四個(gè)分區(qū) 5對應(yīng)第二個(gè)硬盤 6、7、8、9對應(yīng)第二個(gè)硬盤的四個(gè)分區(qū)硬盤邏輯設(shè)備號邏輯設(shè)備號主設(shè)備號次設(shè)備號說明0x30030第一塊硬盤0x3011第一塊硬盤的第一個(gè)分區(qū)0x3022第一塊硬盤的第二個(gè)分區(qū)0x3033第一塊硬盤的第三個(gè)分區(qū)0x3044第一塊硬盤的第四個(gè)分區(qū)0x3055第二塊硬盤0x3066第二塊硬盤的第一個(gè)分區(qū)0x3077第二塊硬盤的第二個(gè)分區(qū)0x3088第二塊硬盤的第三個(gè)分區(qū)0x3099第二塊硬盤的第四個(gè)分區(qū)硬盤分區(qū)表引導(dǎo)程序第1分區(qū)表項(xiàng)第2分區(qū)表項(xiàng)第3分區(qū)表項(xiàng)第4分區(qū)表項(xiàng)0x55AA主引導(dǎo)記錄分區(qū)表引導(dǎo)標(biāo)志開始磁頭號開始扇區(qū)號開始柱面號分區(qū)類型結(jié)束磁頭號結(jié)束扇區(qū)號結(jié)束柱面號起始物理扇區(qū)號分區(qū)扇區(qū)數(shù)量參見P149表6-80x1BE分區(qū)數(shù)據(jù)結(jié)構(gòu)structpartition{ unsignedcharboot_ind; unsignedcharhead; unsignedcharsector; unsignedcharcyl; unsignedcharsys_ind; unsignedcharend_head; unsignedcharend_sector; unsignedcharend_cyl; unsignedintstart_sect; /*startingsectorcountingfrom0*/ unsignedintnr_sects; /*nrofsectorsinpartition*/};參見Hdreg.h(P400第52行)硬盤分區(qū)結(jié)構(gòu)staticstructhd_struct{ longstart_sect; longnr_sects;}hd[5*MAX_HD]={{0,0},};//定義在hd.c(P140第56行)硬盤初始化intsys_setup(void*BIOS)//定義在hd.c(P140第71行)作用:通過讀BIOS調(diào)用的結(jié)果來設(shè)置硬盤數(shù)據(jù)結(jié) 構(gòu)。參數(shù):BIOS——保存硬盤數(shù)據(jù)的內(nèi)存塊地址該函數(shù)在main.c的init函數(shù)中(P66第172行)被調(diào)用硬盤初始化voidhd_init(void)

P146第343硬盤操作的過程向硬盤發(fā)送控制字節(jié)等待控制器處于空閑狀態(tài)等待控制器處于準(zhǔn)備狀態(tài)向控制器數(shù)據(jù)端口和命令端口發(fā)送參數(shù)和命令等待中斷中斷發(fā)生時(shí)檢測處理結(jié)果(讀狀態(tài)控制器),并做其它處理參見P149上硬盤控制器端口I/O端口從端口讀向端口寫0x1f0數(shù)據(jù)寄存器,512B0x1f1錯誤寄存器(參見表6-4)寫前預(yù)補(bǔ)償寄存器0x1f2扇區(qū)數(shù)寄存器0x1f3扇區(qū)號寄存器0x1f4柱面號寄存器0x1f5柱面號寄存器0x1f6驅(qū)動器/磁頭寄存器(101dhhhhd=驅(qū)動器號,h=磁頭號)0x1f7狀態(tài)寄存器(參見表6-5)命令寄存器(參見表6-6)0x3f6控制字節(jié)寄存器P146表6-3向硬盤控制器發(fā)送命令staticvoidhd_out( unsignedintdrive,//硬盤號(0或1) unsignedintnsect,//扇區(qū)數(shù)量 unsignedintsect,//開始扇區(qū) unsignedinthead,//磁頭號 unsignedintcyl,//柱面號 unsignedintcmd,//命令(P148表6-6) void(*intr_addr)(void))//中斷實(shí)施的操作//定義在hd.c(P143第180行),參考P148表6-7中斷操作對于不同的命令,在中斷中實(shí)施的操作也不同。Linux使用一個(gè)函數(shù)指針來記錄要實(shí)施的操作。#defineDEVICE_INTRdo_hd //定義在blk.h(P135第81行) #ifdefDEVICE_INTR void(*DEVICE_INTR)(void)=NULL; #endif //定義在blk.h(P135第96行)對硬盤的操作讀硬盤寫硬盤讀硬盤操作系統(tǒng)硬盤控制器發(fā)送命令發(fā)送中斷發(fā)送中斷READY=1從硬盤讀數(shù)據(jù)從硬盤讀數(shù)據(jù)從控制器的數(shù)據(jù)端口讀數(shù)據(jù)從控制器的數(shù)據(jù)端口讀數(shù)據(jù)寫硬盤操作系統(tǒng)硬盤控制器發(fā)送命令DRQ=1發(fā)送中斷發(fā)送中斷READY=1寫數(shù)據(jù)到硬盤寫數(shù)據(jù)到硬盤向控制器的數(shù)據(jù)端口寫數(shù)據(jù)向控制器的數(shù)據(jù)端口寫數(shù)據(jù)硬盤請求處理函數(shù)voiddo_hd_request(void)//定義在hd.c(P145第294行)作用:處理對于硬盤的請求邏輯扇區(qū)號到CHS的轉(zhuǎn)換在request中保存的是要讀扇區(qū)的邏輯扇區(qū)號,需要轉(zhuǎn)換為磁道號(Cylinder)、磁頭號(Head)和扇區(qū)號(Sector)扇區(qū)是從0磁頭0磁道1扇區(qū)開始編號(邏輯扇區(qū)號0)的,編完后再從1磁頭0磁道1扇區(qū)開始編號。這樣,把0磁道的扇區(qū)編完,再編1磁道。即按照磁道、磁頭、扇區(qū)的順序進(jìn)行編號。邏輯扇區(qū)號到CHS的轉(zhuǎn)換0磁道0磁頭0磁道1磁頭0柱面1柱面邏輯扇區(qū)號=C*(磁頭數(shù)*每磁道扇區(qū)數(shù))+H*每磁道扇區(qū)數(shù)+S-1=(C*磁頭數(shù)+H)*每磁道扇區(qū)數(shù)+S-1S=(邏輯扇區(qū)號mod每磁道扇區(qū)數(shù))+1H=邏輯扇區(qū)號/每磁道扇區(qū)數(shù)mod磁頭數(shù)C=邏輯扇區(qū)號/每磁道扇區(qū)數(shù)/磁頭數(shù)邏輯扇區(qū)號到CHS的轉(zhuǎn)換divl操作數(shù)把edx:eax組成的值除以操作數(shù),商放在eax中,余數(shù)放在edx中edx=0;eax=邏輯扇區(qū)號結(jié)果block=邏輯扇區(qū)號/每磁道扇區(qū)數(shù)

sec=邏輯扇區(qū)號%每磁道扇區(qū)數(shù)edx=0;eax=邏輯扇區(qū)號/每磁道扇區(qū)數(shù)結(jié)果cyl=邏輯扇區(qū)號/每磁道扇區(qū)數(shù)/磁頭數(shù)

head=邏輯扇區(qū)號/每磁道扇區(qū)數(shù)%磁頭數(shù)硬盤中斷voidhd_interrupt(void);//定義在System_call.S(P89第221行)講課內(nèi)容設(shè)備管理簡介硬盤驅(qū)動虛擬盤驅(qū)動根文件系統(tǒng)Linux引導(dǎo)啟動時(shí),默認(rèn)使用的文件系統(tǒng)是根文件系統(tǒng)。其中一般都包括這樣一些子目錄:

/etc:含有一些系統(tǒng)配置文件 /dev:含有設(shè)備特殊文件 /usr:存放庫函數(shù)、手冊和其它一些文件 /usr/bin:存放執(zhí)行程序 /bin:存放執(zhí)行程序 /var:存放系統(tǒng)運(yùn)行時(shí)可變的數(shù)據(jù)或者是日志集成盤通常我們使用軟盤啟動Linux0.11系統(tǒng)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(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

提交評論