操作系统文件课程设计|操作系统课程设计——为LINUX 设计一个简单的二级文件系统

操作系统文件课程设计|操作系统课程设计——为LINUX 设计一个简单的二级文件系统的第1张示图

㈠ 操作系统课程设计

—、计算机操作系统课程设计方案 课程概况 计算机操作系统是中央电大计算机科学与技术专业(本科)的一门统设必修课。课程教学总学时72,4学分,开设一学期。前修课程为计算机组成原理、面向对象程序设计和数据结构。 计算机操作系统课是计算机专业的重要课程之一,通过学习使学员掌握计算机操作系统的设计基本原理及组成;计算机操作系统的基本概念和相关的新概念、名词及术语;了解计算机操作系统的发展特点和设计技巧和方法;对常用计算机操作系统(DOS、Windows和UNIX或linux)会进行基本的操作使用。 • 课程主要内容 主要内容包括:计算机操作系统概述、作业管理、文件管理、存储管理、输入输出设备管理、进程及处理机管理、操作系统结构及程序设计。 二、教学内容体系及教学要求 第一章 操作系统概述 教学内容: 操作系统定义及发展;操作系统的形成和五大类型;操作系统的五大功能;表征操作系统的属性;操作系统的配置、“生成”概念 教学要求: 熟练掌握:什么是操作系统;知道操作系统有五大类型和五大功能; 掌握:至少掌握一种实际揽操作系统的安装、使用和维护; 了解:初步了解如何认识、熟悉和解剖操作系统 第二章 人机交互界面、任务、作业管理 教学内容: 人机交互界面的发展特点;第一、二、三代界面开发特点;基本的键盘命令和系统调用操作系统Shell语言;作业调度算法; 教学要求: 熟练掌握:能进行一些人机接口界面的设计; 掌握:掌握操作系统人机接口界面的基本设计思想; 了解:操作系统传统的接口界面 第三章 文件管理 教学内容: 文件管理的任务与功能;文件的结构与分类;文件的物理结构和逻辑结构;文件的目录结构;文件的存取控制和安全机制;文件系统与模型结构; 教学要求: 熟练掌握:文件的基本存取控制和系统管理; 掌握:文件系统的目录分类管理特点; 了解:文件系统的编程设计 第四章 内部存储管理 教学内容: 内存的分区、分页、分段管理概念;物理地址与逻辑地址;内存“扩充”技术;页式存储管理;段式存储管理;内存的分配算法 教学要求: 熟练掌握:内存管理中基本分配和调度方法; 掌握:掌握内存管理中各种分区、分页和分段方法的特点; 了解:内存空间的有效利用 第五章 输入输出设备管理 教学内容: 输入输出设备功能与分类;独享、共享、虚拟设备的管理特点;输入输出设备处理程序;输入输出设备的管理策略; 教学要求: 熟练掌握:掌握输入输出设备的管理特点; 掌握:掌握输入输出设备的分类设计方法; 了解:输入输出设备处理程序的编程要点 第六章 低级处理机管理 教学内容: 操作系统核心功能;“进程”概念;进程的并发与并行;进程的基本状态与转换;进程调度算法;进程的同步与互斥;进程的P—V操作;“死锁”概念; 教学要求: 熟练掌握:操作系统核心运行与“进程”的基本概念; 掌握:“进程”的基本转换状态与应用特点; 了解:进程调度算法的程序编制 第七章 操作系统程序结构 教学内容: 操作系统的层次、模块结构;操作系统的设计与检测; 教学要求: 本章教学基本要求:了解现代计算机操作系统的基本设计思想与方法 三、课程教学媒体说明 本课程使用的教学媒体主要有:文字教材、录像教材和网上教学辅导。 1. 文字教材 《计算机操作系统》(第2版)吴企渊著清华大学出版社 注:课程实验含在主教材中。 文字教材为该课程的主媒体。文字教材的编写既保持了学科体系的先进性、科学性,又兼顾操作系统的理论、技术、实现三方面的融合,并强调能力的培养。 2. 录像教材 该课程已经制作16讲课程录像,每讲50分钟,讲授课程的重点、难点、课程总结。帮助学生理解,建立操作系统的整体概念和思想,由吴企渊教授主讲。 课程录像与文字教材相对应,注意发挥录像教材艺术表现力、形象化教学的作用。 3.网上教学辅导 网上教学辅导与上述媒体有机配合,有几方面作用:(1)发布教学指导性文件、课程公告、问题咨询、参考资料;(2)按照教学进度,发布辅导文章,刊登练习自测题;(3)在课程论坛上进行实时答疑和日常答疑;(4)开展网上的教师培训和教学研讨等工作。 文字教材是学生学习的基本依据,录像教材是文字教材的补充,网上辅导则是教与学交互的便捷方式。总之,多种媒体的分工和搭配为学生提供较大的自学空间,便于学生自由选择、自主学习,提高学生的自学能力。 四、教学安排建议 1. 课程主教材及课程实验教学安排建议 教学点请根据中央电大的统一要求安排课程的面授辅导,见表1。 表1 课程主教材及课程实验教学安排建议 周次 教学内容 建议学时 实验内容 建议学时 一 操作系统课程教学安排概况介绍 2 二 操作系统定义、五大类型和五大功能 4 三 人机交互界面管理 2 Linux实践准备 1 四 作业管理任务调度 4 五 文件管理的任务和功能 2 Linux操作命令使用 1 六 文件的逻辑结构和物理结构 4 七 存储管理的任务和功能 2 命令解释程序编制 2 八 分区式分配存储管理 4 九 页式、段式分配存储管理 6 作业调度模拟编程 4 十 设备管理的任务和功能 2 十一 设备分配技术和管理 4 存储管理设计 4 十二 进程的定义和特征 4 十三 进程调度与通信 6 进程调度模拟编程 4 十四 死锁的产生和处理 2 十五 操作系统的层次模块结构 4 十六 (总复习) 4 总计 56 16 课程录像内容,见表2。 表2 录像教材内容 章 教学内容 课内学时 录像学时分配 一 操作系统概述 8学时 4 二 作业管理 8学时 2 三 文件管理 8学时 2 四 存储管理 8学时 2 五 设备管理 8学时 2 六 进程管理 10学时 4 七 操作系统程序结构 6学时 0 总计 56学时 16 2、网上辅导 网上辅导内容包括课程的教学文件、课程辅导、网络课堂。充分利用网络资源,定期与不定期的在网上提供有关的课程辅导材料,根据教学需要,适当安排网上辅导和考前答疑活动。具体安排如下: • 教学文件 包括课程说明、教师介绍、教学大纲、教学设计方案。 • 课程辅导 包括课程作业及解答、专题辅导、练习和解答、期末自测、考核说明等;网上还提供了教师讲课教案,供各教学点教学使用。 • 网络课堂 包括直播课堂和IP课件。 网上教学活动:中央电大一般将每学期集中安排1次对学生的实时在线辅导,和1次对教师的教研活动。具体的时间安排每学期在电大在线主页上公布。 • 论坛:进行课程的日常答疑。 3、直播课堂 课程首开学期,通过教育电视台直播方式,安排4次直播课堂,每次50分。前3讲为对教学重点、难点,对教学过程中反映的共性问题和有代表性的问题进行辅导,后1讲为复习辅导和有关考试说明。直播课堂的内容挂在课程网页内。 4、作业 该课程有一份形成性考核册,即课程作业册。作业成绩计入课程总成绩。中央电大将不定期地抽查作业,检查作业的评审及完成情况。 关于课程考核的具体内容,请参考中央电大“计算机操作系统课程考核说明”。 五、教学方法的建议 • 教学建议 (1)计算机操作系统是实践性较强的课程。其特点是概念多、涉及面广。要求教学辅导要由浅入深对易混淆的概念加以详细说明,对每章的重点,管理和控制的调度算法技巧作详细介绍。 (2)在实验中着重培养学员熟练使用操作系统,以及在维护操作系统工作中的分析问题和解决问题能力。 • 学习建议 (1)学习操作系统要从宏观和微观两方面把握。在宏观上要认识操作系统在计算机系统中的地位,清楚操作系统的整体结构;微观方面应掌握操作系统是如何管理计算机的各种资源的(进程、处理机、存储器、文件、设备),理解有关概念、原理及技术。 (2)操作系统是计算机技术与管理技术的结合,学习时可以联想日常生活中熟悉的管理示例反复体会操作系统的管理方法,以加深对问题的理解。 (3)注意加强对自主学习能力和动手能力的培养,努力实现“学以致用”的目标。

㈡ 操作系统课程设计 (包括进程管理、进程的同步和互斥、存储管理)

一、实验的目的与基本要求实验目的本课程设计是为了配合操作系统课程的理论教学而设置的,目的是通过课程设计的综合训练,加强学生对操作系统概念的实际应用技能的训练,提高学生分析问题和解决问题的能力。基本要求课程设计按照教学要求需要两周时间完成,两周中每天(按每周5天)至少要上3-4小时的机来调试程序。学生要发挥自主学习的能力,充分利用时间,安排好课设的时间计划,并在课设过程中不断检测自己的计划完成情况,及时的向教师汇报。课程设计的具体内容如下:设计1 进程管理1. 设计目的加深对进程概念的理解,明确进程和程序的区别;进一步认识并发执行的实质;实现Linux中进程通信的两种方式:软中断和管道通信。2. 设计内容1) 进程的创建和控制编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。每个进程在屏幕上显示一个字符,记录屏幕上的显示结果,并分析原因。修改以编写的程序,将每个进程输出一个字符改为每个进程输出一句话。2) 进程的软中断通信使用系统调用fork()创建两个子进程,使用系统调用signal()让父进程捕捉用alarm函数设置时钟的时间段终止时产生的信号,当捕捉到该信号后,父进程使用系统调用Kill()向两个子进程发出信号,子进程捕捉到信号后分别输出子进程被杀死信息后终止,父进程等待两个子进程终止后,输出父进程被杀死信息后终止程序。记录屏幕上的显示结果,并分析原因。3) 进程的管道通信使用系统调用pipe()建立一个管道;两个子进程分别向管道写信息,父进程则从管道读出来自子进程的信息,显示在屏幕上。记录屏幕上的显示结果,并分析原因。3. 系统调用函数说明、参数值及定义1. Fork()创建一个新进程进程int fork()其中返回int取值意义如下:正确返回:在父进程中返回子进程的进程号,在子进程中返回0错误返回:-12. Lockf(int files,int function,long size)用作锁定文件的某些段或者整个文件。file:文件描述符;function:锁定和解锁,1表示锁定,0表示解锁;size:是锁定或解锁的字节数,若用0,表示从文件的当前位置到文件尾。3. Signal(int sig, (*func) function)进程控制软中断信号的处理。signal()会依照参数sig指定的信号编号来设置该信号的处理函数。sig: SIGALRM: alarm()函数设置的时钟的时间段终止时产生的信号.其它信号略function:信号处理的一个函数地址。4. kill(int pid,int sig)向一个进程或一个进程组发信号,可以用来送参数sig指定的信号给参数pid指定的进程。pid: pid>0 将信号传给进程号为pid的进程其它略signumber: 送给进程号为pid进程指定信号量5. alarm(unsigned int seconds)设置一个指定时间的计时器seconds: 设置时间秒数6. int pipe(int filedes[2])filedes为整数数组名,在调用这个函数后,系统为通道分配的两个文件描述符将通过这个数组返回到用户进程中, filedes[1]是文件输出描述符, filedes[0]是文件输入描述符7. int wait(int *status)暂停目前进程的执行,直到有信号到来或子进程的结束。子进程的结束状态指会由参数status返回,如果不在意结束状态时,则参数status可以设置成NULL设计2 进程的同步与互斥1. 设计目的分析进程争用资源的现象,学习解决进程互斥的方法。2. 设计内容用程序实现生产者-消费者问题l 问题描述:一个仓库可以存放K件物品。生产者每生产一件产品,将产品放入仓库,仓库满了就停止生产。消费者每次从仓库中去一件物品,然后进行消费,仓库空时就停止消费。l 数据结构:进程:Procer – 生产者进程,Consumer – 消费者进程buffer: array [0..k-1] of integer;in,out: 0..k-1;in记录第一个空缓冲区,out记录第一个不空的缓冲区s1,s2,mutex: semaphore;s1控制缓冲区不满,s2控制缓冲区不空,mutex保护临界区;初始化s1=k,s2=0,mutex=1l 原语描述procer(生产者进程):Item_Type item;{while (true){proce(&item);p(s1);p(mutex);buffer[in]:=item;in:=(in+1) mod k;v(mutex);v(s2);}}consumer(消费者进程):out:=(out+1) mod k;v(mutex);v(s1);}}设计3 存储管理1. 设计目的通过请求页式存储管理中页面置换算法设计,了解存储技术的特点,掌握请求页式存储管理的页面置换算法。2. 设计内容l 将指令序列转换为用户虚存中的请求调用页面流。i. 页面大小为1Kii. 用户内存容量为4页到40页iii. 用户外存的容量为40k在用户外存中,按每K存放10条指令,400条指令在外存中的存放方式为:0-9条指令为第0页10-19条指令为第1页。390-399条指令为第39页按以上方式,用户指令可组成40页l 通过随机数产生一个指令序列,共400个指令(0-399)l 模拟请求页式存储管理中页面置换算法执行一条指令,首先在外存中查找所对应的页面和页面号,然后将此页面调入内存中,模拟并计算下列各述算法在不同内存容量下的命中率(页面有效次数/页面流的个数)1) 先进先出的算法(FIFO)2) 最久未使用算法(LRU)3. 提示l 随机指令的产生 rand() 或srand()l 用户内存中页面控制结构采用链表 页面控制结构 struct p_str{ int pagenum; /* 页号 */ int count; /* 访问页面的次数 */struct p_str next; /* 下一指针 */}p_str;

㈢ 操作系统课程设计,C语言写的文件管理系统

操作系统课程设计,C语言写的文件管理系统 、。要求有没,根据要求可以做的

㈣ 操作系统课程设计:如何用c或c++或java模拟dos文件的建立与使用

#include<string.h>#include<iostream>#include <iomanip>#include "Graphics.h"#include<conio.h>using namespace std;const int FDF=-2;const int FFF=-1;const int N=100;//存储空间int fnum;//文件数量struct FILEINFO{ char name[10]; int length; int index[10];};FILEINFO file[10];char DISK[N]; int blankspace;void Graphindex(int last);void printDISK(){ int i; cout<<"空闲块数:"<<blankspace<<endl; for(i=0;i<N/5;i++){ cout<<" No."<<setw(3)<<i<<setw(4)<<DISK[i]; cout<<" No."<<setw(3)<<i+1*N/5<<setw(4)<<DISK[i+1*N/5]; cout<<" No."<<setw(3)<<i+2*N/5<<setw(4)<<DISK[i+2*N/5]; cout<<" No."<<setw(3)<<i+3*N/5<<setw(4)<<DISK[i+3*N/5]; cout<<" No."<<setw(3)<<i+4*N/5<<setw(4)<<DISK[i+4*N/5]<<endl; }}void write(char *tmpname,int tmplength){ int i,j; //复制文件名和文件块个数 strcpy(file[fnum].name,tmpname); file[fnum].length=tmplength; //存文件 for(i=0;i<tmplength;i++){ for(j=0;j<N;j++){ if(DISK[j]=='N'){ file[fnum].index[i]=j;//首个空闲块为文件开始块 DISK[j]='Y'; break; } } } blankspace-=tmplength;//改变空闲块个数 fnum++; cout<<"name and size :"<<tmpname<<" "<<tmplength<<endl;}void insert(char *tmpname,int insertpoint){ int i; int last; //寻找要执行插入操作的文件,将其数组下标存入last for(i=0;i<fnum;i++){ if(strcmp(file[i].name,tmpname)==0){ last=i; break; } } for(i=0;i<file[last].length-insertpoint;i++){ file[last].index[file[last].length-i*1]=file[last].index[file[last].length-(i+1)*1]; } for(i=0;i<N;i++){ if(DISK[i]=='N'){ file[last].index[insertpoint]=i; DISK[i]='Y'; break; } } //改变空闲块个数与文件长度 file[last].length++; blankspace–; cout<<"name and size :"<<tmpname<<" "<<file[last].length<<endl;}void printindex(char *tmpname){ int last,i; for(i=0;i<fnum;i++){ if(strcmp(file[i].name,tmpname)==0){ last=i; break; } } cout<<" "<<file[last].name<<" 索引表"<<endl; cout<<" 逻辑记录号 物理块号"<<endl; for(i=0;i<file[last].length;i++){ cout<<setw(7)<<i<<setw(10)<<file[last].index[i]<<endl; } Graphindex(last);}void itol(int i){ LPCTSTR yy; char zz[10]; sprintf(zz, "%d", i); //itoa(i,zz,10); yy = LPCTSTR( zz ); //moveto(x+i*2,y+20); moverel(25,9); outtext(yy); //return yy;}void ctol(char *c){ LPCTSTR yy; yy = LPCTSTR( c ); moverel(0,0); outtext(yy);}void Graphindex(int last){ int i,xx=100,yy=100,x=400,y=50; initgraph(640, 480); setfillstyle(SOLID_FILL,WHITE); floodfill(5,5,WHITE); setcolor(BLACK); moveto(110,50); ctol(file[last].name); outtextxy(150,50,"索引表"); outtextxy(115,80,"逻辑"); outtextxy(175,80,"物理"); rectangle(xx,yy-30,xx+60,yy); rectangle(xx+60,yy-30,xx+120,yy); for(i=0;i<file[last].length;i++){ rectangle(xx,yy+i*30,xx+60,yy+(i+1)*30); moveto(xx,yy+i*30); itol(i); rectangle(xx+60,yy+i*30,xx+120,yy+(i+1)*30); moveto(xx+60,yy+i*30); itol(file[last].index[i]); moveto(xx+130,yy+i*30+15); lineto(x+(file[last].index[i]/20)*20+5,y+(file[last].index[i]%20)*20+5); } ellipse(x+45,25,0,360,60,15); ellipse(x+45,440,180,360,60,15); line(x-15,25,x-15,440); line(x+105,25,x+105,440); for(i=0;i<N;i++){ if(DISK[i]=='Y'){ setcolor(RED); rectangle(x+(i/20)*20,y+(i%20)*20,x+(i/20)*20+10,y+(i%20)*20+10); }else setcolor(GREEN); rectangle(x+(i/20)*20,y+(i%20)*20,x+(i/20)*20+10,y+(i%20)*20+10); } getch(); closegraph();}void Graph(){ int i,x=300,y=50; initgraph(640, 480); setfillstyle(SOLID_FILL,WHITE); floodfill(5,5,WHITE); setcolor(BLACK); ellipse(x+45,25,0,360,60,15); ellipse(x+45,440,180,360,60,15); line(x-15,25,x-15,440); line(x+105,25,x+105,440); for(i=0;i<N;i++){ if(DISK[i]=='Y'){ setcolor(RED); rectangle(x+(i/20)*20,y+(i%20)*20,x+(i/20)*20+10,y+(i%20)*20+10); }else setcolor(GREEN); rectangle(x+(i/20)*20,y+(i%20)*20,x+(i/20)*20+10,y+(i%20)*20+10); } getch(); closegraph();}void main(){ int i; char tmpname[10]; int tmplength;//要写入文件长度 int o;//命令 fnum=0; for(i=0;i<N;i++){ //初始化FAT表 DISK[i]='N'; } DISK[1]='Y'; blankspace=N; while(1){ cout<<"请选择: 1.写入 2.插入 3.显示文件目录 4.显示DISK表"<<endl; cin>>o; switch(o){ case 1: cout<<"输入文件名:"; cin>>tmpname; cout<<"输入文件长度:"; cin>>tmplength; write(tmpname,tmplength); break; case 2: cout<<"输入文件名:"<<endl; cin>>tmpname; int insertpoint; cout<<"输入插入点"<<endl; cin>>insertpoint; insert(tmpname,insertpoint); break; case 3: cout<<"输入文件名:"<<endl; cin>>tmpname; printindex(tmpname);break; case 4: printDISK();Graph();break; } } cin.get();}

㈤ 跪求操作系统课程设计一份

; boot.asm: ANOS fat12 软盘启动代码; Larry Li, 2005.2.25; 2005.3.19; 整理注释PosBuf equ 0700hStackTop equ 07BF0hBootStart equ 07C00h;下面是内核的加载地址SegKernel equ 0100hRootBufEnd equ 02hDataStart equ 04hCursorPos equ 10h; BOOT 会被 BIOS 载入到 00007C00h 处org 7C00h; 代码段segment .text; 16 位代码bits 16; start: 首先是跳过必须的 FAT 信息表执行后面的程序Start: jmp short Main ; 补一个字节的空指令 nop; FAT12 信息; 只是文件系统的描述信息OEMName db 'ANOSDISK'; 扇区大小(字节),应为 512BytesPerSector dw 512; 簇的扇区数,应为 2 的幂,FAT12 为 1SectsPerCluster db 1; 保留扇区,FAT12/16 应为 1ReservedSectors dw 1; FAT 结构数目,一般为 2NumberOfFats db 2; 根目录项目数,FAT12 为 224MaxRootEntries dw 224; 扇区总数,1.44M 软盘为 2880TotalSectors dw 2880; 设备类型,1.44M 软盘为 F0hMediaDescriptor db 0f0h; FAT 占用扇区数,9SectorsPerFat dw 9; 磁道扇区数,18SectorsPerTrack dw 18; 磁头数,2NumberOfHeads dw 2; 隐藏扇区,默认为 0HiddenSectors dd 0; FAT32 使用,0TotalSectorsBig dd 0;; 下面的内容为 FAT12/16 所有,和 FAT32 不同; MS-DOS 使用,0BootDrive db 0; Windows NT 使用,0Reserved db 0; 附加的可启动标志,29hExtendSig db 029h; 卷标序列号,00000000hSerialNumber 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 IsTheEndShiftRight4: 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: 打印字符串; 入口参数 siPutChars: lodsb or al,al jz short Done mov ah,0eh mov bx,07h int 10h jmp short PutCharsDone: retnTheEnd: db 0msgLoadKernel db 'Loading ANOS',0msgLoadKernelOK db 'OK!',0Dh,0Ah,0msgNotFound db 'Cannot found ANOS kernel!',0Dh,0Ah,0msgDiskError db 'Disk Error!',0Dh,0Ah,0msgAnyKey db 'Press any key to reboot…',0Dh,0Ah,0; 将 BOOT 映象对齐到 512 个字节times 496-($-$$) db 0FileName db 'ANOS SYS',0,0BootPartition: db 0; 启动标志BootSignature dw 0AA55h ; BootSector signature

㈥ 操作系统课程设计:Nachos的文件管理模块升级

这是我们做的、基本上满足你的要求#pragma warning(disable:4786)#include <iostream>#include <string>#include <vector>#include <iomanip>using namespace std;struct File{ string name; bool isDir; int pos; int len; File* pPre; File* pNxt; File* pChd; File* pPar; File(){name = "";isDir = false;pos = len = 0;pChd = pPar = pPre = pNxt = NULL;}};class DirSystem{private: File* pRoot;public: DirSystem(){pRoot = new File;pRoot->pChd = new File;pRoot->pPar = pRoot;} File* Append(File*& tail,const File& f) { tail->pNxt = new File; tail->pNxt->isDir = f.isDir; tail->pNxt->len = f.len; tail->pNxt->pos = f.pos; tail->pNxt->name = f.name; tail->pNxt->pChd = tail->pNxt->pNxt = tail->pNxt->pPar = NULL; tail->pNxt->pPre = tail; return tail->pNxt; } void Md(File*& pCur,const File& f) { if(pCur->pChd == NULL) { pCur->pChd = new File; pCur->pChd->pPar = pCur; Append(pCur->pChd,f); } else { File* tmp = pCur->pChd; while(tmp->pNxt != NULL) tmp = tmp->pNxt; Append(tmp,f); } } void Show(File* pF) { if(pF == NULL) return; File* cur = pF->pNxt; while(cur != NULL) { cout << cur->name; if(cur->isDir) cout << "(文件夹) " << endl; else cout << "(文件) " << endl; cur = cur->pNxt; } } void Rd(File* pF) { if(pF == NULL) cout << "文件不存在!" << endl; else if(pF->pChd != NULL) cout << "该文件夹中还有其它文件,拒绝删除!" << endl; else { pF->pPre->pNxt = pF->pNxt; if(pF->pNxt != NULL) pF->pNxt->pPre = pF->pPre; delete pF; } } void Init() { int num; cout << "输入分区数:" << endl; cin >> num; int i,pos; File f,*t; pos = 0; t = pRoot->pChd; f.isDir = true; f.pChd = f.pNxt = f.pPar = f.pPre = NULL; char ch = 'C'; for(i = 0;i < num;++i) { cout << "输入分区容量:" << endl; cin >> f.len; f.pos = pos; pos += f.len; f.name = ch++ + string(":"); t = Append(t,f); } } void Run() { File* pCur; pCur = pRoot->pChd->pNxt; string hint,cmd,tmp; hint = pCur->name + "\\>"; while(true) { cout << hint; cin >> cmd; cmd = Uniform(cmd); if(cmd == "DIR") { cout << pCur->name << endl; Show(pCur->pChd); } else if(cmd == "CD") { cin >> cmd; cmd = Uniform(cmd); File* ftmp = pCur; string htmp = hint; hint = ""; pCur = pRoot; bool find = false; vector<string> nm = Parse(cmd); for(int i = 0;i < nm.size();++i) { find = false; pCur = pCur->pChd->pNxt; while(pCur != NULL) { if(pCur->name == nm[i]) { hint += nm[i] + '\\'; find = true; break; } pCur = pCur->pNxt; } if(!find) break; } if(!find) { pCur = ftmp; hint = htmp; cout << "没有找到要转向的路径!" << endl; } else { if(nm.size() > 1) hint.erase(hint.end()-1); hint += ">"; } } else if(cmd == "MD") { cin >> cmd; File f; f.isDir = true; f.pos = 0; f.len = 100; f.name = cmd; f.pChd = f.pPar = f.pNxt = f.pPre = NULL; Md(pCur,f); } else if(cmd == "MF") { cin >> cmd; File f; f.isDir = false; f.pos = 0; f.len = 100; f.name = cmd; f.pChd = f.pPar = f.pNxt = f.pPre = NULL; Md(pCur,f); } else if(cmd == "RD") { cin >> cmd; File* tar = pCur->pChd; while(tar) { if(tar->name != cmd) tar = tar->pNxt; else break; } Rd(tar); } else { cout << "您输入的命令本系统不识别!" << endl; } } }private: vector<string> Parse(string tar) { vector<string> res; int beg,end; beg = 0; end = tar.find('\\',beg); while(true) { res.push_back(tar.substr(beg,end – beg)); if(end == -1) break; beg = end + 1; end = tar.find('\\',beg); } return res; } string Uniform(string cmd) { string res = cmd; int offset = 'A' – 'a'; for(int i = 0;i < cmd.size();++i) { if(cmd[i] >= 'a' && cmd[i] <= 'z') res[i] = cmd[i] + offset; } return res; }};int main(){ DirSystem ds; ds.Init(); ds.Run(); return 0;}

㈦ 操作系统课程设计——为LINUX 设计一个简单的二级文件系统

悬赏分:10?

㈧ 操作系统课程设计(高分求)

NO

㈨ 操作系统课程设计的内容简介

本书介绍了Linux操作系统机制,分析了部分Linux内核代码,并列出了操作系统针对性的实验;从Linux操作系统环境、系统调用、定时器、内核模块、进程调度、虚拟存储、文件系统,循序渐进到Linux内核的改动。Linux操作系统环境使用放在本书的附录中,对于没有学习过Linux操作系统命令的读者来说,需要掌握这方面的知识。另一方面,作者本身也是程序员,对程序设计过程中的“创造性”有一定的体会。建议读者在使用本书时,大可不必循规蹈矩,读者可以用自己的思路学习Linux内核,这样既学到Linux源程序本身,更学到程序的“灵魂”。

㈩ 操作系统课程设计(linux)

我也遇到过这个问题,安装的时候你没有装图形用户终端(似乎是叫Xwindow)。之前有叫你打勾安装的。所以最后就只有命令行界面了(其实这个界面也可以解,但我不大会)。重回到开头找到打勾选项去勾选相应图形界面安装!

未经允许不得转载:山九号 » 操作系统文件课程设计|操作系统课程设计——为LINUX 设计一个简单的二级文件系统

赞 (0)