操作系统课程设计fat表
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中添加文件链接的个数可以任意增加文件大小和子目录个数。