版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
操作系統(tǒng)原理實(shí)驗(yàn)考試成績計(jì)算:平時(shí)40分[考勤問答〔5分〕+平時(shí)作業(yè)〔15分〕+大作業(yè)〔20分〕]+期末60分[筆試〔30分〕+機(jī)考〔30分〕]=100分考試形式:開卷筆試+上機(jī)操作〔都可使用實(shí)驗(yàn)室或自己的電腦〕機(jī)考:考試時(shí)間:2015年6月25日〔周四〕上午10:30~12:30考試地點(diǎn):實(shí)驗(yàn)中心B401筆試:考試時(shí)間:2015年6月23日〔周二〕下午2:00~4:00考試地點(diǎn):實(shí)驗(yàn)中心B401筆試題型:填空〔15題,每題2分,共30分〕、問答〔6題,每題5分,共30分〕、編程〔4題,每題10分,共40分〕操作題型:操作磁盤映像和文件〔30分〕、編寫簡單的匯編程序〔30分〕、編寫較復(fù)雜的匯編或/和C程序〔40分,二選一〕復(fù)習(xí)重點(diǎn)與考試要求1實(shí)驗(yàn)環(huán)境1〕要求熟悉虛擬機(jī)、編譯軟件和各種開發(fā)工具的使用,會(huì)創(chuàng)立軟硬磁盤的磁盤映像和FAT12文件結(jié)構(gòu)、編寫和編譯簡單的匯編和C語言程序、將引導(dǎo)程序?qū)懭氪疟P映像的引導(dǎo)扇區(qū)、將可執(zhí)行程序和各種文件寫入帶FAT文件結(jié)構(gòu)的磁盤映像。2〕重點(diǎn)虛擬機(jī):VMware〔Linux/Ubuntu、混合編程〕、Bochs〔運(yùn)行測試〕編譯器:Windows—NASM〔匯編〕,Linux—NASM〔匯編〕、GCC〔C〕、LD〔鏈接〕開發(fā)工具:Windows—NotePad++〔源代碼編輯〕、 WinHex〔二進(jìn)制編輯〕、DiskWriter/FloppyWriter〔寫磁盤映像〕、WinImage〔復(fù)制文件到FAT磁盤映像〕,Linux—gedit〔源代碼編輯〕測試環(huán)境:虛擬機(jī)Bochs、DOS系統(tǒng)軟盤映像、磁盤映像文件〔帶FAT12結(jié)構(gòu)的1.44MB軟盤和10MB硬盤〕、可執(zhí)行文件格式COM/BIN/ELF、虛擬機(jī)配置文件boch2引導(dǎo)1〕要求了解PC機(jī)的引導(dǎo)過程,掌握引導(dǎo)扇區(qū)的結(jié)構(gòu),會(huì)編寫和編譯帶清屏和顯示Hello串功能的簡單匯編引導(dǎo)程序、將引導(dǎo)程序?qū)懭氪疟P映像的引導(dǎo)扇區(qū)、修改Bochs虛擬機(jī)的配置文件、用該磁盤映像啟動(dòng)Bochs虛擬機(jī)進(jìn)行測試。2〕重點(diǎn)引導(dǎo)過程:PC機(jī)加電或重啟→CPU復(fù)位→內(nèi)存清零→內(nèi)存奇偶校驗(yàn)→跳轉(zhuǎn)到地址為FFFF0h處的系統(tǒng)BIOS入口指令,執(zhí)行主板ROM中的例程→檢查各個(gè)端口,識(shí)別并初始化設(shè)備,然后將這些設(shè)備連接到計(jì)算機(jī)上,并提供在設(shè)備上的I/O效勞→創(chuàng)立兩個(gè)數(shù)據(jù)區(qū)〔中斷向量表和BIOS數(shù)據(jù)區(qū)〕→讀啟動(dòng)盤的第一個(gè)物理扇區(qū)〔主引導(dǎo)扇區(qū)〕,如果其最后兩個(gè)字節(jié)為55h和AAh〔引導(dǎo)記錄標(biāo)識(shí)符〕,那么裝入該扇區(qū)到內(nèi)存地址7C00h處,并跳轉(zhuǎn)到7C00h處執(zhí)行[主]引導(dǎo)扇區(qū)〔[Master]BootSector〕是磁盤的第一個(gè)物理扇區(qū)〔512B〕,內(nèi)容為:主引導(dǎo)記錄〔MBR=MasterBootRecord〕:446B,一般為裝入操作系統(tǒng)的引導(dǎo)程序〔通常負(fù)責(zé)加載OS的裝載模塊〕磁盤分區(qū)表〔DPT=DiskPartitionTable〕:4*16=64B,4個(gè)分區(qū)表項(xiàng),每個(gè)16B,軟盤沒有DPT引導(dǎo)記錄標(biāo)識(shí)符〔BRID=BootRecordIdentifier〕:2B,內(nèi)容為55hAAh引導(dǎo)實(shí)驗(yàn)用NotePad++編寫匯編源代碼用org操作符設(shè)置程序的入口地址為7C00h設(shè)置DS和ES=CS〔調(diào)用清屏例程〕調(diào)用顯示字符串例程進(jìn)入無限循環(huán)定義顯示字符串例程——用10h號(hào)中斷的13h號(hào)功能實(shí)現(xiàn)〔彩色〕字符串顯示〔定義清屏例程——用10h號(hào)中斷的6號(hào)功能實(shí)現(xiàn)上滾整個(gè)文本顯示頁〕定義字符串常量〔如“Hello,OSworld!”或其他特定字符串〕及其長度〔*lenequ$-*〕用times偽指令將剩余空間填充為0將引導(dǎo)扇區(qū)的最后2個(gè)字節(jié)設(shè)置為55h和AAh用FloppyWriter/DiskWriter修改Bochs虛擬機(jī)的配置文件,使用a.img作為軟盤A的映像文件,并用軟盤啟動(dòng)啟動(dòng)Bochs虛擬機(jī)進(jìn)行測試3可執(zhí)行文件格式1〕要求掌握常用可執(zhí)行文件格式,掌握ELF的具體結(jié)構(gòu),會(huì)編寫和生成COM和ELF格式的可執(zhí)行文件、運(yùn)行COM程序、分析ELF文件的結(jié)構(gòu)。2〕重點(diǎn)BIN〔binary,二進(jìn)制〕——二進(jìn)制裸格式,無org指令時(shí)程序的入口地址為0,引導(dǎo)程序需用org7C00h指令來指定入口地址。文件的擴(kuò)展名一般為binCOM〔commandfile,命令文件〕——DOS的二進(jìn)制裸格式,不分段,會(huì)被裝載到當(dāng)前段的100h處〔需使用org100h指令,DS=SS=CS、SP=100h-4〕,文件大小必須≤64KB-256B。文件的擴(kuò)展名必須為comELF〔ExecutableandLinkableFormat,可執(zhí)行與可鏈接格式〕——類Unix操作系統(tǒng)的標(biāo)準(zhǔn)二進(jìn)制文件格式。ELF文件由ELF頭、程序頭表、假設(shè)干節(jié)〔section〕和節(jié)頭表組成。程序頭表記載了運(yùn)行時(shí)所需的節(jié),節(jié)頭表那么記載了二進(jìn)制文件中各節(jié)的首地址,它們?cè)贓LF文件中都是可選的。ELF文件可以沒有擴(kuò)展名,也可以使用以下擴(kuò)展名:.o、.so、.elf、.prx、.puff、.bin4FAT文件系統(tǒng)1〕要求掌握DPT/16分區(qū)的具體格式和[E]BPB的概念與結(jié)構(gòu),掌握主引導(dǎo)扇區(qū)和分區(qū)引導(dǎo)扇區(qū)的區(qū)別,了解FAT文件系統(tǒng)的目錄結(jié)構(gòu)和表示方法,掌握文件條目的格式〔包括首字節(jié)含義和文件屬性〕和FAT項(xiàng)值的含義〔包括FAT頭兩項(xiàng)的特殊值——介質(zhì)描述符〕,會(huì)編寫生成軟硬盤FAT12文件結(jié)構(gòu)的匯編程序并將其寫入磁盤映像、能人工識(shí)別和手工編輯文件條目及FAT項(xiàng)〔WinHex〕。2〕重點(diǎn)磁盤分區(qū)磁盤分區(qū)表〔DPT=DiskPartitionTable〕位于〔主〕引導(dǎo)扇區(qū),含4個(gè)分區(qū)表項(xiàng),每一項(xiàng)占16B。只有硬盤〔U盤/固態(tài)盤〕才有磁盤分區(qū)表,軟盤無。如果DPT全為0,那么表示無磁盤分區(qū);有幾個(gè)非0分區(qū)表項(xiàng),就有幾個(gè)磁盤分區(qū)〔卷〕;一個(gè)磁盤最多可有4個(gè)物理分區(qū)〔卷〕分區(qū)類型〔CHS/LBA〕——如0x01=FAT12、0x06/0x0E=FAT16、0x0B/0x0C=FAT32、0x07=NTFS、0x05/0x0F=擴(kuò)展、0x83=Linux、0xEE=GPT〔GUIDPartitionTable,全局唯一標(biāo)識(shí)符分區(qū)表,一種新的磁盤分區(qū)表標(biāo)準(zhǔn),由Intel公司于2010年推出,可突破傳統(tǒng)MBR的2TB限制〕磁盤尋址方式——傳統(tǒng)的CHS〔Cylinder/Head/Sector,柱面/磁頭/扇區(qū)〕、現(xiàn)代的線性尋址方式LBA〔LogicalBlockAddressing,邏輯塊尋址〕,1996年以后推出的硬盤一般都支持LBA。CHS〔512MB〕、LBA28〔128GB〕、LBA48〔128PB=128KTB〕1KB〔千/kilo,103/210〕=1024B、1MB〔兆/mega,106/220〕=1024KB、1GB〔吉/giga,109/230〕=1024MB、1TB〔太/tera,1012/240〕=1024G、1PB〔拍/peta,1015/250〕=1024TB、1EB〔艾/exa,1018/260〕=1024PB、1ZB〔澤/zetta,1021/270〕=1024EBFAT分區(qū)FAT〔FileAllocationTable,文件分配表〕是微軟公司為其操作系統(tǒng)DOS和老式Windows所定義的一套文件系統(tǒng),包括FAT12〔≤32MB〕、FAT16〔≤32MB/2GB〕、FAT32〔≤2TB〕和FAT64/exFAT〔≤64ZB〕等多種具體格式FAT12:在我們的OS實(shí)驗(yàn)中,使用1.44MB軟盤映像和10MB硬盤映像作為測試介質(zhì),它們都采用FAT12文件系統(tǒng)軟盤的格式:CHS=80/2/18每個(gè)FAT項(xiàng)占12位〔1.5B〕、每個(gè)簇只有1個(gè)扇區(qū)、每個(gè)FAT表占9個(gè)扇區(qū)根目錄區(qū)有224條目,占14扇區(qū)無磁盤分區(qū)起始地址——主引導(dǎo)扇區(qū):0〔0#扇區(qū)〕、FAT#1:200h〔1#扇區(qū)〕、FAT#2:1400h〔10#扇區(qū)〕、根目錄區(qū):2600h〔19#扇區(qū)〕、數(shù)據(jù)區(qū):4200h〔33#扇區(qū)〕10MB硬盤的格式:CHS=80/4/63、每個(gè)扇區(qū)有512〔200h〕B、共20160扇區(qū)=10080KB≈每個(gè)FAT項(xiàng)占12位〔1.5B〕、每個(gè)簇有8個(gè)扇區(qū)、每個(gè)FAT表占8個(gè)扇區(qū)根目錄區(qū)有512條目,占32扇區(qū)主引導(dǎo)扇區(qū)的DPT中有唯一分區(qū)表項(xiàng),分區(qū)從第2個(gè)〔1號(hào)〕柱面的首個(gè)扇區(qū)〔4*63=252〕開始起始地址:——主引導(dǎo)扇區(qū):0〔0#扇區(qū)〕、分區(qū)引導(dǎo)扇區(qū):1F800h〔252#扇區(qū)〕、FAT#1:1FA00h〔253#扇區(qū)〕、FAT#2:20A00h〔261#扇區(qū)〕、根目錄區(qū):21A00h〔269#扇區(qū)〕、數(shù)據(jù)區(qū):25A00h〔301#扇區(qū)〕分區(qū)引導(dǎo)扇區(qū)是分區(qū)的第一個(gè)扇區(qū)〔512B〕。因?yàn)檐洷P無DPT,整個(gè)磁盤都是一個(gè)分區(qū),所以其分區(qū)引導(dǎo)扇區(qū)與主引導(dǎo)扇區(qū)重合,都是磁盤的首個(gè)物理扇區(qū);而硬盤必須有DPT,且其各個(gè)分區(qū)必須都從第2個(gè)柱面及其之后的某個(gè)柱面的首個(gè)扇區(qū)開始。所以我們的10MB硬盤的唯一分區(qū),也從第2個(gè)〔1號(hào)〕柱面的首個(gè)扇區(qū)開始,分區(qū)的首個(gè)扇區(qū)〔即分區(qū)引導(dǎo)扇區(qū)〕的序號(hào)為252,主引導(dǎo)扇區(qū)到分區(qū)引導(dǎo)扇區(qū)之間的251個(gè)扇區(qū)〔125.5KB〕都浪費(fèi)了FAT分區(qū)引導(dǎo)扇區(qū)的結(jié)構(gòu):跳轉(zhuǎn)指令〔3B〕、OEM名串〔8B〕、BPB〔BIOSParameterBlock,BIOS參數(shù)塊,25B〕、EBPB〔ExtendedBPB,擴(kuò)展BPB,26B〕、引導(dǎo)程序代碼〔448B〕、有效結(jié)束標(biāo)志〔2B:55AA〕FAT文件系統(tǒng):采用多級(jí)目錄結(jié)構(gòu),子目錄用文件表示。文件數(shù)據(jù)塊的大小為簇,采用鏈?zhǔn)酱鎯?chǔ)〔FAT項(xiàng)為指向下一簇的鏈指針/下一簇號(hào)〕,磁盤的空閑空間管理采用空閑塊列表〔FAT項(xiàng)為0表示對(duì)應(yīng)簇為空閑〕。目錄為文件條目的列表,每個(gè)條目占用32B〔20h字節(jié)〕文件條目格式:8+3文件名〔11B,英文字母必須大寫〕、文件屬性〔1B〕、保存〔10B〕、時(shí)間〔2B〕、日期〔2B〕、開始簇號(hào)〔2B〕、文件大小〔4B〕首字節(jié)含義:0—未使用、2Eh—點(diǎn)條目、E5h—已刪條目、05—E5h文件屬性〔可位或〕:00—普通文件、01—只讀、02—隱藏、04—系統(tǒng)、08—卷標(biāo)、10h—子目錄、20h—檔案FAT項(xiàng)FAT是映射到分區(qū)中每個(gè)簇〔cluster〕的項(xiàng)〔entry〕列表FAT12的每個(gè)項(xiàng)占12位〔1.5B〕FAT項(xiàng)取值的含義:000—空閑簇、001—保存簇、002~FEF—被占用簇〔值為下一簇的序號(hào)〕、FF0~FF6—保存值、FF7—壞簇、FF8~FFF—文件最后簇〔一般取FFF〕FAT表的前兩個(gè)項(xiàng)保存特殊的值:項(xiàng)0的低8位〔首字節(jié)〕為介質(zhì)描述符〔軟盤為F0h、硬盤/U盤/固態(tài)盤為F8h〕、其余位全為1,項(xiàng)1=結(jié)束簇標(biāo)記,F(xiàn)AT12的前兩項(xiàng)〔3B〕的值〔十六進(jìn)制〕為F0FFFF5DOS1〕要求了解DOS操作系統(tǒng)的特點(diǎn)、組成、版本和系統(tǒng)盤映像文件,掌握常用的DOS內(nèi)外部命令的使用方法,會(huì)用TYPE和EDIT生成文本文件、用XCOPY復(fù)制文件目錄。2〕重點(diǎn)DOS〔DiskOperatingSysytem,磁盤操作系統(tǒng)〕是PC機(jī)的傳統(tǒng)操作系統(tǒng),單用戶、單任務(wù)、字符界面,運(yùn)行在16位實(shí)模式〔沒有保護(hù)功能,最大RAM內(nèi)存空間只有640KB〕,命令行不區(qū)分字母的大小寫。FreeDOS是一種自由開源的兼容DOS操作系統(tǒng),由JimHall領(lǐng)導(dǎo)一個(gè)團(tuán)隊(duì)于1994年中開始開發(fā),目前最新的是2012年1月2日推出的1.1版,其系統(tǒng)軟盤映像文件為FDOS11.img。MS-DOS6.22是微軟公司于1994年6月推出的一個(gè)DOS最后銷售版本,其系統(tǒng)軟盤映像文件為MSDOS622.img。組成:FreeDOS:內(nèi)核文件KERNEL.SYS和命令文件COMMAND。它們須用DOS的外部命令SYS復(fù)制到其他磁盤,才能生成DOS的啟動(dòng)盤配置文件CONFIG.SYS,初始化批處理文件AUTOEXEC.BAT。內(nèi)部命令:指COMMAND中包含的命令,提供DOS的一些根本功能。其中常用的有:X:〔改變當(dāng)前卷為X〕、CD〔改變當(dāng)前目錄〕、DIR〔列出目錄〕、MD〔創(chuàng)立目錄〕、DEL〔刪除文件〕、REN〔修改文件名〕、PATH〔設(shè)置路徑〕、TYPE〔顯示文件內(nèi)容〕、CLS〔清屏〕、VER〔版本〕等,可用“命令/?”獲取命令格式和使用方法的幫助信息。外部命令:操作系統(tǒng)提供的獨(dú)立的可執(zhí)行文件,常用的有:SYS〔傳遞系統(tǒng)文件〕、FDISK〔創(chuàng)立分區(qū)〕、FORMAT〔格式化磁盤〕、XCOPY〔復(fù)制目錄〕、DELTREE〔刪除目錄〕、MOVE〔移動(dòng)文件〕、EDIT〔仿圖形界面的文本編輯器〕、MOUSE〔啟用鼠標(biāo)〕等。生成文本文件TYPE內(nèi)部命令和I/O重定向:typecon>*.txt,按Ctrl+C組合鍵退出。Edit外部命令:仿圖形界面的文本編輯程序edit.exe。XCOPY外部命令:如A:\>xcopytestb:\/s6文件加載1〕要求掌握根目錄文件加載的方法和步驟,會(huì)編寫加載FAT12軟硬盤根目錄中的LOADER.BIN文件的匯編代碼。2〕重點(diǎn)設(shè)當(dāng)前扇區(qū)號(hào)為根目錄的起始扇區(qū)號(hào)讀根目錄的當(dāng)前扇區(qū)到內(nèi)存中的加載地址依次比擬當(dāng)前扇區(qū)中各個(gè)文件條目〔共16個(gè)〕中的文件名串與“”假設(shè)無相等的文件條目,前扇區(qū)號(hào)加1,轉(zhuǎn)到2假設(shè)找到相等的文件條目,從該條目獲取起始簇號(hào)N利用文件的首簇號(hào)及FAT項(xiàng)來確定文件各數(shù)據(jù)塊的位置,并利用磁盤中斷將數(shù)據(jù)塊復(fù)制到指定內(nèi)存計(jì)算出簇號(hào)N所對(duì)應(yīng)的裝載文件的扇區(qū)號(hào)調(diào)用讀扇區(qū)函數(shù)將裝載文件的當(dāng)前扇區(qū)讀到內(nèi)存中加載地址的當(dāng)前扇區(qū)由當(dāng)前簇號(hào)值N計(jì)算其對(duì)應(yīng)FAT項(xiàng)在FAT表中的偏移地址D〔=N*1.5B〕,由D值計(jì)算出FAT項(xiàng)所在扇區(qū)的序號(hào)K〔=FAT起始扇區(qū)號(hào)+D/512〕和偏移值O〔=D%512〕調(diào)用讀扇區(qū)函數(shù)將磁盤的〔FAT表中的〕K號(hào)和K+1號(hào)兩個(gè)扇區(qū)〔因?yàn)橐粋€(gè)FAT項(xiàng)可能跨越兩個(gè)扇區(qū)〕讀入內(nèi)存緩沖區(qū)〔8F000h〕利用偏移值O獲取FAT項(xiàng)值N〔=文件下一個(gè)簇的序號(hào)〕假設(shè)N<FF8h,那么轉(zhuǎn)到6假設(shè)N>=FF8h,那么文件已經(jīng)讀完,跳轉(zhuǎn)到裝載程序7實(shí)模式下的進(jìn)程調(diào)度1〕要求掌握實(shí)模式下進(jìn)程調(diào)度的方法和步驟,包括編寫應(yīng)用程序〔直接改寫顯存來顯示字符〕、重寫裝入程序以加載內(nèi)核和各應(yīng)用程序、定義PCB表數(shù)組、設(shè)置時(shí)鐘中斷頻率、在時(shí)鐘中斷處理程序中保存上下文存放器值并調(diào)用進(jìn)程調(diào)度程序、三種棧及棧的切換、進(jìn)程切換,會(huì)編寫〔多個(gè)〕應(yīng)用程序、〔軟硬盤〕裝入程序、時(shí)鐘中斷處理程序和〔多個(gè)〕進(jìn)程間的調(diào)度程序的匯編代碼。2〕重點(diǎn)方法和功能:采用匯編語言,利用計(jì)時(shí)器,實(shí)現(xiàn)實(shí)模式下多個(gè)進(jìn)程間的簡單切換用戶進(jìn)程:編寫三個(gè)功能相同的應(yīng)用程序,分別在各自行的當(dāng)前位置重復(fù)顯示字符A、B、C顯示字符的方法:為了以防止中斷重入,不調(diào)用顯示中斷int10h,而是采用直接改寫文本窗口所對(duì)應(yīng)顯存內(nèi)容的方法來顯示字符延時(shí):為便于測試觀察,〔因?yàn)镃PU速度太快〕需使用延時(shí)循環(huán)裝入內(nèi)核程序和應(yīng)用程序:重寫操作系統(tǒng)的裝入程序loader.asm,使其能夠裝入內(nèi)核程序kernel.bin和假設(shè)干應(yīng)用程序〔在本實(shí)驗(yàn)里是a.bin、b.bin、c.bin〕。為簡單,各應(yīng)用程序也放在磁盤映像的根目錄PCB:應(yīng)用程序PCB〔ProcessControlBlock,進(jìn)程控制塊〕的內(nèi)容不多〔42B〕,主要有〔在實(shí)模式下〕恢復(fù)進(jìn)程運(yùn)行所必需的進(jìn)程狀態(tài)〔16個(gè)16位〕上下文存放器,即CPU中的8個(gè)通用存放器〔包括4個(gè)數(shù)據(jù)存放器和4個(gè)指針存放器〕、6個(gè)段存放器、1個(gè)標(biāo)志存放器和1個(gè)指令指針存放器IP中的當(dāng)前值,以及進(jìn)程的ID和名串存放器壓棧:標(biāo)志存放器FLAGS、代碼段存放器CS和指令指針存放器IP,由處理器在中斷發(fā)生時(shí)自動(dòng)依次壓入當(dāng)前應(yīng)用程序棧中。8個(gè)通用存放器和4個(gè)數(shù)據(jù)和輔助段存放器,由時(shí)鐘中斷處理程序在最開始處用PUSHA指令〔一起壓,順序:AX、CX、DX、BX、SP[原來的值]、BP、SI、DI,對(duì)應(yīng)的出棧指令為POPA〕和PUSH指令〔逐個(gè)壓,順序:DS、ES、FS、GS〕壓棧。只有堆棧段存放器SS,需由調(diào)度程序另外手工賦值進(jìn)程調(diào)度中的棧問題三種棧:進(jìn)程調(diào)度需要使用大量棧操作,而且涉及到三種不同的棧:應(yīng)用程序棧、進(jìn)程表?xiàng)?、?nèi)核棧。其中的進(jìn)程表?xiàng)!参挥趦?nèi)核程序的數(shù)據(jù)段中〕,只是為了保存和恢復(fù)進(jìn)程的上下文存放器值,而臨時(shí)設(shè)置的一個(gè)偽局部棧,不是正常的程序棧上下文存放器被壓入被中斷進(jìn)程棧:在時(shí)鐘中斷發(fā)生時(shí),實(shí)模式下的CPU會(huì)將存放器FLAGS、CS、IP的當(dāng)前值先后壓入當(dāng)前被中斷程序〔應(yīng)用程序進(jìn)程X〕的堆棧中,接著跳轉(zhuǎn)到〔位于kernel內(nèi)〕時(shí)鐘中斷處理程序〔Timer函數(shù)〕執(zhí)行。注意,此時(shí)并沒有改變堆?!驳腟S和SP〕,內(nèi)核里的時(shí)鐘中斷處理函數(shù)開始處的保存上下文存放器壓棧操作,使用的也是被中斷進(jìn)程的棧復(fù)制被中斷進(jìn)程棧中保存的上下文存放器值到對(duì)應(yīng)的PCB中:再利用重復(fù)字串傳送指令REPMOVSW〔以CX為計(jì)數(shù)值,它將DS:SI處的字傳送到ES:DI處,并SI+=2、DI+=2、CX--,直到CX=0〕將在當(dāng)前進(jìn)程棧中的15個(gè)存放器值復(fù)制到位于內(nèi)核的進(jìn)程表的對(duì)應(yīng)PCB中〔只缺棧段存放器SS〕棧切換:為了能夠同時(shí)完成進(jìn)程切換和棧切換,可先切換到下一進(jìn)程的棧,再將返回指令RETF〔=POPIP、POPCS〕所需的IP和CS的值,預(yù)先壓入此棧中,在從下一進(jìn)程的PCB恢復(fù)了上下文存放器值后,再使用RETF指令進(jìn)行進(jìn)程切換8命令行1〕要求了解CMD程序的簡化約定,熟悉CMD程序的主要步驟,掌握內(nèi)/外部命令的處理方法。會(huì)自己添加內(nèi)部命令。2〕重點(diǎn)主要簡化約定:實(shí)模式、單道程序設(shè)計(jì)、FAT12文件系統(tǒng)、根目錄、8+3文件名、 不支持命令參數(shù)和命令行編輯、不支持DOS軟中斷、21H號(hào)DOS中斷僅用于退出程序切換當(dāng)前盤時(shí)判斷目標(biāo)磁盤是否存在:利用13H號(hào)磁盤中斷的0號(hào)〔磁盤復(fù)位〕功能命令行主循環(huán):顯示提示串、獲取鍵盤輸入的命令串行、確定命令串長度、轉(zhuǎn)換成大寫字母、構(gòu)造COM文件名串、判斷是否為內(nèi)部命令,如果是,那么執(zhí)行之,否那么查找和執(zhí)行外部命令〔COM文件〕獲取鍵入命令行串:用16H號(hào)鍵盤中斷的0號(hào)功能來讀按鍵用10H號(hào)顯示中斷的0EH號(hào)功能來回顯鍵入的字符到屏幕用REPSTOSB復(fù)合指令進(jìn)行命令行緩沖區(qū)buf的初始化〔用空格/20H填充〕用REPNESCASB復(fù)合指令確定命令串長度〔查找首個(gè)空格/20H〕將命令串的小寫英文字母轉(zhuǎn)換成大寫的〔-20H/ASCII表〕查找和執(zhí)行內(nèi)部命令:創(chuàng)立內(nèi)部命令串?dāng)?shù)組cmdstr和內(nèi)部命令例程的入口地址數(shù)組cmdaddr用REPCMPSB復(fù)合指令在命令串?dāng)?shù)組中尋找與命令行串匹配的內(nèi)部命令串由命令串序號(hào)〔*2=SHL1〕確定內(nèi)部命令例程的入口地址在數(shù)組中的偏移量用CALLNEAR[cmdaddr+偏移量]執(zhí)行指定的內(nèi)部命令查找和執(zhí)行外部命令:由命令行串+“COM”構(gòu)造8+3的COM文件名串在磁盤根目錄中尋找COM文件將COM文件加載到內(nèi)存的40100H處跳轉(zhuǎn)執(zhí)行COM程序〔JMP4000H:100H〕顯示磁盤和文件信息〔DIR內(nèi)部命令〕:讀入磁盤的主引導(dǎo)扇區(qū)〔DPT〕和分區(qū)引導(dǎo)扇區(qū)〔BPB〕顯示BPB參數(shù)信息串循環(huán)讀入FAT12磁盤的根目錄扇區(qū)顯示根目錄中的文件條目信息〔文件名、文件大小、修改日期和時(shí)間〕輔助例程:DispStr——在當(dāng)前位置顯示字符串〔用10H顯示中斷的3號(hào)功能獲取當(dāng)前位置,用10H顯示中斷的13H號(hào)功能顯示字符串〕GetDigStr——獲取16位整數(shù)值〔AX〕的十進(jìn)制數(shù)串〔采用16位除法〕getsizestr——計(jì)算文件大小〔32位整數(shù)值〕的十進(jìn)制串〔采用32位除法〕ReadSec——讀磁盤扇區(qū)〔適用于各種參數(shù)的FAT12/16軟硬盤〕9Linux1〕要求掌握Linux的根本使用方法〔包括文件根本操作、磁盤映象掛載、軟件安裝〕,了解Linux的文件權(quán)限。2〕重點(diǎn)環(huán)境:在VMware虛擬機(jī)中安裝和使用Linux的Ubuntu版本目的:了解類Unix操作系統(tǒng)的功能和使用方法、實(shí)現(xiàn)ELF格式的匯編與C混合編程終端命令行提示串的格式為:用戶名@主機(jī)名:當(dāng)前目錄提示符提示符:普通用戶的提示符為美元符‘$’、管理員Administrator和根root用戶的提示符為井號(hào)符‘#’‘~’表示主文件目錄常用命令獲取命令的幫助信息:help〔幫助〕、info〔信息〕和man〔手冊(cè)〕。文件操作:mkdir〔創(chuàng)立目錄〕、ls〔列出文件目錄〕、cd〔改變當(dāng)前目錄〕、cat〔顯示文件內(nèi)容〕、cp〔復(fù)制文件和目錄〕、chmod〔設(shè)置文件權(quán)限〕掛載〔綁定〕磁盤文件系統(tǒng):mount〔掛載〕、umount〔卸載〕安裝軟件:apt-getinstall〔如安裝GCC和NASM:sudoapt-getinstallbuild-essentialnasm〕文件類型:-普通、d目錄、l鏈接、b塊設(shè)備〔如硬盤〕、c字符設(shè)備〔如鍵盤〕、s網(wǎng)絡(luò)套接字、p管道文件權(quán)限三種分組:屬主權(quán)限、屬組權(quán)限、其他人權(quán)限三種權(quán)限〔用三個(gè)二進(jìn)制位表示,從高到低為〕:r讀=4、 w寫=2、x執(zhí)行=110匯編與C混合編程1〕要求掌握混合編程的方法和步驟、Make文件的編寫和使用。會(huì)進(jìn)行匯編與C混合編程,會(huì)編寫和使用Make文件來自動(dòng)化生成可執(zhí)行程序及操作磁盤映象。2〕重點(diǎn)操作系統(tǒng)一般采用匯編和C語言編寫??刂朴布虸/O設(shè)備等底層代碼使用低級(jí)的匯編語言,實(shí)現(xiàn)算法和API等高層邏輯操作那么使用中級(jí)語言C步驟簡單程序編譯運(yùn)行的主要步驟:用gedit編寫匯編和C程序的源代碼〔在匯編程序中,用extern和global語句,導(dǎo)出和導(dǎo)入函數(shù),利用棧傳遞參數(shù)[逆序壓棧]〕用NASM編譯匯編語言源程序,如:用GCC編譯C語言源程序,如:用ld命令鏈接,如:ld-sfoo.obar.o-ofoobar在Shell終端中運(yùn)行,如:./foobar復(fù)雜程序編譯掛載的主要步驟:在Windows中用NotePad++編寫匯編和C語言源程序以及Make文件〔也可以利用Ubuntu中的gedit進(jìn)行編寫〕將a.img、源文件和Make文件復(fù)制到Ubuntu的主文件夾創(chuàng)立掛載目錄,如sudomkdir/mnt/floppy使用Make文件,如makeall和makeimage編譯鏈接生成可執(zhí)行文件〔可在LD鏈接時(shí),用-Ttext開關(guān)來指定生成的可執(zhí)行程序裝入特定的內(nèi)存地址[類似于匯編程序的ORG偽指令]〕掛載軟盤映像,如sudomount-oloopa.img/mnt/floppy復(fù)制可執(zhí)行文件到軟盤映像,如/mnt/floppy卸載軟盤映像〔將緩沖區(qū)中的內(nèi)容回寫到軟盤映像,即保存文件〕,如sudoumount/mnt/floppyMake文件:make是類Unix操作系統(tǒng)〔包括Linux〕和高級(jí)語言〔如C/C++語言〕的標(biāo)準(zhǔn)程序自動(dòng)生成工具,makefile〔Make文件〕是make程序的描述/配置文件Make文件的功能符:#開頭的行為注釋行、=用來定義變量、$(變量名)用來使用變量、:用來定義目標(biāo)〔格式為:目標(biāo):先決條件序列〔換行〕命令。只有在先決條件中至少有一個(gè)文件比目標(biāo)文件新時(shí),或目標(biāo)不存在時(shí),才執(zhí)行命令〕、$@代表目標(biāo)、$<代表第一個(gè)先決條件11保護(hù)模式下的異常與中斷處理1〕要求了解保護(hù)模式下中斷處理機(jī)制的改變。掌握四種門描述符的概念、大小、結(jié)構(gòu)和功用。了解TSS、TSS描述符和TSS段選擇符的概念、功用和關(guān)系。掌握IDT的概念、內(nèi)容和功用。掌握IDTR的概念、大小、結(jié)構(gòu)、功用和裝入方法。掌握保護(hù)模式下的中斷控制器的初始化要求。會(huì)創(chuàng)立IDT、設(shè)置中斷控制器、定義時(shí)鐘中斷處理程序和對(duì)應(yīng)的中斷門描述符。2〕重點(diǎn)保護(hù)模式下的IA-32處理器,對(duì)中斷的響應(yīng)機(jī)制發(fā)生了很大變化。單純?nèi)肟诘刂返闹袛嘞蛄勘粡?fù)雜的〔入口地址+假設(shè)干屬性控制位的〕門描述符〔gatedescriptor〕代替,簡單的中斷向量表IVT也被復(fù)雜的IDT〔InterruptDescriptorTable,中斷描述符表〕代替門與中斷:在保護(hù)模式下,門〔gate〕可用于異常和中斷處理,還可用于任務(wù)和CPU運(yùn)行狀態(tài)〔特權(quán)級(jí)〕的切換IA-32的四種門:任務(wù)門〔用于任務(wù)切換〕、中斷門〔用于中斷處理,CPU會(huì)去除中斷允許標(biāo)志IF〕、陷阱門〔用于異常處理,CPU不會(huì)去除中斷允許標(biāo)志IF〕、調(diào)用門〔用于改變優(yōu)先級(jí)〕〔64位的〕任務(wù)門描述符提供對(duì)任務(wù)的受保護(hù)的間接引用,可置于GDT、LDT或IDT中,其數(shù)據(jù)結(jié)構(gòu)的主要內(nèi)容為16位的TSS段選擇符和4位類型〔必須=0101[=5]〕與1位P屬性。GDT、LDT或IDT中的任務(wù)門可指向同一任務(wù)〔在GDT中的TSS描述符,從而同一TSS〕TSS〔Task-StateSegment,任務(wù)狀態(tài)段〕:用于保護(hù)任務(wù)運(yùn)行現(xiàn)場的一種數(shù)據(jù)結(jié)構(gòu),用于任務(wù)切換。對(duì)應(yīng)的TSS描述符〔只能〕位于GDT中,任務(wù)門描述符中的TSS段選擇符就是指向GDT中的TSS描述符的其他三種門描述符〔64位〕的數(shù)據(jù)結(jié)構(gòu)是類似的〔只是其中的4b類型屬性值不同:中斷門=1110[=14]、陷阱門=1111[=15]、調(diào)用門=1100[=12]〕:16位段選擇符、32位偏移量、16位的屬性和參數(shù)個(gè)數(shù)IDT原來實(shí)模式下的中斷處理程序,在保護(hù)模式下已經(jīng)不能再運(yùn)行實(shí)模式下的中斷向量表IVT〔InterruptVectorTable〕被保護(hù)模式下的中斷描述符表IDT〔InterruptDescriptorTable〕所替代IVT是由主板上ROM中的啟動(dòng)代碼〔在加計(jì)算機(jī)電之后、裝入主引導(dǎo)扇區(qū)之前〕自動(dòng)創(chuàng)立好的,位于內(nèi)存的最低端〔0~1023〕,占1KB。IVT含256個(gè)中斷向量,每個(gè)向量4字節(jié)〔32位〕,內(nèi)容為對(duì)應(yīng)的中斷處理程序的入口地址CS:IPIDT那么需在進(jìn)入保護(hù)模式后我們自己來創(chuàng)立,IDT是系統(tǒng)的關(guān)鍵結(jié)構(gòu)〔本身不是一個(gè)段〕,其起始地址〔基址〕和界限〔段長〕由48位的〔用LIDT指令裝入〕系統(tǒng)存放器IDTR決定IDT為〔中斷、陷阱、任務(wù)〕門描述符的列表,每個(gè)門描述符為8字節(jié)〔64位〕,內(nèi)容主要為中斷處理程序入口的16位段選擇符和32位偏移量〔還有8位參數(shù)個(gè)數(shù)和8位屬性值〕中斷發(fā)生后,CPU根據(jù)中斷號(hào)*8+IDTR中的基址=對(duì)應(yīng)門描述符位置,再由該門描述符中的段選擇符和偏移量得到中斷程序入口地址,來調(diào)用對(duì)應(yīng)的中斷處理程序可以用Gate宏來創(chuàng)立門描述符,用CPU的特權(quán)指令lidt[IdtPtr]來加載預(yù)先準(zhǔn)備好的48位結(jié)構(gòu)〔16位界限+32位基址〕的指針I(yè)dtPtr中斷控制器:在保護(hù)模式下,IDT中0~1Fh號(hào)中斷已經(jīng)被保存給特定的異常〔exception〕使用,硬件中斷程序只能使用≥20h〔32〕的表項(xiàng)。所以主8259A的IRQ0〔對(duì)應(yīng)于時(shí)鐘中斷〕不能再對(duì)應(yīng)于8號(hào)中斷向量,必須在初始化時(shí)重新設(shè)置。如將主8259A的IRQ0的邏輯中斷號(hào)設(shè)置為20h〔首個(gè)可由用戶定義的中斷向量號(hào)〕,從8259A的IRQ8對(duì)應(yīng)中斷向量28h。還需同時(shí)將IDT中第20h中斷門描述符中的段選擇符指向內(nèi)核程序段、偏移地址指向時(shí)鐘中斷處理程序的入口處計(jì)時(shí)器:在保護(hù)模式下,為了進(jìn)行進(jìn)程調(diào)度,也可將計(jì)時(shí)器8253的中斷頻率設(shè)置為每秒100次異常和中斷處理的混合編程:可以使用C語言代碼來代替局部匯編程序,實(shí)現(xiàn)保護(hù)模式下的異常和中斷處理12保護(hù)模式下的進(jìn)程調(diào)度1〕要求了解保護(hù)模式下的裝載程序增加的內(nèi)容〔包括分兩步加載ELF格式的內(nèi)核程序〕,掌握TSS、TSSD和TR的概念、大小、內(nèi)容和結(jié)構(gòu),理解保護(hù)模式下CALL和RET指令的工作工程,掌握利用調(diào)用門進(jìn)行代碼轉(zhuǎn)移的方法〔CALL指令可以完成從低特權(quán)級(jí)到高特權(quán)級(jí)的轉(zhuǎn)移,而RET指令那么可以實(shí)現(xiàn)由高特權(quán)級(jí)到低特權(quán)級(jí)的轉(zhuǎn)移〕,理解保護(hù)模式下的進(jìn)程調(diào)度的方法和過程〔包括TSS和堆棧切換〕。會(huì)編寫保護(hù)模式下進(jìn)程調(diào)度的相關(guān)代碼〔包括進(jìn)入保護(hù)模式、啟動(dòng)分頁機(jī)制、獲取并顯示內(nèi)存信息、裝載內(nèi)核程序、創(chuàng)立應(yīng)用程序、定義PCB表、定義IDT和時(shí)鐘中斷處理程序、定義LDT和填充TSS、進(jìn)行進(jìn)程切換〕2〕重點(diǎn)裝載程序保護(hù)模式下的裝載程序仍然是名為loader.asm的匯編語言程序,其主要功能還是從FAT12軟盤中加載內(nèi)核程序kernel.bin。但是現(xiàn)在要改用保護(hù)模式,需要增加獲取內(nèi)存信息、進(jìn)入保護(hù)模式、啟動(dòng)分頁機(jī)制等匯編代碼由于內(nèi)核程序kernel.bin采用了ELF格式,所以其加載分兩步進(jìn)行:先裝載kernel.bin文件到內(nèi)存的一個(gè)臨時(shí)區(qū)域,再根據(jù)其ELF結(jié)構(gòu)中的內(nèi)容,加載其中的可裝入代碼段和數(shù)據(jù)段到指定內(nèi)存位置TSS與代碼轉(zhuǎn)移在保護(hù)模式下,通過調(diào)用門的遠(yuǎn)調(diào)用〔非一致代碼段〕,CALL指令執(zhí)行前后的堆棧已經(jīng)不再是同一個(gè)了。調(diào)用涉及到兩個(gè)堆?!{(diào)用者堆棧A和被調(diào)用者堆棧B。IA-32處理器提供了一種機(jī)制〔TSS〕,將堆棧A中的假設(shè)干內(nèi)容復(fù)制到堆棧B中TSS〔Task-StateSegment,任務(wù)狀態(tài)段〕,可用于任務(wù)的堆棧切換及保存任務(wù)的運(yùn)行現(xiàn)場,大小為104個(gè)字節(jié)。TSS中包含了SS0~2/ESP0~2三套棧指針,分別用于當(dāng)前程序向更高特權(quán)級(jí)〔為0~2〕的代碼段轉(zhuǎn)移。除了堆棧信息外,TSS中還有被掛起任務(wù)的16個(gè)上下文存放器和假設(shè)干靜態(tài)字段:LDT段選擇符、指向頁目錄基址的三號(hào)控制存放器CR3、I/O位圖基址〔包含一個(gè)從TSS基地址到I/O許可位圖和中斷重定向位圖的16位偏移〕、T〔調(diào)試陷阱〕標(biāo)志。TSS中的“前一任務(wù)鏈接”字段中包含前一個(gè)任務(wù)的TSS段選擇符,在由調(diào)用、中斷或異常引起的任務(wù)切換時(shí)更新。該字段〔常稱做返回鏈接字段〕允許調(diào)用IRET指令切換回前一個(gè)任務(wù)轉(zhuǎn)移過程:使用調(diào)用門進(jìn)行代碼轉(zhuǎn)移分成兩局部:CALL指令可以完成從低特權(quán)級(jí)到高特權(quán)級(jí)的轉(zhuǎn)移,而RET指令那么可以實(shí)現(xiàn)由高特權(quán)級(jí)到低特權(quán)級(jí)的轉(zhuǎn)移CPU在通過調(diào)用門進(jìn)行代碼轉(zhuǎn)移時(shí),執(zhí)行CALL指令所做工作的主要步驟:根據(jù)目標(biāo)代碼段的DPL〔新的CPL〕,從TSS中選擇切換至哪對(duì)SS和ESP暫時(shí)保存當(dāng)前的SS和ESP的值。加載新的SS和ESP,切換到新棧。將剛剛保存的SS和ESP的值壓入新棧。將調(diào)用者堆棧中的調(diào)用參數(shù)復(fù)制到被調(diào)用者的〔新〕堆棧中。復(fù)制參數(shù)的數(shù)目由調(diào)用門中的參數(shù)個(gè)數(shù)字段的值確定。假設(shè)該值為0,那么不復(fù)制參數(shù)。將當(dāng)前的CS和EIP壓入新棧。加載調(diào)用門中指定的新CS和EIP,開始執(zhí)行被調(diào)用過程CPU在由被調(diào)用者返回調(diào)用者時(shí),執(zhí)行RET指令所做工作的主要步驟:檢查保存在堆棧中段選擇符CS中的RPL,以判斷返回時(shí)是否要進(jìn)行特權(quán)級(jí)變換。加載被調(diào)用者堆棧上的CS和EIP〔此時(shí)會(huì)進(jìn)行代碼段描述符和選擇符的類型和特權(quán)級(jí)的檢驗(yàn)〕。如果RET指令帶有參數(shù)n〔必須與對(duì)應(yīng)調(diào)用門中參數(shù)個(gè)數(shù)字段的值一致〕,那么增加ESP的值以跳過n個(gè)參數(shù)。此時(shí)ESP指向保存在棧中的調(diào)用者SS和ESP加載SS和ESP,切換到調(diào)用者堆?!泊藭r(shí)會(huì)進(jìn)行SS選擇符、ESP和SS段描述符的檢驗(yàn)〕假設(shè)RET指令帶有參數(shù)n,那么增加ESP的值以跳過n個(gè)參數(shù)〔此時(shí)已經(jīng)在調(diào)用者堆棧中〕代碼轉(zhuǎn)移〔ring0→ring3〕:為了實(shí)現(xiàn)從當(dāng)前特權(quán)級(jí)為0的操作系統(tǒng)內(nèi)核代碼段到特權(quán)級(jí)為3的目標(biāo)代碼段ring3的轉(zhuǎn)移,需要先將ring3的SS、ESP、CS和EIP依次壓?!惨?yàn)闆]有調(diào)用參數(shù),所以不需要參數(shù)壓?!?,再利用〔不帶參數(shù)n的〕遠(yuǎn)調(diào)用返回指令RETF實(shí)現(xiàn)代碼轉(zhuǎn)移,同時(shí)也完成了從特權(quán)級(jí)0到特權(quán)級(jí)3的轉(zhuǎn)換調(diào)用門〔ring3→ring0〕:先定義特權(quán)級(jí)為3的調(diào)用門描述符〔置于GDT中,段選擇符SelectorCallGateTest指向它〕,再定義特權(quán)級(jí)為0的32位非一致目標(biāo)代碼段〔調(diào)用門描述符中的目標(biāo)選擇符指向它〕,ring3程序中的遠(yuǎn)程調(diào)用語句callSelectorCallGateTest:0,使代碼段通過調(diào)用門發(fā)生代碼轉(zhuǎn)移,同時(shí)也完成了從特權(quán)級(jí)3到特權(quán)級(jí)0的轉(zhuǎn)換任務(wù)存放器TR〔TaskRegister〕四個(gè)系統(tǒng)表指針存放器之一〔其余三個(gè)分別為GDTR、LDTR和IDTR〕80位的TR用于保存當(dāng)前任務(wù)TSS的16位段選擇符〔指向GDT中的TSS描述符〕和64位的任務(wù)段描述符TSSD〔含32位基地址[TSS的起始線性地址]、20位段界限和12位的描述符屬性〕,TSSD只能位于GDT中TR〔的段選擇符局部〕可用裝載任務(wù)存放器的特權(quán)指令LTR〔LoadTaskRegister〕加載保護(hù)模式下的進(jìn)程調(diào)度:采用C與匯編語言混合編程,利用計(jì)時(shí)中斷實(shí)現(xiàn)保護(hù)模式下多個(gè)進(jìn)程間的簡單切換為了簡單,我們?cè)趦?nèi)核程序組中增加了C程序main.c,在其中初始化進(jìn)程表,并定義3個(gè)顯示各自字符串的函數(shù)TestA、TestB、TestC來充當(dāng)3個(gè)用戶進(jìn)程入口函數(shù):內(nèi)核的入口在kernel.asm的_start函數(shù)中,所完成的工作主要有:更新堆棧指針ESP=StackTop〔跳轉(zhuǎn)到kernel時(shí)已經(jīng)切換了SS〕、初始化disp_pos=0、 切換GDT:保存老GDTR、調(diào)用cstar〔復(fù)制GDT、初始化IDT〕、裝入新GDT、 裝入IDT和TSS、調(diào)用中的kerel_main()函數(shù)來初始化進(jìn)程表、設(shè)置時(shí)鐘中斷處理程序、翻開時(shí)鐘中斷、調(diào)用restart函數(shù)內(nèi)核程序:在匯編程序kernel.asm中還定義了異常和硬件中斷處理、定義了save〔用于在中斷處理中保存CPU上下文存放器〕和restart〔被save調(diào)用,用于從內(nèi)核切換到用戶進(jìn)程〕函數(shù)PCB與進(jìn)程表和任務(wù)表PCB:110B的PCB由C結(jié)構(gòu)類型PROCESS定義,內(nèi)容包括:72B的用于保存處理17個(gè)器存放器值和save()函數(shù)返回地址的棧幀結(jié)構(gòu)類型、2B的〔位于GDT中的〕LDT選擇符、8*2=16B的含代碼與數(shù)據(jù)兩個(gè)段描述符的LDT數(shù)組、4B的進(jìn)程ID、16B進(jìn)程名串進(jìn)程表:用數(shù)組〔而不是鏈表〕來實(shí)現(xiàn)進(jìn)程表,進(jìn)程表含假設(shè)干與用戶程序?qū)?yīng)的PCB項(xiàng)任務(wù)表:定義自己的〔包含用戶進(jìn)程的任務(wù)信息的〕任務(wù)結(jié)構(gòu)類型,并創(chuàng)立一個(gè)含3個(gè)用戶任務(wù)的任務(wù)表數(shù)組,它們主要用于用戶PCB的初始化進(jìn)程調(diào)度需要使用大量棧操作,而且涉及到三種不同的棧:應(yīng)用程序棧、進(jìn)程表?xiàng)?、?nèi)核棧。其中的進(jìn)程表?xiàng)!睺SS〕,只是我們?yōu)榱吮4婧突謴?fù)進(jìn)程的上下文存放器值,而臨時(shí)設(shè)置的一個(gè)偽局部棧,不是正常的程序棧,由CPU在調(diào)用內(nèi)核中的中斷處理程序〔從特權(quán)級(jí)1-->特權(quán)級(jí)0〕時(shí)自動(dòng)切換在時(shí)鐘中斷發(fā)生時(shí),CPU會(huì)先檢查中斷處理程序的特權(quán)級(jí)是否與當(dāng)前的一致,假設(shè)不一致,那么會(huì)從當(dāng)前的TSS中選擇切換至哪個(gè)特權(quán)級(jí)別的堆棧SS和ESP,并將EFLAGS、CS、EIP先后壓入該堆棧中,接著跳轉(zhuǎn)到〔位于內(nèi)核中〕時(shí)鐘中斷處理程序〔clock_handler函數(shù)〕執(zhí)行為了及時(shí)保護(hù)中斷現(xiàn)場,必須在中斷處理函數(shù)的最開始處,立即保存被中斷程序的所有上下文存放器中的當(dāng)前值。這正是我們?cè)谟布袛嗵幚砗瘮?shù)hwint00的開始處,調(diào)用save函數(shù)的理由。而save函數(shù)也是開始處,壓棧保護(hù)上下文存放器準(zhǔn)備工作:初始化進(jìn)程表、填充TSS和LDT描述符、定義IDT〔含時(shí)鐘中斷處理的門描述符〕、初始化中斷控制器8259A和硬件中斷向量表、設(shè)置時(shí)鐘中斷處理、定義時(shí)鐘中斷處理函數(shù)進(jìn)程調(diào)度:用戶進(jìn)程A正在運(yùn)行時(shí)鐘中斷發(fā)生CPU〔因DPL和RPL<CPL〕將當(dāng)前堆棧從用戶進(jìn)程棧切換到內(nèi)核中的當(dāng)前PCB棧CPU將原用戶進(jìn)程棧的SS和ESP、EFLAGS、CS和EIP壓入新棧CPU通過IDTR存放器找到當(dāng)前IDT,再通過中斷號(hào)定位其中的時(shí)鐘中斷門描述符,從中獲得時(shí)鐘中斷處理程序所在代碼段的段選擇符和中斷處理程序入口地址的偏移量,最后調(diào)用時(shí)鐘中斷處理程序在硬件中斷處理程序的開始處,調(diào)用save函數(shù)〔先保存上下文存放器壓入當(dāng)前PCB,然后切換到內(nèi)核棧,將restart入口地址壓棧,最后返回時(shí)鐘中斷處理程序〕,再調(diào)用時(shí)鐘中斷處理程序,最后利用RET指令調(diào)用restart函數(shù)restart函數(shù)從內(nèi)核跳轉(zhuǎn)到用戶進(jìn)程〔先裝入當(dāng)前用戶進(jìn)程的LDT、再置TSS的ESP0-->當(dāng)前PCB,最后利用IRETF指令從內(nèi)核跳轉(zhuǎn)到當(dāng)前用戶進(jìn)程〕
實(shí)驗(yàn)說明文檔摘要〔老版本,包含局部匯編與接口的內(nèi)容〕1實(shí)驗(yàn)環(huán)境與引導(dǎo)1.1環(huán)境根本環(huán)境硬件平臺(tái):PC機(jī)〔IA-32〕操作系統(tǒng):WindowsXP/7、虛擬機(jī)中的Linux〔Ubuntu〕虛擬機(jī):VMware〔Ubuntu、混合編程〕Bochs〔測試〕在VMware中創(chuàng)立Ubuntu虛擬機(jī),并安裝UbuntuLinux〔包括另外安裝GCC和NASM〕,供以后C與匯編混合編程時(shí)使用1.1.2編譯環(huán)境匯編語言操作系統(tǒng):WindowsXP/7編譯器:NASMC語言與匯編混合編程操作系統(tǒng):虛擬機(jī)中的Linux〔Ubuntu〕編譯器:GCC與NASM鏈接器:LD1.1.3其他開發(fā)Windows平臺(tái)NotePad++——源代碼編輯,編寫匯編和C語言源程序、配置文件等文本文件WinHex——二進(jìn)制編輯〔文件、磁盤映像、磁盤〕DiskWriter/FloppyWriter——將引導(dǎo)扇區(qū)等寫入磁盤映像WinImage——用于將文件復(fù)制進(jìn)FAT12磁盤映像Debug——調(diào)試匯編程序Linux平臺(tái)gedit——圖形界面的文本編輯器,用于編寫匯編和C語言源程序1.1.4虛擬機(jī):Bochs操作系統(tǒng):DOS〔MS-DOS6.22或FreeDOS1.1〕系統(tǒng)軟盤映像外存:〔帶FAT12的〕1.44MB軟盤映像、〔帶FAT12的〕10MB硬盤映像、U盤文件格式:COM、BIN、ELF目錄和配置:在Bochs程序的安裝目錄〔默認(rèn)為〕中創(chuàng)立子目錄MyOS將子目錄dlxlinux中的批處理文件和配置文件復(fù)制到MyOS目錄修改中的子目錄dlxlinux為MyOS修改:boot:floppy〔從軟盤A啟動(dòng)〕、floppya:1_44=msdos622.img,status=inserted〔軟盤A為MS-DOS6.22的系統(tǒng)盤〕為了方便使用,可以修改“LinuxDemoinBochs”圖標(biāo),將其文字局部改為“MyOSinBochs”。在新圖標(biāo)上按鼠標(biāo)右鍵,在彈出的快捷菜單中,選底部的“屬性”菜單項(xiàng)。在彈出的屬性對(duì)話框中,將“目標(biāo)”欄的路徑串中的子目錄dlxlinux修改為MyOS1.2引導(dǎo)引導(dǎo)過程計(jì)算機(jī)加電或重啟CPU復(fù)位內(nèi)存清零內(nèi)存奇偶校驗(yàn)跳轉(zhuǎn)到地址為FFFF0h處的系統(tǒng)BIOS入口指令,執(zhí)行主板ROM中的例程檢查各個(gè)端口,識(shí)別并初始化設(shè)備,然后將這些設(shè)備連接到計(jì)算機(jī)上,并提供在設(shè)備上的I/O效勞創(chuàng)立兩個(gè)數(shù)據(jù)區(qū)——中斷向量表和BIOS數(shù)據(jù)區(qū)讀啟動(dòng)盤的第一個(gè)物理扇區(qū),如果其最后兩個(gè)字節(jié)為55h和AAh,那么裝入該扇區(qū)到內(nèi)存地址7C00h處,并跳轉(zhuǎn)到7C00h處執(zhí)行〔引導(dǎo)扇區(qū)里面的指令,一般是裝入操作系統(tǒng)的引導(dǎo)程序〕引導(dǎo)扇區(qū)主引導(dǎo)扇區(qū)〔BootSector〕是磁盤的第一個(gè)物理扇區(qū)〔512B〕,構(gòu)成:主引導(dǎo)記錄〔MBR=MasterBootRecord,446B〕磁盤分區(qū)表〔DPT=DiskPartitionTable,4*16=64B〕引導(dǎo)記錄標(biāo)識(shí)符〔BRID=BootRecordIDentifier,2B,55hAAh〕1.3引導(dǎo)實(shí)驗(yàn)編寫引導(dǎo)匯編代碼用NotePad++編寫匯編源代碼〔參見“”〕用org操作符設(shè)置程序的入口地址為7C00h設(shè)置DS和ES=CS調(diào)用后面定義的顯示字符串函數(shù)進(jìn)入無限循環(huán)定義顯示字符串函數(shù)——用10h號(hào)中斷的13h功能實(shí)現(xiàn)〔紅色〕字符串顯示定義字符串常量“Hello,OSworld!”用times偽指令將剩余空間填充為0將引導(dǎo)扇區(qū)的最后2個(gè)字節(jié)設(shè)置為55h和AAh將寫好的匯編中用NASM將程序編譯成二進(jìn)制文件boot.bin:nasmboot.asm-創(chuàng)立軟盤映像參見“”運(yùn)行Bochs程序組中的“DiskImageCreationTool”程序〔bximage.exe〕在“Pleasetypehaorfd.[hd]”后鍵入fd〔指軟盤,默認(rèn)為硬盤hd〕后回車在下面的選項(xiàng)中鍵入軟盤映像文件的名稱“bt.img”〔默認(rèn)為“”〕后回車再按任意鍵完成創(chuàng)立新建的軟盤映像文件會(huì)被存放在Bochs程序的主目錄中將軟盤映像文件移動(dòng)到Bochs程序的“MyOS”子目錄運(yùn)行DiskWriter/FloppyWriter程序單擊“寫文件到磁盤映像”按鈕在彈出的“翻開文件”“翻開”按鈕在新彈出的“翻開文件”對(duì)話框中,選中Bochs程序的“MyOS”子目錄中的“翻開”按鈕彈出含字符串“成功!”的表示寫入成功的消息框用軟盤映像啟動(dòng)虛擬機(jī)參見“”的2.3。修改Bochs虛擬機(jī)的配置文件用記事本或NotePad++翻開Bochs程序的“MyOS”子目錄中的虛擬機(jī)配置文件將其中的“floppya:1_44=floppya.img,status=inserted”行中的“”改為我們自己的軟盤映像文件“”將“boot:c”行中的硬盤“c”改為“floppy”〔軟盤〕保存文件重新啟動(dòng)虛擬機(jī)用WinHex編輯啟動(dòng)U盤注意!下面的操作可能會(huì)破壞U盤的分區(qū)結(jié)構(gòu)。插入〔空白或閑散的〕U盤運(yùn)行WinHex選中“工具/翻開磁盤”菜單項(xiàng),在彈出的“編輯磁盤”對(duì)話框中,選擇下部的“物理驅(qū)動(dòng)器”中U盤對(duì)應(yīng)項(xiàng),按“確定”鈕翻開U盤選中boot.bin文件前面的非0內(nèi)容,按Ctrl+C復(fù)制到剪接板定位到U盤的開始處,按Ctrl+B〔并在彈出確實(shí)認(rèn)菜單中按“確定”確保U盤的第一個(gè)物理扇區(qū)〔即引導(dǎo)扇區(qū)〕的最后兩個(gè)字節(jié)為55hAAh重啟計(jì)算機(jī),選擇用U盤啟動(dòng)
2匯編程序與代碼塊裝載2.1CPU與指令CPUIntel8086〔16位,實(shí)模式〕、80286〔16位,保護(hù)模式〕、80386〔32位,保護(hù)模式+分頁機(jī)制〕IA-32〔IntelArchitecture-32,因特爾32位體系結(jié)構(gòu)〕=x86-32,包括80386和80486IA-64=指Intel公司的64位CPU安騰〔Itanium〕架構(gòu)〔與IA-32不兼容〕x64=Intel64/IA-32e=AMD64/x86-64=〔AMD創(chuàng)造,與IA-32兼容〕,包括奔騰〔Pentium〕、酷睿〔Core〕、賽揚(yáng)〔Celeron〕、凌動(dòng)〔Atom〕等.2NASM匯編指令格式:指令目標(biāo)操作數(shù),源操作數(shù)例子:movax,8不區(qū)分大小寫[語句標(biāo)號(hào)除外]十六進(jìn)制常數(shù)可用0x前綴或h后綴[字母開頭的必須前面加0],如0xA2、0A2h常用的x86指令:算術(shù)運(yùn)算:ADD、SUB、MUL、DIV,INC、DEC位運(yùn)算:AND、OR、NOT、XOR,SHL、SHR賦值:MOV比擬測試:CMP、TEST跳轉(zhuǎn):JMP、JA/JG、JAE/JGE、JB/JL、JBE/JLE、JC、JE、JNA/JNG、JNAE/JNGE、JNB/JNL、JNBE/JNLE、JNZ、JZ調(diào)用返回:CALL、RET、RETF中斷:INT、IRET、IRETD循環(huán)重復(fù):LOOP、LOOPE/LOOPZ、LOOPNE/LOOPNZ,REP、REPE/REPZ、REPNE/REPNZ棧操作:PUSH、POP,PUSHF、POPF,PUSHA、POPA,PUSHAD、POPAD串操作:MOVS/MOVSB、MOVSW、MOVSD,LODSB、LODSW、LODSD,STOSB、STOSW、STOSD,CMPSB、CMPSW、CMPSD?!策@里的串相當(dāng)于內(nèi)存塊〕端口IO:IN、OUT標(biāo)志位設(shè)置:STI、CLI,STD、CLD裝入/保存系統(tǒng)存放器:LGDT/SGDT、LLDT/SLDT、LIDT/SIDT、LTR/STR無操作:NOP2.1.3聲明已初始化的數(shù)據(jù):DB、DW、DD、DQ聲明未初始化的數(shù)據(jù):RESB、RESW、RESD、RESQ定義常數(shù):EQU重復(fù)指令或數(shù)據(jù):TIMES指定目標(biāo)處理器模式:BITS16、BITS32定義段:SECTION/SEGMENT〔.text代碼段、.data數(shù)據(jù)段、bss未初始化[清0]數(shù)據(jù)段〕從其他的模塊導(dǎo)入符號(hào):EXTERN把符號(hào)導(dǎo)出到其他模塊中:GLOBAL數(shù)據(jù)對(duì)齊標(biāo)準(zhǔn)宏:ALIGN、ALIGNB宏定義:%macro、%endmacro重復(fù)宏:%rep、%endrep單行宏定義:%define條件匯編:%if、%ifdef、%elif、%else、%endif指定二進(jìn)制程序起點(diǎn)位置的操作符:ORG特殊記號(hào):$〔當(dāng)前地址〕、$$〔當(dāng)前節(jié)/段地址〕存放器.18086存放器Intel8086有14個(gè)16位存放器。8個(gè)通用存放器4個(gè)數(shù)據(jù)存放器:AX〔累加〕、BX〔基址〕、CX〔計(jì)數(shù)〕、DX〔數(shù)據(jù)〕4個(gè)指針變址存放器:SP〔堆棧指針〕、BP〔基址指針〕、SI〔源變址〕、DI〔目的變址〕4個(gè)段存放器:CS〔代碼段〕、DS〔數(shù)據(jù)段〕、SS〔堆棧段〕、ES〔附加段〕2個(gè)專用存放器:IP〔指令指針〕、FLAGS〔標(biāo)志〕.2標(biāo)志存放器8086的16位標(biāo)志存放器FLAGS中一共定義了9個(gè)標(biāo)志位,其中的6個(gè)狀態(tài)標(biāo)志位可用于條件代碼,3個(gè)控制標(biāo)志位可影響指令的執(zhí)行結(jié)果。6個(gè)狀態(tài)標(biāo)志位:零標(biāo)志ZF〔第6位〕——指明算術(shù)或比擬運(yùn)算的結(jié)果,可被JZ/JNZ指令利用符號(hào)標(biāo)志SF〔第7位〕——運(yùn)算結(jié)果的符號(hào),可被JS/JNS指令利用進(jìn)位標(biāo)志CF〔第0位〕——包含算術(shù)運(yùn)算操作后最高位的進(jìn)位或移位/循環(huán)操作后最后位的內(nèi)容,可被JC/JNC指令利用溢出標(biāo)志OF〔第11位〕——指出算術(shù)運(yùn)算后最高位溢出,可被JO/JNO指令利用奇偶標(biāo)志PF〔第2位〕——指明在操作產(chǎn)生的結(jié)果中,低字節(jié)里為1的位的數(shù)量的奇偶,可被JP[E]/JNP或JPO指令利用輔助進(jìn)位標(biāo)志AF〔第4位〕——在字操作時(shí)發(fā)生低字節(jié)向高字節(jié)進(jìn)位或借位時(shí)、在字節(jié)操作時(shí)發(fā)生低4位向高4位進(jìn)位或借位時(shí),AF=1,否那么為0,無相關(guān)的CPU指令3個(gè)控制標(biāo)志位:方向標(biāo)志DF〔第10位〕——確定傳送或比擬字符串?dāng)?shù)據(jù)時(shí)的方向,默認(rèn)DF=0為左/上/索引增加方向,可以用指令STD/CLD來設(shè)置成遞減/遞增方向中斷允許標(biāo)志IF〔第9位〕——指明是否處理外部可屏蔽中斷,可以用指令STI/CLI來設(shè)置要/不處理中斷.380386存放器在Intel80386CPU中,8個(gè)通用存放器和2個(gè)專用存放器都從16位擴(kuò)展到了32位〔命名前增加了一個(gè)字母E[=Extended,擴(kuò)展]〕,但4個(gè)段存放器仍然保存為16位的,另外還增加了2個(gè)新的16位附加段存放器FS和GS,使程序可同時(shí)操作的段到達(dá)6個(gè)。80386〔80286〕新增加的存放器還有:4個(gè)系統(tǒng)地址存放器全局描述符表存放器GDTR〔48位〕——GDT的16位界限和32位線性基址,相關(guān)的裝入/保存存放器的特權(quán)指令為LGDT/SGDT局部描述符表存放器LDTR〔16位[+64位]〕——LDT的16位段選擇符,相關(guān)的裝入/保存存放器的特權(quán)指令為LLDT/SLDT,LDTR的64位隱藏局部包括32位基址、20位界限和12位描述符屬性中斷描述符表存放器IDTR〔48位〕——IDT的16位界限和32位線性基址,相關(guān)的裝入/保存存放器的特權(quán)指令為LIDT/SIDT任務(wù)存放器TR〔16位[+64位]〕——TSS的16位段選擇符,相關(guān)的裝入/保存存放器的特權(quán)指令為LTR/STR,TR的64位隱藏局部包括32位基址、20位界限和12位描述符屬性4個(gè)32位的控制存放器CR0——80286的16位MSW〔MachineStatusWord,機(jī)器狀態(tài)字〕的32位擴(kuò)展,其最低位為PE〔ProtectionEnable,啟用保護(hù)[模式]〕,最高位為PG〔Paging,分頁〕用于啟動(dòng)分頁機(jī)制CR1——未使用CR2——存放引起頁故障的線性地址CR3——頁目錄基址存放器8個(gè)調(diào)試存放器DR0~DR78個(gè)測試存放器TR0~TR72.3BIOS中斷調(diào)用格式BIOS中斷調(diào)用的一般格式為:movah,功能號(hào)……;設(shè)置各種入口參數(shù)int中斷號(hào)常用BIOS中斷顯示字符——int10h的0Eh功能顯示字符串——int10h的13h功能讀按鍵——int16h的00h功能讀扇區(qū)——int13h的02h功能MY-OS例引導(dǎo)扇區(qū)程序〔boot1.asm〕:顯示3個(gè)字符串〔"MY-OS1.0"、"(C)2012LiCaiwei"、"PleaseKeyincharacters(Esctoquit):"+響鈴換行回車〕、接受用戶鍵入字符并回顯到屏幕上。匯編代碼參見“02匯編程序與代碼塊裝載.doc”中的2.2的3。2.4裝載代碼塊將boot1.asm的第一行代碼改為:org7E00h,另存為用NASM將編譯為利用WinHex將寫入bt.img的第二個(gè)扇區(qū)在原來的boot.asm的根底上,增加裝載第二個(gè)扇區(qū)到7E00h處的匯編代碼,保存為,參見“”中的3用NASM將編譯成利用WinHex或DiskWriter/FloppyWriter將寫入bt.img的第一個(gè)扇區(qū)用bt.img啟動(dòng)Bochs虛擬機(jī)2.5Debug常用的debug命令:R〔Register存放器〕——查看、修改CPU存放器D〔Dump轉(zhuǎn)儲(chǔ)〕——查看內(nèi)存中的內(nèi)容E〔Enter鍵入〕——改寫內(nèi)存中的內(nèi)容A〔Assemble匯編〕——以匯編指令的格式,在內(nèi)存中寫入一條機(jī)器指令U〔Unassemble反匯編〕——將內(nèi)存中的機(jī)器指令翻譯成匯編指令P〔Proceed繼續(xù)進(jìn)行〕——單步執(zhí)行,類似于StepOverT〔Trace跟蹤〕——執(zhí)行一條機(jī)器指令,類似于StepIntoN〔Name名稱〕——指定文件名,供L和W命令使用L〔Load裝入〕——讀磁盤文件中的指定扇區(qū)到內(nèi)存W〔Write寫入〕——寫內(nèi)存數(shù)據(jù)到磁盤文件的指定扇區(qū)Q〔Quit〕——退出debug?〔幫助〕——顯示命令清單2.6COM文件可執(zhí)行文件格式BAT〔batchfile,批處理文件〕——DOS/Windows的一種基于ASCII文本的腳本型可執(zhí)行文件〔擴(kuò)展名為.bat或d,后者為WindowsNT引進(jìn)〕COM〔commandfile,命令文件〕——DOS的二進(jìn)制裸格式,不分段,會(huì)被裝載到當(dāng)前段的100h處〔需使用org100h指令,SP=100h-4〕,文件大小必須≤64KB-256BEXE〔executablefile,可執(zhí)行文件〕——DOS/Windows的主要可執(zhí)行文件類型,有三種格式:MZ〔MarkZbikowski,MS-DOS的開發(fā)者之一〕——原始的DOS可執(zhí)行文件格式,以字母串“MZ”〔5A4D〕開頭NE〔NewExecutable,新可執(zhí)行〕——老式16位Windows可執(zhí)行文件格式〔包括.exe和.dll擴(kuò)展名〕,1985年由Windows1.0引進(jìn)。NE是一種分段的可執(zhí)行文件,為了向后兼容,保存了MZ文件頭PE〔PortableExecutable,可移植可執(zhí)行〕——WindowsNT3.1于1993年引進(jìn)的32位可執(zhí)行文件格式〔包括.exe、.dll、.cpl、.ocx、.sys、.scr、.drv擴(kuò)展名〕,現(xiàn)在支持x86、x64和IA-64指令集架構(gòu)。PE格式是Unix的老式可執(zhí)行文件格式COFF〔CommonObjectFileFormat,公共對(duì)象文件格式〕的修改版ELF〔ExecutableandLinkableFormat,可執(zhí)行與可鏈接格式〕——類Unix操作系統(tǒng)的標(biāo)準(zhǔn)二進(jìn)制文件格式生成和運(yùn)行COM文件將org7C00h改為org100h〔0~100h用作棧〕〔如果需要用到堆棧[如有函數(shù)調(diào)用],還需設(shè)置SS=CS、SP=100h-4〕例子:Hello〔boot.asm->hello.asm〕、MY-OS〔boot1.asm->my-os.asm〕用NASM編譯成com文件:nasm*.asm-o*在DOS命令行/Windows的命令窗口〔如NASM運(yùn)行界面、“開始/運(yùn)行”的cmd〕中,使用hello或my-os啟動(dòng)運(yùn)行COM文件例hello下面是可以生成COM文件的例子——使用BIOS的10h號(hào)中斷的13h號(hào)功能,在文本屏幕的左上角,顯示黑底紅字的字符串“Hello,OSworld!”。源代碼〔hello.asm〕 org100h ;告訴編譯器程序加載到100H處 movax,cs ;置DS和ES=CS movds,ax moves,ax callDispStr ;調(diào)用顯示字符串函數(shù) jmp$ ;無限循環(huán)DispStr:;顯示字符串例程 movax,BootMsg movbp,ax ;ES:BP=串地址 movcx,16 ;CX=串長 movah,13h ;AH=BIOS中斷的功能號(hào) moval,01h ;AL=1表示光標(biāo)放到串尾 movbh,0 ;BH=頁號(hào) movbl,0ch ;BL=顏色〔黑底紅字〕 movdh,0 ;DH=行號(hào) movdl,0 ;DL=列號(hào) int10h ;調(diào)用10h號(hào)中斷 ret ;函數(shù)返回BootMsg:;顯示用的字符串 db"Hello,OSworld!"用NASM編譯成com文件:在NASM的命令行,用hello<回車>運(yùn)行
3FAT文件系統(tǒng)與文件裝載磁盤分區(qū)磁盤分區(qū)表〔DPT=DiskPartitionTable〕——位于引導(dǎo)扇區(qū),含4個(gè)分區(qū)表項(xiàng),每一項(xiàng)占16B。只有硬盤〔U盤/固態(tài)盤〕才有磁盤分區(qū)表,軟盤無。如果DPT全為0,那么表示無磁盤分區(qū);有幾個(gè)非0分區(qū)表項(xiàng),就有幾個(gè)磁盤分區(qū)〔卷〕;一個(gè)磁盤最多可有4個(gè)分區(qū)〔卷〕分區(qū)表項(xiàng)的結(jié)構(gòu)〔10MB硬盤的CHS=80/4/63〕:分區(qū)表項(xiàng)的字段結(jié)構(gòu)偏移量長度含義〔值〕10MB硬盤例0x001B分區(qū)是否激活〔0x80或0〕80h0x011B開始磁頭號(hào)00x022B開始扇區(qū)號(hào)〔低字節(jié)的低6位〕和柱面號(hào)〔其余10位,其中低位字節(jié)的高2位為其第9、10位〕1和1〔0101〕0x041B分區(qū)類型〔如:0x01=FAT12、0x06/0x0E=FAT16、0x0B/0x0C=FAT32、0x07=NTFS/exFAT、0x05/0x0F=擴(kuò)展、0x83=Linux、0xEE=GPT〕10x051B結(jié)束磁頭號(hào)30x062B結(jié)束扇區(qū)號(hào)〔低字節(jié)的低6位〕和柱面號(hào)〔其余10位,其中低位字節(jié)的高2位為其第9、10位〕63和79〔3F4F〕0x084B分區(qū)起始地址的LBA〔邏輯塊地址〕值〔扇區(qū)序號(hào)〕〔63*4=〕252〔4C00〕0x0C4B分區(qū)大小(總扇區(qū)數(shù))〔20160-252=〕19908〔C44D0000〕分區(qū)類型〔CHS/LBA〕——如0x01=FAT12、0x06/0x0E=FAT16、0x0B/0x0C=FAT32、0x07=NTFS、0x05/0x0F=擴(kuò)展、0x83=Linux、0xEE=GPT〔GUIDPartitionTable,全局唯一標(biāo)識(shí)符分區(qū)表,一種新的磁盤分區(qū)表標(biāo)準(zhǔn),由Intel公司于2010年推出,可突破傳統(tǒng)MBR的2TB限制〕CHS〔Cylinder/Head/Sector,柱面/磁頭/扇區(qū)〕——磁盤的一種傳統(tǒng)尋址方式。LBA〔LogicalBlockAddressing,邏輯塊尋址〕——磁盤的一種線性尋址方式,有22b〔ATA,1986〕、28b〔ATA-1,1994〕和48b〔ATA-6,2003〕三種版本。1996年以后推出的硬盤一般都采用了LBAFAT分區(qū)FAT〔FileAllocationTable,文件分配表〕是微軟公司為其操作系統(tǒng)DOS和老式Windows所定義的一套文件系統(tǒng),包括FAT12〔≤32MB〕、FAT16〔≤32MB/2GB〕、FAT32〔≤2TB〕和FAT64/exFAT〔≤64ZB〕等多種具體格式。1GB〔230〕=1024MB、1TB〔240〕=1024GB、1PB〔250〕=1024TB、1EB〔260〕=1024PB、1ZB〔270〕=1024EB、1YB〔280〕=1024ZB。3.2FAT12和10MB硬盤映像作為測試介質(zhì),采用FAT12文件系統(tǒng)。磁盤格式軟盤的格式2個(gè)磁頭〔head〕/盤面〔side〕、每磁頭80個(gè)柱面〔cylinder〕/磁道〔track〕、每個(gè)柱面有18個(gè)扇區(qū)〔sector〕、每個(gè)扇區(qū)有512個(gè)字節(jié)〔byte〕,所以軟盤的容量為:2磁頭*80柱面*18扇區(qū)*512B=2880扇區(qū)*512B=1474560B=1440KBB對(duì)1.44MB軟盤,采用FAT12分區(qū),引導(dǎo)扇區(qū)中沒有分區(qū)信息,但有根目錄區(qū)〔224條目*32B=7168B=14扇區(qū)〕。FAT12的每個(gè)FAT項(xiàng)占12位〔1.5B〕,每個(gè)簇只有一個(gè)扇區(qū)。整個(gè)軟盤2880個(gè)扇區(qū),需要2880*1.5B=4320B≈8.44個(gè)扇區(qū),所以每個(gè)FAT表的大小設(shè)為9個(gè)扇區(qū)。10MB硬盤的格式4個(gè)磁頭〔head〕/盤面〔side〕、每磁頭80個(gè)柱面〔cylinder〕/磁道〔track〕、每個(gè)柱面有63個(gè)扇區(qū)〔sector〕、每個(gè)扇區(qū)有512個(gè)字節(jié)〔byte〕,所以磁盤的容量為:4磁頭*80柱面*63扇區(qū)*512B=20160扇區(qū)*512B=10321920B=10080KB≈9.84MB對(duì)10MB硬盤,采用FAT12分區(qū),主引導(dǎo)扇區(qū)中只有一個(gè)分區(qū)表項(xiàng),分區(qū)從第2個(gè)〔1號(hào)〕柱面開始,起始扇區(qū)〔=分區(qū)引導(dǎo)扇區(qū)〕號(hào)為252。根目錄區(qū)〔512條目*32B=16384B=32扇區(qū)〕。FAT12的每個(gè)FAT項(xiàng)占12位〔1.5B〕,每個(gè)簇有8個(gè)扇區(qū)。整個(gè)分區(qū)19859個(gè)扇區(qū)=〔19859/8≈〕2482簇,F(xiàn)AT表需要2482*1.5B=3723B〔/512〕≈7.27個(gè)扇區(qū),所以每個(gè)FAT表的大小設(shè)為8個(gè)扇區(qū)。FAT12分區(qū)結(jié)構(gòu)軟盤下面是的FAT12分區(qū)結(jié)構(gòu):FAT12分區(qū)結(jié)構(gòu)區(qū)域起始地址起始扇區(qū)扇區(qū)數(shù)內(nèi)容說明引導(dǎo)扇區(qū)001主/分區(qū)引導(dǎo)扇區(qū)無額外保存扇區(qū)FAT區(qū)200h19FAT#1主FAT1400h109FAT#2備份FAT根目錄區(qū)2600h1914根目錄固定大小數(shù)據(jù)區(qū)4200h332847文件數(shù)據(jù)其余空間10MB硬盤下面是10MB硬盤映像〔CHS=80/4/63〕的FAT12分區(qū)結(jié)構(gòu):10MB硬盤的FAT12分區(qū)結(jié)構(gòu)區(qū)域起始地址起始扇區(qū)扇區(qū)數(shù)內(nèi)容說明主引導(dǎo)扇區(qū)001引導(dǎo)代碼和DPT硬盤的主引導(dǎo)扇區(qū)和分區(qū)引導(dǎo)扇區(qū)必須分開空白區(qū)200h1251保存扇區(qū)硬盤分區(qū)必須從一個(gè)柱面的起始處開始分區(qū)引導(dǎo)扇區(qū)1F800h2521[E]PBP1號(hào)柱面的首個(gè)扇區(qū)FAT區(qū)1FA00h2538FAT#1主FAT20A00h2618FAT#2備份FAT根目錄區(qū)21A26932根目錄固定大小數(shù)據(jù)區(qū)25A30119859文件數(shù)據(jù)其余空間分區(qū)引導(dǎo)扇區(qū)分區(qū)引導(dǎo)扇區(qū)也叫VBR〔VolumeBootRecord,卷引導(dǎo)記錄〕區(qū)或PBR〔PartitionBootRecord,分區(qū)引導(dǎo)記錄〕區(qū),是分區(qū)的第一個(gè)扇區(qū)〔512B〕。FAT12分區(qū)引導(dǎo)扇區(qū)的結(jié)構(gòu)偏移長度內(nèi)容00h3B跳轉(zhuǎn)指令〔jmp短偏移地址nop=EB??[一般為3E]90〕03h8BOEM名串“MY-OS”〔缺乏8B補(bǔ)空格符20h〕0Bh25BBPB24h26B擴(kuò)展BPB3Eh448B引導(dǎo)程序代碼01FEh2B有效結(jié)束標(biāo)志〔55AA〕3.2.4BPB〔BIOSParameterBlock,BIOS參數(shù)塊〕是一種數(shù)據(jù)結(jié)構(gòu),用于描述數(shù)據(jù)存儲(chǔ)卷〔如硬盤的卷分區(qū)〕的物理布局。EBPB〔ExtendedBIOSParameterBlock,擴(kuò)展BPB〕是BPB的補(bǔ)充。FAT12的BPB結(jié)構(gòu)〔25B〕偏移長度內(nèi)容軟盤值10M硬盤值0x0B2B每扇區(qū)字節(jié)數(shù)〔一般為512〕200h=512200h=5120x0D1B每簇扇區(qū)數(shù)180x0E2B保存扇區(qū)數(shù)[含本扇區(qū)]〔≥1〕110x101BFAT數(shù)〔一般為2〕220x112B最大根目錄項(xiàng)數(shù)E0h=224200h=5120x132B總扇區(qū)數(shù)〔<64K,容量<32MB〕B40h=28804DC4h=19908=20160-2520x151B介質(zhì)描述符F0hF8H0x162BFAT占扇區(qū)數(shù)980x182B每道扇區(qū)數(shù)12h=183FH=630x1A2B磁頭數(shù)240x1C4B隱藏扇區(qū)數(shù)〔對(duì)無分區(qū)的介質(zhì)必須為0〕000x204B總扇區(qū)數(shù)〔≥64K,容量≥32MB〕00FAT12的EBPB結(jié)構(gòu)〔26B〕偏移長度內(nèi)容軟盤值10M硬盤值0x241B驅(qū)動(dòng)器號(hào)〔軟0/硬0x80〕080h0x251B保存〔一般為0〕000x261B擴(kuò)展引導(dǎo)標(biāo)簽〔一般為0x29〕29h29h0x274B卷ID〔序列號(hào),隨機(jī)數(shù)〕12345678h234567890x2B11B卷標(biāo)〔缺乏補(bǔ)空格,無效〕“MyOSSystem”“MyOSSystem”0x368B文件系統(tǒng)類型〔缺乏補(bǔ)空格〕“FAT12”“FAT12”3.2.5FAT12采用多級(jí)目錄結(jié)構(gòu),子目錄用文件表示。文件數(shù)據(jù)塊的大小為簇,采用鏈?zhǔn)酱鎯?chǔ)。目錄為文件條目的列表,每個(gè)條目占用32B〔20h字節(jié)〕,其格式如下:偏移長度內(nèi)容00h11B文件名8B〔缺乏補(bǔ)空格〕+擴(kuò)展名3B〔缺乏補(bǔ)空格〕,尾部空格被忽略英文字母必須大寫,非法標(biāo)點(diǎn)字符有:”*+,./:;<=>?[\]0Bh1B文件屬性〔普通/檔案文件=20h、子目錄=10h、卷標(biāo)=08h〕0Ch10B保存〔全為0〕16h2B最后寫入時(shí)間〔0~4位:秒/2[0~29]、5~10位:分[0~59]、11~15位:時(shí)[0~23]〕18h2B最后寫入日期〔0~4位:日[1~31]、5~8位:月[1~12]、9~15位:年[0=1980~127=2107]〕1Ah2B開始簇號(hào),卷標(biāo)、指向根目錄的子目錄“..”、空文件條目的開始簇號(hào)必須為01Ch4B文件大小〔字節(jié)數(shù)〕文件條目第一個(gè)字節(jié)值的特殊含義值〔h〕00052EE5含義條目未用且可用值實(shí)際為E5H點(diǎn)條目〔.或..〕條目被刪且不可用文件屬性的標(biāo)志位位序76543210掩碼(h)8040201008040201含義未用設(shè)備檔案子目錄卷標(biāo)系統(tǒng)隱藏只讀FAT項(xiàng)FAT〔FileAllocationTable,文件分配表〕是映射到分區(qū)中每個(gè)簇〔cluster〕的項(xiàng)〔entry,條目〕列表,F(xiàn)AT12的每個(gè)項(xiàng)占12位,F(xiàn)AT項(xiàng)取值的含義見下表:FAT項(xiàng)值〔h〕取值含義000空閑簇001保存簇002~FEF被占用簇,值為下一簇的序號(hào)FF0~FF6保存值FF7壞簇FF8~FFF文件最后簇〔一般取FFF〕FAT表的前兩個(gè)項(xiàng)保存特殊的值〔FAT12前三個(gè)字節(jié)h值=F0FFFF〕:項(xiàng)0=低8位〔首字節(jié)〕為介質(zhì)描述符〔軟盤為F0h、硬盤和U盤為F8h〕、其余位全為1〔FAT12:Fh〕項(xiàng)1=結(jié)束簇標(biāo)記〔FAT12通常取值為:FFFh〕匯編源程序下面是生成FAT12分區(qū)結(jié)構(gòu)的匯編源程序代碼,包括跳轉(zhuǎn)指令、OEM串、BPB與EPBP,填充兩個(gè)FAT表開始處的兩個(gè)FAT項(xiàng)〔F0FFFF〕,并在根目錄中增加一個(gè)卷標(biāo)條目〔因?yàn)镋BPB中的卷標(biāo)不起作用〕。匯編源代碼〔似boot4.asm〕: org07c00h ;加載到0:7C00h處 jmpshortLABEL_START ;Starttoboot. nop ;這個(gè)nop不可少 BS_OEMName DB'MY-OS1.0';OEMString,必須8個(gè)字節(jié)〔缺乏補(bǔ)空格〕;下面是FAT12的BPB與EPBP BPB_BytsPerSec DW512 ;每扇區(qū)字節(jié)數(shù) BPB_SecPerClus DB1 ;每簇多少扇區(qū) BPB_RsvdSecCnt DW1 ;Boot記錄占用多少扇區(qū) BPB_NumFATs DB2 ;共有多少FAT表 BPB_RootEntCnt DW224 ;根目錄文件數(shù)最大值 BPB_TotSec16 DW2880 ;邏輯扇區(qū)總數(shù) BPB_Media DB0xF0 ;介質(zhì)描述符 BPB_FATSz16 DW9 ;每FAT扇區(qū)數(shù) BPB_SecPerTrk DW18 ;每磁道扇區(qū)數(shù) BPB_NumHeads DW2 ;磁頭數(shù)(面數(shù)) BPB_HiddSec DD0 ;隱藏扇區(qū)數(shù) BPB_TotSec32 DD0 ;wTotalSectorCount為0時(shí)這個(gè)值記錄扇區(qū)數(shù) BS_DrvNum DB0 ;中斷13的驅(qū)動(dòng)器號(hào) BS_Reserved1 DB0 ;未使用 BS_BootSig DB29h ;擴(kuò)展引導(dǎo)標(biāo)記(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025國際貿(mào)易合同
- 2025開關(guān)插座采購合同標(biāo)準(zhǔn)版
- 2025年度高科技企業(yè)公司股權(quán)協(xié)議書模板3篇
- 2025年度智能家居生態(tài)鏈消費(fèi)者協(xié)議3篇
- 2025年度新材料研發(fā)與應(yīng)用公司整體轉(zhuǎn)讓協(xié)議版3篇
- 2025年度醫(yī)療設(shè)備融資租賃服務(wù)合同模板3篇
- 2025年度農(nóng)村宅基地房買賣合同(農(nóng)村電商服務(wù)站建設(shè))
- 2025年度公租房合同(含租賃合同簽訂及備案費(fèi)用)3篇
- 2025年度環(huán)保處理設(shè)備專業(yè)維修與改造合同3篇
- 2025年度新能源汽車充電基礎(chǔ)設(shè)施合作項(xiàng)目協(xié)議書范本3篇
- DB11-T 693-2024 施工現(xiàn)場臨建房屋應(yīng)用技術(shù)標(biāo)準(zhǔn)
- GB/T 45089-20240~3歲嬰幼兒居家照護(hù)服務(wù)規(guī)范
- 統(tǒng)編版2024-2025學(xué)年三年級(jí)上冊(cè)語文期末情景試卷(含答案)
- 2024年01月11344金融風(fēng)險(xiǎn)管理期末試題答案
- 浙江省杭州市八縣區(qū)2024-2025學(xué)年高二數(shù)學(xué)上學(xué)期期末學(xué)業(yè)水平測試試題
- 民政部主管社團(tuán)管理辦法
- 工地施工臨時(shí)用水及計(jì)算
- 工作計(jì)劃酒店上半年工作總結(jié)及下半年工作計(jì)劃
- 防護(hù)設(shè)備操作手冊(cè)
- 《中小學(xué)教師職業(yè)生涯規(guī)劃與專業(yè)發(fā)展》講座
評(píng)論
0/150
提交評(píng)論