當前位置:首頁 » 課程大全 » 操作系統課程設計fat表

操作系統課程設計fat表

發布時間: 2021-03-02 18:36:28

A. 操作系統數據結構課程設計

你可以自己仿造下面的 通訊錄管理系統 :
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct{
char num[6];
char name[10];
char unit[20];
char phone[13];
char addr[30];
}datatype;
typedef struct node{
datatype data;
struct node * next;
}listnode;
typedef listnode * linklist;
linklist head;
listnode *p;
int menu_select( );
linklist createlist(void);
void insertnode(linklist head,listnode *p);
listnode *listfind(linklist head);
void delnode(linklist head);
void printlist(linklist head);
void main()
{
for( ; ; ){
switch(menu_select() )
{
case 1:
printf(" ***********************************************\n");
printf(" ************** 通訊錄鏈表的建立 ***************\n");
printf(" ***********************************************\n");
head=createlist();
break;
case 2:
printf(" ***********************************************\n");
printf(" ************** 通訊錄信息添加 *****************\n");
printf(" ***********************************************\n");
printf(" ** 編號(4) 姓名(8) 單位(20) 電話(11) 地址(30)**\n");
printf(" ***********************************************\n");
p=(listnode *)malloc(sizeof(listnode));
scanf("%s%s%s%s%s",p->data.num,p->data.name,p->data.unit,p->data.phone,p->data.addr);
insertnode(head,p);
break;
case 3:
printf(" ******************************\n");
printf(" ******* 通訊錄信息查詢 *******\n");
printf(" ******************************\n");
p=listfind(head);
if(p!=NULL){
printf(" ** 編號 姓名 單位 電話 地址**\n");
printf(" ------------------------------\n");
printf("%s,%s,%s,%s,%s\n",p->data.num,p->data.name,p->data.unit,p->data.phone,p->data.addr);
printf(" ------------------------------\n");
}
else
printf("沒有你要找的人 ! \n");
break;
case 4:

printf(" ***********************************\n");
printf(" **********通訊信息的刪除***********\n");
printf(" ***********************************\n");
delnode(head);
break;
case 5:
printf(" ***********************************\n");
printf(" **********通訊錄鏈表的輸出*********\n");
printf(" ***********************************\n");
printlist(head);
break;
case 0:
printf("\t 謝謝您的使用! \n");
return;
}
}
}
int menu_select()
{
int sn;
printf(" \n");
printf(" \n");
printf(" \n");
printf(" 通訊錄管理系統 \n");
printf(" \n");
printf(" ======================\n");
printf(" 1.通訊錄鏈表的建立\n");
printf(" 2.通訊者結點的插入\n");
printf(" 3.通訊錄鏈表的查詢\n");
printf(" 4.通訊者結點的刪除\n");
printf(" 5.通訊錄鏈表的輸出\n");
printf(" 0.退出通訊錄管理系統\n");
printf(" ======================\n");
printf( " 請選擇操作0-5 \n\n");
for(; ;)
{
scanf("%d",&sn);
if(sn<0||sn>5)
printf("\t輸入錯誤\n");
else
break;
}
return sn;
}
linklist createlist(void)
{
linklist head=(listnode *)malloc(sizeof(listnode));
listnode *p,*rear;
int flag=1;
rear=head;
while(flag==1)
{
p=(listnode *)malloc(sizeof(listnode));
printf(" 編號(4) 姓名(8) 單位(20) 電話(11) 地址(31) \n");
printf(" --------------------------------------------\n");
scanf("%s%s%s%s%s",p->data.num,p->data.name,p->data.unit,p->data.phone,p->data.addr);
rear->next=p;
rear=p;
printf(" 繼續建表嗎? (1.是/0.不):");
scanf("%d",&flag);

}
if(flag==1)
printf("創建成功!\n");
rear->next=NULL;
return head;
}
void insertnode(linklist head,listnode *p)
{
listnode *p1,*p2;
p1=head;
p2=p1->next;
while(p2!=NULL && strcmp(p2->data.num,p->data.num)<0)
{
p1=p2;
p2=p2->next;
}
p1->next=p;
p->next=p2;
printf("插入成功!\n");
}
listnode * listfind(linklist head)
{
listnode * p;
char num[6];
char name[10];
int xz;
printf("--------------------\n");
printf(" 1.編號查詢\n");
printf(" 2.姓名查詢\n");
printf("--------------------\n");
printf("請選擇: \n");
p=head->next;
scanf("%d",&xz);
if (xz==1){
printf(" 請輸入要查找的編號: ");
scanf("%s",num);
while(p && strcmp(p->data.num,num)<0)
p=p->next;
if (p==NULL || strcmp(p->data.num,num)>0)
p=NULL;
}
else
if(xz=2){
printf("請輸入要查詢者的姓名: ");
scanf("%s",name);
while(p && strcmp(p->data.name,name)!=0)
p=p->next;
}
return p;
}
void delnode(linklist head)
{
int jx;
listnode *p,*q;
p=listfind(head);
if(p==NULL){
printf("沒有要刪除的通訊者!:\n");
return;
}
printf ("真的要刪除該結點嗎?(1.是/0.不):");
scanf("%d",&jx);
if (jx==1){
q=head;
while(q!=NULL && q->next!=p)
q=q->next;
q->next=p->next;
free(p);
printf("通訊者已被刪除!\n");
}
}
void printlist(linklist head)
{
listnode * p;
p=head->next;
printf(" 編號 姓名 單位 電話 地址\n");
printf(" -----------------------------\n");
while(p!=NULL)
{
printf(" %s, %s, %s, %s, %s\n",p->data.num,p->data.name,p->data.unit,p->data.phone,p->data.addr);
printf(" ------------------------------\n");
p=p->next;
}

}

B. FAT的設計

一個FAT文件系統包括四個不同的部分。
保留扇區,位於最開始的位置。第一個保留扇區是引導區(分區啟動記錄)。它包括一個稱為基本輸入輸出參數塊的區域(包括一些基本的文件系統信息尤其是它的類型和其它指向其它扇區的指針),通常包括操作系統的啟動調用代碼。保留扇區的總數記錄在引導扇區中的一個參數中。引導扇區中的重要信息可以被DOS和OS/2中稱為驅動器參數塊的操作系統結構訪問。
FAT區域。它包含有兩份文件分配表,這是出於系統冗餘考慮,盡管它很少使用,即使是磁碟修復工具也很少使用它。它是分區信息的映射表,指示簇是如何存儲的。
根目錄區域。它是在根目錄中存儲文件和目錄信息的目錄表。在FAT32下它可以存在分區中的任何位置,但是在早期的版本中它永遠緊隨FAT區域之後。
數據區域。這是實際的文件和目錄數據存儲的區域,它占據了分區的絕大部分。通過簡單地在FAT中添加文件鏈接的個數可以任意增加文件大小和子目錄個數(只要有空簇存在)。然而需要注意的是每個簇只能被一個文件佔有,這樣的話如果在32KB大小的簇中有一個1KB大小的文件,那麼31KB的空間就浪費掉了。例外情況
Apricot PC的MS-DOS所用FAT的實現有一個不同的啟動扇區組織以使用計算機與IBM不兼容的基本輸入輸出系統。跳轉指令和OEM名被省略並且MS-DOS文件系統參數位於0x50(在標准扇區中偏移為0x0B - 0x17)。後來的Apricot MS-DOS版本除了Apricot特有的引導區之外也具有了讀寫標准啟動分區的能力。
BBC Master 512 上的DOS Plus根本就不使用傳統的引導區。數據磁碟省略了引導區並且以一個單份的FAT開始(FAT的第一個位元組用來確定磁碟容量),啟動磁碟使用一個包含啟動調用程序的小型ADFS文件系統,後面跟隨一個單份的FAT。 一個分區分成同等大小的簇,也就是連續空間的小塊。簇的大小隨著FAT文件系統的類型以及分區大小而不同,典型的簇大小介於2KB到32KB之間。每個文件根據它的大小可能佔有一個或者多個簇;這樣,一個文件就由這些這些(稱為單鏈表)簇鏈所表示。然而,這些鏈並不一定一個接著一個在磁碟上存儲,它們經常是在整個數據區域零散的儲存。
文件分配表(FAT)是映射到分區每個簇的條目列表。每個條目記錄下面五種信息中的一種。
鏈中下一個簇的地址
一個特殊的文件結束符(EOF)符號指示鏈的結束
一個特殊的符號標示壞簇
一個特殊的符號標示保留簇
0來表示空閑簇
每個版本的FAT文件系統使用不同大小的FAT條目。這個大小已經由名字表示出來,例如FAT16文件系統的每個條目使用16位表示,32位文件系統使用32位表示。這個不同意味著FAT32系統的文件分配表能比FAT16映射更多的簇,它也允許FAT32有更大的分區大小。這也使得FAT32比FAT16更能有效地利用磁碟空間,因為每個驅動器能夠定址更小的簇,這也就意味著更少的空間浪費。 目錄表是一個表示目錄的特殊類型文件(現今通常稱為文件夾)。它裡面保存的每個文件或目錄使用表中的32位元組條目表示。每個條目記錄名字、擴展名、屬性(檔案、目錄、隱藏、只讀、系統和卷)、創建的日期和時間、文件/目錄數據第一個簇的地址,最後是文件/目錄的大小。
除了FAT12和FAT16文件系統中的根目錄表占據特殊的根目錄區域位置之外,所有其它的目錄表都存在數據區域。
合法的DOS文件名包括下面一些字元:
大寫字母A-Z
數字0-9
空格(盡管結尾的空格被作為填充而不是文件名的一部分)
! # $ % & () - @ ^ _ ` { } ~ '
數值 128-255
DOS文件名位於OEM字元集。
長文件名(LFN)使用一個技巧存儲在FAT文件系統上——在目錄表中添加假的條目。這些條目使用一個普通文件無法使用的卷標屬性標識,普通文件無法使用是由於它們被大多數舊的MS-DOS程序忽略。很顯然,一個只包含卷標的目錄被當作空卷,這樣就允許刪除;使用長文件名創建的文件在從普通的DOS刪除就會發生這樣的情形。
校驗和也允許檢驗長文件名是否與8.3文件名匹配;當一個文件刪除之後使用DOS在同一個目錄位置重新創建之後就會出現不匹配現象。校驗和使用下面的演算法計算。(注意pFcbName是指向如正常目錄條目中所顯示的文件名的指針,例如前八個字元是文件名,最後三個是擴展名。點是隱含的。文件名中沒有使用的空間將使用空格(ASCⅡ 0x20)補齊。例如,「Readme.txt」將記錄為README TXT。 unsignedcharlfn_checksum(constunsignedchar*pFcbName){inti;unsignedcharsum=0;for(i=11;i;i--)sum=((sum&1)0x80:0)+(sum>>1)+*pFcbName++;returnsum;}舊版的PC-DOS錯誤地將根目錄中的長文件名當作卷標,這樣它們就會顯示錯誤的卷標。
每個假條目包含13UTF-16個字元(26位元組),通過使用包含文件大小或者時間記錄的區域獲得除了舊的8+3之外的另外15個位元組(但是出於安全和磁碟檢查工具的考慮開始簇的區域沒有使用保留值為0)。參見8.3中另外的解釋。
如果一個文件名只包含小寫字母、或者是一個小寫字母的名加上大寫擴展名的混合或者與此相反,沒有特殊的字元並且滿足8.3的限制,在視窗NT上就不創建VFAT的條目。相反,在目錄條目的偏移0x0c處的沒有說明的位用來指示文件名全部或者部分是小寫字母。特別明確的是,位4意味著小寫字母的擴展名,位3意味著名是小寫字母,這樣就允許如「example.TXT」和「HELLO.txt」這樣的組合,但是不允許「Mixed.txt」這樣的組合。很少有操作系統支持這種功能。非NT視窗版本當這個擴展使用時將把文件名當作大寫字母。預設情況下,Linux的最近版本將認識這個擴展但是在寫時並不使用它。 在二十世紀九十年代中期微軟公司申請並獲得了一系列的FAT文件系統內核部分的專利。由於具有廣泛的兼容性和易於理解,FAT經常被選為用於數碼相機和個人數碼助理中快閃記憶體的數據交換格式。
2003年12月3日微軟公司宣布使用FAT規范和「相關智慧產權」將需要得到授權,每個銷售單元支付0.25美元的版權費,每個授權協議最多250,000美元的版權費。
為了這個目的,微軟公司提及了四個關於FAT文件系統的專利作為它的知識產權主張的基礎。所有這些與長文件名擴展有關的FAT首先出現在Windows 95中:
美國專利 5,745,902 - 訪問使用不同文件名格式的文件名的方法和系統。1992年7月6日備案。這包括生成、聯系一個8.3兼容格式的短文件名和長文件名的方法(如「Microsoft.txt」和「MICROS~1.TXT」),以及列舉相互沖突的短文件名的方法(如「MICROS~2.TXT」和「MICROS~3.TXT」)。還不清楚這個專利是否覆蓋不具有顯式長文件名能力的FAT實現。Unix文件系統中的硬連接看起來不是先行者:從長文件名刪除一個FAT文件也將刪除它的短文件名。將一個文件重命名為一個「短」文件名也將一致地更改長文件名;同樣,將一個文件重命名為「長」文件名也將重新生成一個「短」文件名。在NTFS中,硬連結和兩個名字是不同的概念,並且每個硬連結都有兩個名字。最後,在API的層面上,當在系統中進行目錄搜索時兩個文件名都會出現;它們看起來不是兩個獨立的文件並且它們也沒有有必要去「映射」確定同一個文件。
美國專利 5,579,517 - 長、短文件名公用的命名空間。1995年4月24日備案。這包括將多個連續8.3目錄條目鏈接在一起支持長文件名的方法,其中一些條目特殊進行標記阻止可能引起混淆地早期的不支持長文件名的FAT實現。
公共專利基金會成功地對這項專利發起了挑戰;這個專利申請由於所申請的技術在專利美國專利 5,307,494 和 美國專利 5,367,671中的先期發現在2004年9月14日被駁回]。這個決定後來在2006年1月10日被美國專利局所推翻。
美國專利 5,758,352 - 長、短文件名公用的命名空間。1996年9月5日備案。它非常類似於5,579,517。
公共專利基金會成功地對這項專利發起了挑戰;美國專利商標局基於the six assignees names were incorrect [4]在2005年10月5日駁回了這項專利。這個決定也在後來的2006年1月10日被美國專利局推翻。
美國專利 6,286,013 - 在操作系統中為長、短文件名提供一個公用的命名空間的方法和系統。1997年1月28日備案。它所申請的內容包括Windows 95、Windows 98和Windows Me的長文件名提供給它們MS-DOS兼容層所用的方法。它看起來不影響非微軟的FAT實現。
許多技術評論斷言這些專利僅僅涵蓋了支持長文件名的FAT實現,那些只使用短名字的移動固態媒體和消費設備將不受影響。
另外,在微軟2000年12月6日出版的Microsoft Extensible Firmware Initiative FAT 32 File System Specification,FAT: General Overview of On-Disk Format,微軟公司明確地給出了一些授權,許多讀者將它認為是微軟允許操作系統廠商實現FAT。 由於人們廣泛要求重新審查這些專利,公眾專利基金會向美國專利和商標局(USPTO)提出了一些證據爭辯這些專利的有效性,其中包括施樂公司和IBM的早期參考資料。美國專利商標局承認這些證據提出了「可專利性的實質性的新問題」並且對於微軟公司FAT專利的有效性展開調查。
2004年9月30日,美國專利商標局主要基於公共專利基金會所提供的證據駁回了美國專利 5,579,517的專利主張。這個基金會的執行總裁Dan Ravicher說「現在專利局只不過是確認了我們已經知道了一段時間的事情,微軟公司的專利是假的。」
PUBPAT的新聞發布會說,「微軟公司仍然有機會回應專利局的駁回。有代表性的是第三方的重新審查要求如PUBPAT提供的資料成功地減小了專利的范圍或者有70%的機會完全駁回專利。」
2005年10月5日,專利局宣布隨著調查的深入它駁回了專利5.579,517的專利主張,另外它發現專利美國專利 5,758,352有錯誤的專利受益人而無效。
最後在2006年1月10日,專利局裁定微軟公司的FAT系統的實現特點是「新穎和非顯然的」,推翻了早期的兩個非最終裁決。

C. 跪求操作系統課程設計一份

; boot.asm: ANOS fat12 軟盤啟動代碼
; Larry Li, 2005.2.25
; 2005.3.19
; 整理注釋

PosBuf equ 0700h
StackTop equ 07BF0h
BootStart equ 07C00h
;下面是內核的載入地址
SegKernel equ 0100h

RootBufEnd equ 02h
DataStart equ 04h
CursorPos equ 10h

; BOOT 會被 BIOS 載入到 00007C00h 處
org 7C00h

; 代碼段
segment .text
; 16 位代碼
bits 16

; start: 首先是跳過必須的 FAT 信息表執行後面的程序
Start:
jmp short Main
; 補一個位元組的空指令
nop

; FAT12 信息
; 只是文件系統的描述信息
OEMName db 'ANOSDISK'
; 扇區大小(位元組),應為 512
BytesPerSector dw 512
; 簇的扇區數,應為 2 的冪,FAT12 為 1
SectsPerCluster db 1
; 保留扇區,FAT12/16 應為 1
ReservedSectors dw 1
; FAT 結構數目,一般為 2
NumberOfFats db 2
; 根目錄項目數,FAT12 為 224
MaxRootEntries dw 224
; 扇區總數,1.44M 軟盤為 2880
TotalSectors dw 2880
; 設備類型,1.44M 軟盤為 F0h
MediaDescriptor db 0f0h
; FAT 佔用扇區數,9
SectorsPerFat dw 9
; 磁軌扇區數,18
SectorsPerTrack dw 18
; 磁頭數,2
NumberOfHeads dw 2
; 隱藏扇區,默認為 0
HiddenSectors dd 0
; FAT32 使用,0
TotalSectorsBig dd 0
;; 下面的內容為 FAT12/16 所有,和 FAT32 不同
; MS-DOS 使用,0
BootDrive db 0
; Windows NT 使用,0
Reserved db 0
; 附加的可啟動標志,29h
ExtendSig db 029h
; 卷標序列號,00000000h
SerialNumber dd 00000000h
; 卷標,11 位元組,必須用空格( 20h )補齊
VolumeLabel db 'ANOS FLOPPY'
; 文件系統標志,
FileSystem db 'FAT12 '

; Main: BOOT 主程序
Main:
; 初始化運行環境
xor ax,ax
mov ss,ax
mov bp,BootStart
mov sp,StackTop
push ss
pop ds

; LoadRootDirSector: 讀取 FAT12 根目錄項目扇區
LoadRootDirSector:
push ss
pop es

; 計算 ROOT 啟始邏輯扇區
mov al,[BYTE bp+NumberOfFats]
; FAT 表數目
mul WORD [BYTE bp+SectorsPerFat]
; 乘上一個 FAT 表佔用的扇區數
add ax,WORD [BYTE bp+HiddenSectors]
; 加上隱藏的扇區數
add ax,WORD [BYTE bp+ReservedSectors]
; 加上保留的扇區數
push ax
mov WORD [BYTE bp-DataStart],ax
; AX ROOT 項目的啟始邏輯扇區, 保存

; 計算 ROOT 扇區數
mov ax,20h
mov cx,WORD [BYTE bp+MaxRootEntries]
mul cx
mov bx,WORD [BYTE bp+BytesPerSector]
add ax,bx
dec ax
div bx
mov cx,ax
; CX ROOT 扇區大小
add WORD [BYTE bp-DataStart],ax
; 更新數據區啟始邏輯扇區
mul bx
; AX ROOT 總扇區位元組大小
mov bx,PosBuf
; BX 緩存啟始地址
add ax,bx
; AX 緩存尾地址
mov WORD [BYTE bp-RootBufEnd],ax
; 保存尾地址

pop ax
; 取出 ROOT 項目啟始邏輯扇區
call ReadSectors
mov si,bx
; [ES:SI] 根目錄內容

; SearchRootDirSector: 在根目錄項目中搜索內核文件
SearchRootDirSector:
; [ES:SI] 為當前目錄項
; 其頭 11 個位元組為文件名稱
cmp [es:di],ch
; 如果目錄項的第一個位元組是0,這就是最後一個目錄項
jz NotFound
push si
; 保存 SI rep cmpsb 時 SI 會改變
mov cx,11
; 比較前 11 個位元組
mov di,FileName
; [DS:DI] 要載入的內核名稱
rep cmpsb
; 比較 [ES:SI] [DS:DI]
pop si
; 恢復 [ES:SI] 為當前查對的目錄項
je FoundKernel
add si,32
; [ES:SI] 指向下一個目錄項
; 每個目錄項 32 位元組
cmp si,WORD [BYTE bp-RootBufEnd]
; 是否到根目錄項目尾
jb SearchRootDirSector

; NotFound: 沒有發現內核的處理
NotFound:
mov si,msgNotFound
call PutChars
jmp ReBoot

; FoundKernel: 發現內核後處理
FoundKernel:
; [ES:SI] 內核文件目錄項
mov ax,[si+01ah]
push ax
; 內核文件啟始簇(低)地址
; 目錄項偏移 26(1ah) 為文件項目啟始簇低地址
; 偏移 20(14h) 為高地址
; 由 FAT12 只是 12 位簇地址, 低地址 16 位足以

xor dx,dx
mov es,dx
mov ax,WORD [BYTE bp+ReservedSectors]
; DX:AX 第一個 FAT 表的啟始邏輯扇區
mov bx,PosBuf
; [ES:BX] 讀盤緩存
mov cx,WORD [BYTE bp+SectorsPerFat]
; CX FAT 表扇區數
call ReadSectors

pusha
mov si,msgLoadKernel
call PutChars
popa

mov ax,SegKernel
mov es,ax
xor bx,bx
; [ES:BX] 讀盤緩存, 內核載入地址

pop ax
push ax
; 文件的第一個簇

; LoadKernel: 載入內核
LoadKernel:
; AX 當前簇
call ReadCluster
pop ax
; 取當前簇
add bx,0200h
; [ES:BX] 緩存地址增加 512 位元組(1 個扇區)
; 下面開始查 FAT12 表項目
; 所以對於簇 n 其項目位於 n / 2 * 3 處
; n / 2 * 3 = n / 2 + n
; n 為偶, 在低 12 位
; n 為奇, 在高 12 位
mov di,ax
; BP DI 文件簇 n
shr di,01h
; DI n / 2
pushf
; 保存標志位, 供以後奇偶處理
add di,ax
; DI n / 2 + n
add di,PosBuf
; DI 加上 FAT12 表的啟始地址
mov ax,[di]
; AX 一個 FAT12 組, 兩個簇號
popf
; 根據 n / 2 奇偶判定
jc ShiftRight4
and ax,0fffh
; 取低 12 位
jmp IsTheEnd
ShiftRight4:
mov cl,4
shr ax,cl
; 高 12 位, 所以右移 4 位
IsTheEnd:
cmp ax,0ff8h
; 比較, ff8h - fffh 表示簇鏈末尾
jae ExecKernel
; 載入完畢, 跳轉到內核地址
push ax
; 復制下一簇號
jmp LoadKernel

; ExecKernel: 運行內核
ExecKernel:
pusha
mov si,msgLoadKernelOK
call PutChars
popa

mov ah,3
xor bh,bh
int 10h
mov WORD [BYTE bp-CursorPos],dx
; 將當前游標位置寫入 7df0h 7df1h
;
push word SegKernel
push word 00h
; 入棧供返回指令跳轉
retf

; BadDisk: 顯示錯誤啟動信息,然後重啟
BadDisk:
mov si,msgDiskError
call PutChars
; ReBoot: 重啟
ReBoot:
mov si,msgAnyKey
call PutChars
xor ax,ax
int 16h
; 等待鍵盤按鍵
int 19h
; 重啟

; ReadCluster: 讀磁碟文件簇
; 讀數據簇 AX 到 [ES:BX]
; CarryFlag == 1 錯誤
ReadCluster:
; 顯示一個 .
push ax
mov ax,0e2eh
int 10h
pop ax

dec ax
dec ax
; 修正, 簇號 - 2
add ax, WORD [BYTE bp-DataStart]
; AX 數據的啟始邏輯扇區
xor dx,dx
mov cx,01h

; ReadSectors: 讀磁碟扇區
; 讀 CX 個邏輯扇區(地址 DX:AX)到 [ES:BX]
; CarryFlag == 1 錯誤
ReadSectors:
pusha
push cx ; 保存讀取扇區數
; 首先要將 DX:AX 邏輯扇區號轉換為[驅動器號][磁頭號][磁軌號][扇區號]
; 根據:磁碟總扇區 = 磁軌數 * 磁頭數 * 扇區數
; 邏輯扇區 = (磁軌號 * 磁頭數 + 磁頭號) * 扇區數 + 扇區號 - 1
; (注意:實際在磁軌的扇區號是從 1 開始計數的,其他號從 0 開始)
; 那麼:扇區號 = 邏輯扇區 % 磁軌的扇區數 + 1
; 同樣:含磁頭計算的磁軌號 = 邏輯扇區 / 磁軌的扇區數
; 除掉磁頭數,就是:磁軌號 = 含磁頭計算的磁軌號 / 磁頭數
; 所以:磁頭號 = 含磁頭計算的磁軌號 % 磁頭數
xchg ax,cx ; AX <=> CX
xchg ax,dx ; AX <=> DX
; AX:CX 邏輯扇區
xor dx,dx ; DX 清零
div WORD [BYTE bp+SectorsPerTrack] ; 除高位
; 計算得含磁頭計算的磁軌號的高位
xchg ax,cx ; 臨時保存到 CX
; 此時余數 DX 與 AX 組成新數繼續低位除
div WORD [BYTE bp+SectorsPerTrack] ; 除低位
; 余數 DX 為 0 開的扇區號
inc dx ; 修正為 1 開
xchg cx,dx ; CX <=> DX
; CX 為扇區號
; DX:AX 為含磁頭計算的磁軌號
div WORD [BYTE bp+NumberOfHeads] ; 繼續除
; AX 為磁軌號
; DX(DL) 為磁頭號
mov dh,dl
; DH 磁頭號
mov dl,[BYTE bp+BootDrive]
; DL 驅動器號
mov ch,al
; CX bit 8-15(CH) 磁軌低 8 位
ror ah,2
; CX bit 6-7(AH bit 6-7) 磁軌高 2 位
or cl,ah
; CX bit 0-5 扇區
pop ax
; AL 操作扇區數目
mov ah,02h
; AH 02h 讀磁碟扇區
int 13h
; BIOS 13h 調用
; int 13h BIOS 功能
; 參數
; AH = 0x02 讀磁碟扇區到內存
; AL 需要讀出的扇區數量
; CH 磁軌(柱面)號的低 8 位
; CL 開始扇區(0-5位),磁軌號高 2 位(6-7)
; DH 磁頭號
; DL 驅動器號
; ES:BX 指向數據緩存
; 返回
; 出錯置 CF 標志位
; AH 狀態 = 0x01
; AL 讀取的扇區數
jc BadDisk

popa
ret

; PutChars: 列印字元串
; 入口參數 si
PutChars:
lodsb
or al,al
jz short Done
mov ah,0eh
mov bx,07h
int 10h
jmp short PutChars
Done:
retn

TheEnd:
db 0

msgLoadKernel db 'Loading ANOS',0
msgLoadKernelOK db 'OK!',0Dh,0Ah,0
msgNotFound db 'Cannot found ANOS kernel!',0Dh,0Ah,0
msgDiskError db 'Disk Error!',0Dh,0Ah,0
msgAnyKey db 'Press any key to reboot...',0Dh,0Ah,0

; 將 BOOT 映象對齊到 512 個位元組
times 496-($-$$) db 0

FileName db 'ANOS SYS',0,0

BootPartition:
db 0

; 啟動標志
BootSignature dw 0AA55h ; BootSector signature

D. 操作系統課程設計報告

題 目 : [課程設計] 操作系統課程設計報告
尺 寸 : 操作系統課程設計_進程調度.doc
目 錄 : 不存在

原 文 : 通過大三第一學期的操作系統學習,我們對操作系統的基本概念,原理及實現技術都有了一定的了解,也為我們這次的課程設計做好了理論上的准備。通過學習與交流我們這次在李長悅老師的帶領下進行了為期一周的課程設計。為我們更好的鞏固已學習的知識及培養我們的動手能力創造了良好的機會。
這次課程設計主要是進行進程調度的虛擬實現,在課程設計以前李老師就把調度原則告訴了我們:
一 進程調度
1.調度原則
採用動態優先數調度與時間片相結合的調度演算法。首先從就緒隊列(按優先數從高到低排列)中選取一個將要投入運行的進程,投入運行1秒鍾(至多一秒鍾。以一秒鍾作為時間片),若在規定的時間片內進程未完成運行,則讓出CPU,該進程的運行時間減1,並按下列優先數重新確定進程的優先數,即:
新優先數=原優先數*0.8+10/剩餘時間
接著將該進程重新插入就緒隊列,重新從就緒隊列選取下一個合適的進程再投入運行。
2.進程數據結構

關鍵詞 : 課程設計 操作系統 進程調度 實習報告

E. 操作系統課程設計(linux)

我也遇到過這個問題,安裝的時候你沒有裝圖形用戶終端(似乎是叫回Xwindow)。之前有叫你打勾安答裝的。所以最後就只有命令行界面了(其實這個界面也可以解,但我不大會)。重回到開頭找到打勾選項去勾選相應圖形界面安裝!

F. 操作系統課程設計----文件系統設計

就是SADAW架上額啊福娃我再減去二期 2 去

G. 操作系統課程設計

這里有許多操作系統的課程內容和課件,有的演示程序比較生動,希望對你的課有幫助:
http://www.ccec.e.cn/xxjs/jsjx/jpk/os/1.htm
http://oa.gt.e.cn/os/multimedia/learn.htm
http://jpkc.cuit.e.cn/kecheng/czxt/contentshow.asp?classid=51&class=1

H. win7文件系統裡面FAT表有什麼作用

win7不支抄持FAT32文件系統。
Win7操作系統必須安襲裝在NTFS文件格式下,在FAT32格式下不能進行安裝。而XP操作系統,則支持FAT32和NTFS兩種文件格式。DOS系統也不支持NTFS格式,因此在DOS下格式化NTFS格式的C盤,實際上只是對第一個FAT32分區進行了格式化。

I. 請教計算機操作系統題:.假定磁碟的大小為1K,對於100MB的軟盤,FAT需佔用 () 的存儲空間

對於1.2MB的軟盤,FAT需佔用 1.8k的存儲空間;對於100MB的硬碟,FAT需佔用1.08MB的存儲空間。

磁碟塊大小為1KB,1.2MB的軟盤一共有1.2K個盤塊,1K<1.2K<2K,所以每個盤塊在FAT表中需佔用11位,為了方便存取,一般採用一個位元組或半個位元組為單位,所以11位需佔用1.5B,即文件分配表中的每個表目需1.5個位元組,1.5B×1.2K=1.8KB。

需要注意的是,為了存取方便,文件分配表中的表目一般佔一個位元組或半個位元組,即其位數是4的倍數,所以雖然算出是每個表目只要11位即可,但在計算時應認為是佔了12位,即1.5個位元組。

100MB/1KB=100K,就是每塊1KB的地址用2個位元組表示,就是540K(塊)*2B/塊=1080KB=1.08MB。

(9)操作系統課程設計fat表擴展閱讀:

一個FAT文件系統包括四個不同的部分。

1、保留扇區,位於最開始的位置。第一個保留扇區是引導區(分區啟動記錄)。它包括一個稱為基本輸入輸出參數塊的區域(包括一些基本的文件系統信息尤其是它的類型和其它指向其它扇區的指針),通常包括操作系統的啟動調用代碼。

2、FAT區域。它包含有兩份文件分配表,這是出於系統冗餘考慮,盡管它很少使用,即使是磁碟修復工具也很少使用它。

3、根目錄區域。它是在根目錄中存儲文件和目錄信息的目錄表。

4、數據區域。這是實際的文件和目錄數據存儲的區域,它占據了分區的絕大部分。通過簡單地在FAT中添加文件鏈接的個數可以任意增加文件大小和子目錄個數。

熱點內容
武漢大學學生會輔導員寄語 發布:2021-03-16 21:44:16 瀏覽:612
七年級學生作文輔導學案 發布:2021-03-16 21:42:09 瀏覽:1
不屑弟高考成績 發布:2021-03-16 21:40:59 瀏覽:754
大學畢業證會有成績單 發布:2021-03-16 21:40:07 瀏覽:756
2017信陽學院輔導員招聘名單 發布:2021-03-16 21:40:02 瀏覽:800
查詢重慶2018中考成績查詢 發布:2021-03-16 21:39:58 瀏覽:21
結業考試成績怎麼查詢 發布:2021-03-16 21:28:40 瀏覽:679
14中醫醫師資格筆試考試成績查分 發布:2021-03-16 21:28:39 瀏覽:655
名著賞析課程標准 發布:2021-03-16 21:27:57 瀏覽:881
北京大學商業領袖高端培訓課程 發布:2021-03-16 21:27:41 瀏覽:919