操作系统(第二个实验)

合集下载

操作系统实验二:银行家算法

操作系统实验二:银行家算法

操作系统实验⼆:银⾏家算法实验⼆银⾏家算法⼀、实验⽬的1、了解什么是操作系统安全状态和不安全状态;2、了解如何避免系统死锁;3、理解银⾏家算法是⼀种最有代表性的避免死锁的算法,掌握其实现原理及实现过程。

⼆、实验内容根据银⾏家算法的基本思想,编写和调试⼀个实现动态资源分配的模拟程序,并能够有效避免死锁的发⽣。

三、实验原理进程申请资源时,系统通过⼀定的算法判断本次申请是否不可能产⽣死锁(处于安全状态)。

若可能产⽣死锁(处于不安全状态),则暂不进⾏本次资源分配,以避免死锁。

算法有著名的银⾏家算法。

1、什么是系统的安全状态和不安全状态?所谓安全状态,是指如果系统中存在某种进程序列<P1,P2,…,Pn>,系统按该序列为每个进程分配其所需要的资源,直⾄最⼤需求,则最终能使每个进程都可顺利完成,称该进程序列<P1,P2,…,Pn,>为安全序列。

如果不存在这样的安全序列,则称系统处于不安全状态。

2、银⾏家算法把操作系统看作是银⾏家,操作系统管理的资源相当于银⾏家管理的资⾦,进程向操作系统请求分配资源相当于⽤户向银⾏家贷款。

为保证资⾦的安全,银⾏家规定:(1) 当⼀个顾客对资⾦的最⼤需求量不超过银⾏家现有的资⾦时就可接纳该顾客;(2) 顾客可以分期贷款,但贷款的总数不能超过最⼤需求量;(3) 当银⾏家现有的资⾦不能满⾜顾客尚需的贷款数额时,对顾客的贷款可推迟⽀付,但总能使顾客在有限的时间⾥得到贷款;(4) 当顾客得到所需的全部资⾦后,⼀定能在有限的时间⾥归还所有的资⾦。

操作系统按照银⾏家制定的规则设计的银⾏家算法为:(1)进程⾸次申请资源的分配:如果系统现存资源可以满⾜该进程的最⼤需求量,则按当前的申请量分配资源,否则推迟分配。

(2)进程在执⾏中继续申请资源的分配:若该进程已占⽤的资源与本次申请的资源之和不超过对资源的最⼤需求量,且现存资源能满⾜该进程尚需的最⼤资源量,则按当前申请量分配资源,否则推迟分配。

(3)⾄少⼀个进程能完成:在任何时刻保证⾄少有⼀个进程能得到所需的全部资源⽽执⾏到结束。

北理工操作系统实验二读者写者问题

北理工操作系统实验二读者写者问题

本科实验报告实验名称:操作系统原理实验(读者写者问题)课程名称:操作系统原理实验时间:2015.10.30 任课教师:王耀威实验地点:10#102实验教师:苏京霞实验类型: 原理验证□综合设计□自主创新学生姓名:孙嘉明学号/班级:1120121474/05611202 组号:学院:信息与电子学院同组搭档:专业:信息对抗技术成绩:实验二:读者写者问题一、实验目的1.通过编写和调试程序以加深对进程、线程管理方案的理解;2.熟悉Windows多线程程序设计方法;二、实验要求在Windows环境下,创建一个控制台进程,此进程包含n个线程。

用这n个线程来表示n个读者或写者。

每个线程按相应测试数据文件(后面介绍)的要求进行读写操作。

用信号量机制分别实现读者优先和写者优先问题。

读者-写者问题的读写操作限制(包括读者优先和写者优先)1)写-写互斥:不能有两个写者同时进行写操作2)读-写互斥:不能同时有一个线程在读,而另一个线程在写。

3)读-读允许:可以有一个或多个读者在读。

读者优先的附加限制:如果读者申请进行读操作时已有另一个读者正在进行读操作,则该读者可直接开始读操作。

运行结果显示要求:要求在每个线程创建、发出读写申请、开始读写操作和结束读写操作时分别显示一行提示信息,以确定所有处理都遵守相应的读写操作限制。

测试数据文件包括 n行测试数据,分别描述创建的n个线程是读者还是写者,以及读写操作的开始时间和持续时间。

每行测试数据包括四个字段,每个字段间用空格分隔。

第1个字段为正整数,表示线程的序号。

第2个字段表示线程的角色,R表示读者,W表示写者。

第3个字段为一个正数,表示读写开始时间:线程创建后,延迟相应时间(单位为秒)后发出对共享资源的读写申请。

第4个字段为一个正数,表示读写操作的延迟时间。

当线程读写申请成功后,开始对共享资源进行读写操作,该操作持续相应时间后结束,释放该资源。

下面是一个测试数据文件的例子(在记事本手工录入数据):1 R 3 52 W 4 53 R 5 24 R 6 55 W 5.1 3三、实验环境硬件设备:个人计算机。

操作系统实验二报告-时间片轮转进程调度算法1

操作系统实验二报告-时间片轮转进程调度算法1

操作系统实验报告实验二时间片轮转进程调度算法学号:班级:姓名:【实验题目】: 时间片轮转进程调度算法【实验目的】通过这次实验, 加深对进程概念的理解, 进一步掌握进程状态的转变、进程调度的策略与对系统性能的评价方法。

【实验内容】问题描述:设计程序模拟进程的时间片轮转RR 调度过程。

假设有n 个进程分别在T1, … ,Tn 时刻到达系统, 它们需要的服务时间分别为S1, … ,Sn 。

分别利用不同的时间片大小q, 采用时间片轮转RR 进程调度算法进行调度, 计算每个进程的完成时间, 周转时间和带权周转时间, 并且统计n 个进程的平均周转时间和平均带权周转时间。

程序要求如下:1)进程个数n ;每个进程的到达时间T 1, … ,T n 和服务时间S 1, … ,S n ;输入时间片大小q 。

2)要求时间片轮转法RR 调度进程运行, 计算每个进程的周转时间, 带权周转时间, 并且计算所有进程的平均周转时间, 带权平均周转时间;3)输出: 要求模拟整个调度过程, 输出每个时刻的进程运行状态, 如“时刻3: 进程B开始运行”等等;4)输出:要求输出计算出来的每个进程的周转时间, 带权周转时间, 所有进程的平均周转时间, 带权平均周转时间。

实现提示:用C++语言实现提示:1)程序中进程调度时间变量描述如下:int ArrivalTime[100];int ServiceTime[100];int PServiceTime[100];int FinishTime[100];int WholeTime[100];double WeightWholeTime[100];double AverageWT,AverageWWT;bool Finished[100];➢2)进程调度的实现过程如下:➢变量初始化;➢接收用户输入n, T1, … ,Tn, S1, … ,Sn;时间片大小q;➢按照时间片轮转RR算法进行进程调度, 计算进程的完成时间、周转时间和带权周转时间;➢计算所有进程的平均周转时间和平均带权周转时间;➢按格式输出调度结果。

操作系统实验报告实验二银行家算法

操作系统实验报告实验二银行家算法

江南大学理学院实验报告课程名称:计算机操作系统实验名称:银行家算法实验日期:2013.11.29 班级:信计1103 姓名:陈鹭学号:1301110301实验报告要求:1.实验目的 2.实验内容与要求 3.流程图与模块调用 4.实验分析5.运行情况6.实验体会1.实验目的死锁会引起计算机工作僵死,因此操作系统中必须防止。

本实验的目的在于让学生独立的使用高级语言编写和调试一个系统动态分配资源的简单模拟程序,了解死锁产生的条件和原因,并采用银行家算法有效地防止死锁的发生,以加深对课堂上所讲授的知识的理解。

2.实验内容与要求内容:银行家算法流程安全算法流程要求:设计有n个进程共享m个系统资源的系统,进程可动态的申请和释放资源,系统按各进程的申请动态的分配资源。

系统能显示各个进程申请和释放资源,以及系统动态分配资源的过程,便于用户观察和分析;3.流程图与模块调用数据结构1.可利用资源向量Available ,它是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源的数目,其初始值是系统中所配置的该类全部可用资源数目。

其数值随该类资源的分配和回收而动态地改变。

如果Available(j)=k,标是系统中现有Rj类资源k个。

2.最大需求矩阵Max,这是一个n×m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。

如果Max(i,j)=k,表示进程i需要Rj类资源的最大数目为k。

3.分配矩阵Allocation,这是一个n×m的矩阵,它定义了系统中的每类资源当前一分配到每一个进程的资源数。

如果Allocation(i,j)=k,表示进程i当前已经分到Rj类资源的数目为k。

Allocation 表示进程i的分配向量,有矩阵Allocation的第i行构成。

i4.需求矩阵Need,这是一个n×m的矩阵,用以表示每个进程还需要的各类资源的数目。

如果Need (i,j)=k,表示进程i还需要Rj类资源k个,才能完成其任务。

实验2 Windows操作系统基础

实验2 Windows操作系统基础

2.查看硬盘,在图2-2-1中记录D盘的相关信息。
3.在C盘根目录下创建如图2-2-2所示的 三级文件夹,并完成如下操作:
(1)在桌面上,用“记事本”程序创建 文本文件t1ห้องสมุดไป่ตู้txt;然后在桌面的快捷菜单 中选择“新建”→“文本文档”命令,创 建文本文件t2.txt、t3.txt、t4.txt。四 个文件的内容任意输入。 (2)将桌面上的t1.txt复制到C: \JSJ11\Sub1\mmm中。 (3)将桌面上的t2.txt复制到C: \JSJ11\Sub2\nnn中。
(3)分别按“名称”、“类型”、“大小”、 “递增”和“递减”对Windows主目录进行排序, 观察5种排序方式的区别。 (4)选择“设置”或“取消”下列文件和文件 夹的“查看”选项,并观察两者之间的区别。 ①鼠标指向文件夹和桌面项时显示提示信息。 ②隐藏受保护的操作系统文件。 ③显示隐藏的文件、文件夹和驱动器。 ④先隐藏后显示已知文件类型的扩展名。
2.掌握磁盘管理的基本方法。
3..掌握Windows7中库的操作。
【实验内容】
1.“Windows 资源管理器”的查看与使用
(1)在桌面双击“计算机”,打开“计算 机”窗口,请仔细观察窗口。 (2)分别选择“超大图标”、“大图标”、 “中图标”、“小图标”、“列表”、“详 细信息”、“平铺”和“内容”等8种方式浏 览Windows主目录,观察各种显示方式之间的 区别。
8.启动“磁盘碎片整理程序”,分析C盘,
查看报告。
(1)碎片:( )%。
(2)如果时间允许,对 C盘进行碎片整理。
9.库的设置 10.库的创建
实验2 Windows7操作系统基础
实验2.1 Windows7的基本操作

操作系统实验二进程调度

操作系统实验二进程调度

实验二:进程调度一、目的要求:用C或C++语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解.二、进程调度算法:采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法。

每个进程有一个进程控制块( PCB)表示。

进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。

进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。

进程的到达时间为进程输入的时间。

进程的运行时间以时间片为单位进行计算。

每个进程的状态可以是就绪 W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。

就绪进程获得 CPU后都只能运行一个时间片。

用已占用CPU时间加1来表示。

如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。

每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的 PCB,以便进行检查。

重复以上过程,直到所要进程都完成为止。

三调度算法的流程图如下 :四、程序代码:#include<iostream>using namespace std;#define MAX 10struct task_struct{char name[10]; /*进程名称*/ int number; /*进程编号*/ float come_time; /*到达时间*/float run_begin_time; /*开始运行时间*/ float run_time; /*运行时间*/float run_end_time; /*运行结束时间*/ int priority; /*优先级*/int order; /*运行次序*/int run_flag; /*调度标志*/}tasks[MAX];int counter; /*实际进程个数*/int fcfs(); /*先来先服务*/int ps(); /*优先级调度*/int sjf(); /*短作业优先*/int hrrn(); /*响应比高优先*/int pinput(); /*进程参数输入*/int poutput(); /*调度结果输出*/void main(){int option;pinput();printf("请选择调度算法(0~4):\n");printf("1.先来先服务\n");printf("2.优先级调度\n");printf(" 3.短作业优先\n");printf(" 4.响应比高优先\n");printf(" 0.退出\n");scanf("%d",&option);switch (option){ case 0:printf("运行结束。

操作系统实验答案-实验2Linux的基本操作及vi的使用(答案)

操作系统实验答案-实验2Linux的基本操作及vi的使用(答案)

实验二Linux的基本命令操作及vi的使用实验目的:1、熟悉Linux操作系统环境2、熟悉Linux操作系统的文件结构3、熟悉Linux操作系统的基本命令4、熟悉Linux操作系统的文件组织方式5、学习使用vi编辑器建立、编辑、显示以及加工处理文本文件。

实验内容及要求:1、登陆实验室的Linux服务器。

启动电脑,进入Windows操作系统,在“开始”-〉“运行"中输入“Telnet 10。

200.41。

178”,即可登陆实验室的Linux服务器.在“Login:”提示后输入“stu”+学号(如02号同学输入stu02),按下回车键。

在“Password:”提示后输入“123”(注意输入密码时屏幕上不会有“*”等符号出现,这和Windows 不同),按下回车键,若出现“[os@ root os]$”或“—bash—2.05b$”,表示已成功登陆系统,可以开始输入指令操作。

思考:(用pwd指令)查看自己登陆后位于Linux的哪个目录,写出该目录的路径,与自己周围的同学比较,看是否相同.(可查阅Linux资料了解“/home”目录的功能介绍)2、在Linux中进行以下基本操作:1)在当前目录下新建一个名为(自己姓名首字母缩写+学号后3位数)的子目录.写出你所用的指令.(例如:mkdir zq000 )2)进入刚创建的子目录环境下。

(提示:指令cd)3)在刚创建的子目录下新建一个名为abc.txt的文件。

写出你所用的指令。

(提示:新建文件的指令是touch)4)将/目录下(即根目录下)的welcome.txt文件复制到自己的子目录下,写出你所用的指令。

cp –i /root/stu62/abc.txt /home/welcome。

txt5)写出welcome.txt文件的内容。

(提示:用cat指令查看)Hello, Boys and girls , welcome to the wonderful Linux world!3、在Linux中进行以下基本操作:1)进入自己的主目录。

操作系统实验2-计算机操作系统(第3版)-郁红英-清华大学出版社

操作系统实验2-计算机操作系统(第3版)-郁红英-清华大学出版社

操作系统实验
(课程设计)实验报告
学院
专业
班级/学号
学生姓名
成绩
实验地点_
实验日期___ __
指导教师_____ ___ _____
(课程上机)实验报告
1.实验名称、实验目的、实验内容、实验要求由教师确定,实验前由教师事先填好,然后作为实验报告模版供学生使用;
2.实验准备由学生在实验或上机之前填写,教师应该在实验前检查;
3.实验过程由学生记录实验的过程,包括操作过程、遇到哪些问题以及如何解决等;
4.实验总结由学生在实验后填写,总结本次实验的收获、未解决的问题以及体会和建议等;
5.源程序、代码、具体语句等,若表格空间不足时可作为附录另外附页。

操作系统第二次实验报告——Linux创建进程及可执行文件结构分析

操作系统第二次实验报告——Linux创建进程及可执行文件结构分析

操作系统第⼆次实验报告——Linux创建进程及可执⾏⽂件结构分析0 个⼈信息张樱姿201821121038计算18121 实验⽬的熟练Linux创建进程fork操作。

2 实验内容在服务器上⽤VIM编写⼀个程序:⼀个进程创建两个⼦进程。

查看进程树查看进程相关信息3 实验报告 3.1编写程序创建两个⼦进程1 #include<sys/types.h>2 #include<stdio.h>3 #include<unistd.h>45int main(){6 pid_t cpid1 = fork(); //创建⼦进程178if(cpid1<0){9 printf("fork cd1 failed\n");10 }11else if(cpid1==0){12 printf("Child1:pid: %d, ppid: %d\n",getpid(),getppid());13 }14else{15 pid_t cpid2 = fork(); //创建⼦进程216if(cpid2<0){17 printf("fork cd2 failed\n");18 }19else if(cpid2==0){20 printf("Child2:pid: %d, ppid: %d\n",getpid(),getppid());21 }22else{23 printf("Parent: pid :%d\n",getpid());24 }25 }26 }编译运⾏后的结果:3.2打印进程树 添加sleep函数以挂起进程,⽅便打印进程树:1 #include<sys/types.h>2 #include<stdio.h>3 #include<unistd.h>45int main(){6 pid_t cpid1 = fork();78if(cpid1<0){9 printf("fork cd1 failed\n");10 }11else if(cpid1==0){12 printf("Child1:pid: %d, ppid: %d\n",getpid(),getppid());13 sleep(30); //挂起30秒14 }15else{16 pid_t cpid2 = fork();17if(cpid2<0){18 printf("fork cd2 failed\n");19 }20else if(cpid2==0){21 printf("Child2:pid: %d, ppid: %d\n",getpid(),getppid());22 sleep(30); //挂起30秒23 }24else{25 printf("Parent: pid :%d\n",getpid());26 sleep(60); //挂起60秒27 }28 }29 }pstree -p pid #打印进程树 3.3 解读进程相关信息 3.3.1 解释执⾏ps -ef后返回结果中每个字段的含义 ps -ef输出格式 :UID PID PPID C STIME TTY TIME CMDUID: User ID,⽤户ID。

操作系统实验报告(2)

操作系统实验报告(2)

计算机实验报告(2)操作系统部分一、基本要求和内容1.了解操作系统的基本功能.2.认识WINDOWS桌面的各部分组成,掌握基本的桌面操作.3.掌握各种基本操作对象的操作方法.4.学会使用WINDOWS帮助.5.了解基本的DOS命令和基本的命令行操作方法.6.熟练掌握文件操作方法.7.掌握对图标的操作方法(移动/拖曳/单击/双击/右击等等).8.熟悉资源管理器窗口和”我的电脑”(“计算机”)窗口.9.掌握启动控制面板的方法,了解控制面板的主要功能,掌握使用控制面板对软硬件进行设置的方法。

10.掌握“运行”对话框的使用方法。

11.了解“任务管理器”的简单使用方法。

12.熟悉“画图”“记事本”“计算器”“写字板”等常用应用程序。

13.开始POWERPOINT的基本使用.二、通过上机实验解决下列问题1. CTRL+ALT+DEL 组合键的功能是:打开【任务管理器】窗口2.全角和半角的区别是:半角是一个字符,全角是两个字符3. CTRL+A组合键的功能是:全部选中CTRL+C组合键的功能是:复制CTRL+V组合键的功能是:粘贴CTRL+X组合键的功能是:剪切CTRL+Z组合键的功能是: 撤销ALT+PRINTSCREEN组合键的功能是:复制当前窗口、对话框或其他对象到剪贴板中任务栏隐藏时通过什么组合键可以看到任务栏:Ctrl+Alt+Del进行窗口切换的组合键是:ALT+Tab4.“画图”应用程序默认保存文件类型是:*.png“记事本”应用程序默认保存文件类型是: *.txt.DOC是什么文件类型Word文档.EXE是什么文件类型可执行文件(程序文件)5.鼠标的基本操作方法包括:指向、单击、双击和拖动鼠标指针附近有漏沙钟表示当前的状态是: 沙漏是等待,因为程序先是从硬盘上读取,然后再到内存,芯片在其期间进行运算,再没真正的打开程序时,系统认为它没正真的启动6.资源管理器左下角窗格(即”文件夹”窗口)显示的是:系统中的所有资源以分层树型的结构显示出来7.一般情况下,对文件进行重命名时,不应该修改文件的扩展名,因为: 如果修改了后缀名则会导致文件属性更改,文件无法打开8.文件的属性主要包括哪些:“只读”、“存档”、“隐藏”9.选择多个连续的文件可以采用哪些方法:使用鼠标先选定第一个文件或文件夹,然后按住Shift键,用鼠标单击最后一个文件或文件夹,这样在第一个对象和最后一个对象之间的所有文件或文件夹将全部被选中,包括第一个和最后一个文件或文件夹。

《操作系统》实验二

《操作系统》实验二

《操作系统》实验二一、实验目的本实验旨在加深对操作系统基本概念和原理的理解,通过实际操作,提高对操作系统设计和实现的认知。

通过实验二,我们将重点掌握进程管理、线程调度、内存管理和文件系统的基本原理和实现方法。

二、实验内容1、进程管理a.实现进程创建、撤销、阻塞、唤醒等基本操作。

b.设计一个简单的进程调度算法,如轮转法或优先级调度法。

c.实现进程间的通信机制,如共享内存或消息队列。

2、线程调度a.实现线程的创建、撤销和调度。

b.实现一个简单的线程调度算法,如协同多任务(cooperative multitasking)。

3、内存管理a.设计一个简单的分页内存管理系统。

b.实现内存的分配和回收。

c.实现一个简单的内存保护机制。

4、文件系统a.设计一个简单的文件系统,包括文件的创建、读取、写入和删除。

b.实现文件的存储和检索。

c.实现文件的备份和恢复。

三、实验步骤1、进程管理a.首先,设计一个进程类,包含进程的基本属性(如进程ID、状态、优先级等)和操作方法(如创建、撤销、阻塞、唤醒等)。

b.然后,实现一个进程调度器,根据不同的调度算法对进程进行调度。

可以使用模拟的方法,不需要真实的硬件环境。

c.最后,实现进程间的通信机制,可以通过模拟共享内存或消息队列来实现。

2、线程调度a.首先,设计一个线程类,包含线程的基本属性(如线程ID、状态等)和操作方法(如创建、撤销等)。

b.然后,实现一个线程调度器,根据不同的调度算法对线程进行调度。

同样可以使用模拟的方法。

3、内存管理a.首先,设计一个内存页框类,包含页框的基本属性(如页框号、状态等)和操作方法(如分配、回收等)。

b.然后,实现一个内存管理器,根据不同的内存保护机制对内存进行保护。

可以使用模拟的方法。

4、文件系统a.首先,设计一个文件类,包含文件的基本属性(如文件名、大小等)和操作方法(如创建、读取、写入、删除等)。

b.然后,实现一个文件系统管理器,包括文件的存储和检索功能。

河北工业大学操作系统实验报告 (2)

河北工业大学操作系统实验报告 (2)

操作系统实验指导书实验一进程控制与描述一、实验目的通过对Windows XP编程,进一步熟悉操作系统的基本概念,较好地理解Windows XP的结构。

通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解Windows XP进程的“一生”。

二、实验环境硬件环境:计算机一台,局域网环境;软件环境:Windows XP,Visual C++ 6.0专业版或企业版。

三、实验内容和步骤第一部分Windows 编程Windows XP可以识别的程序包括控制台应用程序、GUI应用程序和服务应用程序。

本实验中主要用到的是控制台应用程序和GUI应用程序。

1、简单的控制台应用程序创建一个名为“Hello”的应用程序, 在“开始”菜单中单击“程序”-“附件”-“记事本”命令,将程序键入记事本中,并把代码保存为1-1.cpp。

程序1-1 Windows XP的GUI应用程序#include <iostream>void main(){Std::cout<<”Hello, Windows XP”<<std::endl;}在“命令提示符”窗口运行CL.EXE,产生1-1.EXE文件:C:\> CL 1-1.cpp运行1-1.EXE程序,运行结果是:(如果运行不成功,则可能的原因是什么?)_2、GUI应用程序Windows XP Professional下的GUI应用程序,使用Visual C++编译器创建一个GUI应用程序,代码中包括了WinMain()方法,该方法GUI类型的应用程序的标准入口点。

在“开始”菜单中单击“程序”-“附件”-“记事本”命令,将程序键入记事本中,并把代码保存为1-2.cpp。

程序1-2 Windows XP的GUI应用程序// msgbox项目# include <windows.h> // 标准的include// 告诉连接器与包括MessageBox API函数的user32库进行连接# pragma comment(lib, “user32.lib” )// 这是一个可以弹出信息框然后退出的筒单的应用程序int APIENTRY WinMain(HINSTANCE /* hInstance */ ,HINSTANCE /* hPrevInstance */ ,LPSTR /* lpCmdLine */ ,int /* nCmdShow */ ){:: MessageBox(NULL, // 没有父窗口“Hello, Windows 2000” , // 消息框中的文本“Greetings”, // 消息框标题MB_OK) ; // 其中只有一个OK按钮// 返回0以便通知系统不进入消息循环return(0) ;}也可以利用任何其他文本编辑器键入程序代码,如果这样,例如使用WORD来键入和编辑程序,则应该注意什么问题?保存时将文件保存为“.cpp”的c++文件在“命令提示符”窗口运行CL.EXE,产生1-2.EXE文件:C:\> CL 1-2.cpp在程序1-2的GUI应用程序中,首先需要Windows.h头文件,以便获得传送给WinMain() 和MessageBox() API函数的数据类型定义。

操作系统实验二Linux的常用命令

操作系统实验二Linux的常用命令

实验2一解释下列Linux的常用命令1.ls名称: ls使用权限: 所有使用者使用方式: ls [-alrtAFR] [name...]说明: 显示指定工作目录下之内容(列出目前工作目录所含之档案及子目录)。

参数:-a 显示所有档案及目录(ls内定将档案名或目录名称开头为"."的视为隐藏档,不会列出) -l 除档案名称外,亦将档案型态、权限、拥有者、档案大小等资讯详细列出-r 将档案以相反次序显示(原定依英文字母次序)-t 将档案依建立时间之先后次序列出-A 同-a ,但不列出"." (目前目录) 及".." (父目录)-F 在列出的档案名称后加一符号;例如可执行档则加"*", 目录则加"/"-R 若目录下有档案,则以下之档案亦皆依序列出范例:列出目前工作目录下所有名称是s 开头的档案,愈新的排愈后面:ls -ltr s*将/bin 目录以下所有目录及档案详细资料列出:ls -lR /bin列出目前工作目录下所有档案及目录;目录于名称后加"/", 可执行档于名称后加"*" : ls –AF2.chmod指令名称: chmod使用权限: 所有使用者使用方式: chmod [-cfvR] [--help] [--version] mode file...说明: Linux/Unix 的档案调用权限分为三级: 档案拥有者、群组、其他。

利用chmod 可以藉以控制档案如何被他人所调用。

参数:mode : 权限设定字串,格式如下: [ugoa...][[+-=][rwxX]...][,...],其中u 表示该档案的拥有者,g 表示与该档案的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。

+ 表示增加权限、- 表示取消权限、= 表示唯一设定权限。

实验2:Linux操作系统基本操作

实验2:Linux操作系统基本操作

实验报告2课程名称:Linux程序设计实验名称:Linux操作系统基本操作学生姓名:班级:学号:指导老师:钱振江成绩:一、实验目的1.通过对emacs、vi、vim、gedit文本编辑器的使用,掌握在Linux环境下文本文件的编辑方法;2.通过对常用命令mkdir、cp、cd、ls、mv、chmod、rm等文件命令的操作,掌握Linux操作系统中文件命令的用法。

二、实验任务与要求1.emacs的使用,要求能新建、编辑、保存一个文本文件2.vi或vim的使用,要求能新建、编辑、保存一个文本文件3.gedit的使用,要求能新建、编辑、保存一个文本文件4.掌握mkdir、cd命令的操作,要求能建立目录、进入与退出目录5.掌握cp、ls、mv、chmod、rm等命令的操作,要求能拷贝文件、新建文件、查看文件、文件重命名、删除文件等操作。

三、实验工具与准备计算机PC机,Linux Ubuntu操作系统预备知识文本编辑器emacs、gedit是一款图形化的编辑器,具体的使用方法按照菜单操作。

文本编辑器vi有三种状态:命令状态、最后行状态、编辑状态。

mv:用来为文件或目录改名,或者将文件由一个目录移入另一个目录中,它的使用权限是所有用户。

rm:删除文件或目录,参数-r指示rm将参数中列出的全部目录和子目录均递归删除,在使用rm命令要小心,因为一旦被删除,它是不能恢复的。

cp:将一个文件拷贝至另一文件,或将数个文件拷贝至另一目录。

chmod:用于改变文件或目录的访问权限,它的使用格式为:chmod [who] [+|-|=] [mode] 文件名who可取u、g、o、a,或它们的组合mode可取r、w、x等参数。

ls:用于显示目录内容,它的使用权限是所有用户。

mkdir:建立子目录,它的使用权限是所有用户。

四、实验步骤与操作指导1.学习vi或者vim的使用,要求能新建、编辑、保存一个文本文件。

(1)点击”应用程序”→ “附件”→“终端”,打开终端,在终端输入命令:[root@localhost root]#vi kk.c按i键,进入插入状态。

操作系统实验2进程管理报告

操作系统实验2进程管理报告

实验一进程管理一、实验目的:1.加深对进程概念的理解,明确进程和程序的区别;2.进一步认识并发执行的实质;3.分析进程争用资源的现象,学习解决进程互斥的方法;4.了解Linux系统中进程通信的基本原理;二、实验预备内容:1.阅读Linux的sched.h源码文件,加深对进程管理概念的理解;2.阅读Linux的fork()源码文件,分析进程的创建过程;三、实验环境说明:1.此实验采用的是Win7(32bit)下虚拟机VMware-workstation-10.0.4 build-2249910;2.ubuntu 版本3.19.0;3.直接编写c文件在终端用命令行执行;4.虚拟机分配8G内存中的1024M;5.虚拟机名称knLinux;6.ubuntu用户名kn;四、实验内容:1.进程的创建:a)题目要求:编写一段程序,使用系统调用fork() 创建两个子进程。

当此程序运行时,在系统中有一个父进程和两个子进程活动。

让每一个进程在屏幕上显示一个字符:父进程显示字符“a”,子进程分别显示字符“b”和“c”。

试观察记录屏幕上的显示结果,并分析原因。

b)程序设计说明:一个父进程,两个子进程,分别输出显示a,b,c。

c)源代码:d)运行结果:e)分析:由输出结果可知,运行结果不唯一,可以是abc,acb,bca等多种情况。

因为在程序中,并没有三个进程之间的同步措施,所以父进程和子进程的输出顺序是随机的。

在试验次数足够大的情况下,6中顺序都有可能出现:abc, acb, bac, bca, cab, cba。

2.进程的控制:a)修改已经编写的程序,将每个进程输出一个字符改为每个进程输出一句话,再观察程序执行时屏幕上出现的现象,并分析原因。

i.程序设计说明:将第一个程序中输出字符的语句改为输出parent process和childprocess1&2的语句。

ii.源代码:iii.运行结果:iv.分析:发现在结果中,运行结果同第一个程序,但是在一个进程输出语句的中途不会被打断,语句都是完整的。

《操作系统》实验报告(2)

《操作系统》实验报告(2)
b.将f02.txt的读权限去掉(修改权限的命令是chmod),___chmod -r f02.txt____;看看还能否用cat打开该文件;不能查看,权限不够
c.将subdir目录的读权限去掉,看看是否能用ls命令看到其中内容?
权限不够
(三)Shell程序设计
1.上机编辑、执行实验内容中的例1~例6过程,写出每个脚本(例1~例5)的功能和执行结果;
然后把t01.txt复制一个新文件t03.txt,catt01.txt>t02.txt;
用cat命令将f01.txt的内容追加到t01.txt的末尾,catf01.txt>> t01.txt;
再用diff命令比较t01.txt,t02.txt和t03.txt,比较t01.txt,t02.txt:diff t01.txt t02.txt,结果是否相同:__相同___;比较t01.txt,t03.txt:diff t01.txt t03.txt,结果是否相同:不相同;比较t02.txt,t03.txt:diff t02.txt t03.txt,结果是否相同:不相同。出现上述结果的原因是:______________________________________________________________________________。
2.修改例5,使脚本中不出现break循环控制语句;
3.编写一个Shell过程完成如下功能:
a.合并两个$1、$2文件为$3,并显示内容。
b.如果缺少$3,那么先报告缺少$3,将合并后的内容输出到totaltext.txt,并显示内容。
c.如果缺少$2、$3那么先报告缺少$2、$3,只显示$1的内容。
b.用ln命令给t03.txt建立一个符号链接t04.txt,ln–st03.txt t04.txt;用cat命令看看t04.txt,___cat t04.txt_____;然后删去t03.txt,___rm t03.txt____;再用cat命令看看t04.txt,___cat t04.txt___;结果是:___t04.txt为空____

操作系统 实验2进程控制管理 实验报告

操作系统 实验2进程控制管理 实验报告
else
{
while((p2=fork( ))= = -1); /*创建子进程p2*/
if(p2= =0)
for(i=0;i<10;i++)
printf("son %d\n",i);
else
for(i=0;i<10;i++)
printf("parent %d\n",i);
}
}
5.退出后,用同样方法查看此文件的代码内容。
2)修改上述程序,每一个进程循环显示一句话。子进程显示'daughter…'及'son……',父进程显示'parent……',观察结果,分析原因。
实验用到的软件(:)
虚拟机VMWare/Virtual Box
fedora15
实验内容及关键步骤(代码)Q3(15分)
1.按照上一次实验的步骤,进入后需要切换到管理员,输入“su root”,输入密码之后,可以输入“ls”查看目录下的文件。附加:为了熟悉上一节实验课内容,我先创建了一个myleb2的文件夹,然后再在这个文件夹里创建一个子文件夹love,再在里面编译。
6.查看无问题后,输入“gcc –o test2 test2.c”,修改运行文件名,然后查看该文件夹下的所有文件,能看到“test2”运行文件。
7.运行“test2”文件,输入“./test2”,可查看运行结果为“daughter 0,daughter 1,daughter 2,daughter 3….. daughter 9”。
3.首先是读入文件内容,再次是看文件有没有指定程序运行,如果有则运行,如果没有则输出出错的信息。
实验中的问题及解决办法:

重庆大学操作系统实验二

重庆大学操作系统实验二

重庆大学学生实验报告实验课程名称操作系统原理开课实验室重庆大学DS1501学院软件工程年级2013 专业班学生姓名学号开课时间2015 至2016 学年第一学期重庆大学软件学院制操作系统原理》实验报告实验目的(软件需求文档)掌握线程的创建掌握线程的调度静态优先级调度动态优先级调度二、实验原理(软件设计文档)系统调用接口,线程相关函数:Step1:定义线程函数voidtsk_foo(void *pv) {n“ , task_getid());task_exit(0);}Step2:申请用户栈unsigned char *stack_foo;stack_foo = (unsigned char *)malloc(1024*1024);free 释放掉!线程退出后,才能把用户栈用Step3:创建线程int tid_foo;tid_foo = task_create(stack_foo+1024*1024, tsk_foo, (void *)0);三、使用仪器、材料(软硬件开发环境) Notepad++ expenv四、实验步骤(实现的过程)随机生成3 组非负整数列表,创建3 个线程,分别用3 种不同的排序算法(插入,冒泡,选择) 对列表进行排序三线程:void tsk_foo_line1(void * pv){int m;int i;int arry[50]; srand(time(NULL));for (i =0; i<50; i++){ m= random() % 200; if (m<0) { m=0- m;} draw(i * 10, 0, 0 + m); arry[i] = m;}sort_m(arry, 50, 0); task_exit(0);}void tsk_foo_line2(void * pv){int m;int i;int arry[50];srand(time(NULL));for (i =0; i<50; i++){m= random() % 200;if (m<0) { m=0- m;} draw(i * 10, 345, 345 +m); arry[i] = m;}sort_x(arry, 50, 345); task_exit(0);}void tsk_foo_line3(void * pv){int m;int i;int arry[50];srand(time(NULL));for (i =0; i<50; i++){ m= random() % 200; if (m<0) { m=0- m;} draw(i * 10, 690, 690 +m); arry[i] = m;}sort_c(arry , 50, 690);task exit(0);}void draw(int x, int y1, int y2){int i;for (i =y1; i<y2; i++)setPixel(i , x, RGB(255, 255, 255)); }void resetBK(int x, int y1, int y2){ int i;for (i =y1; i<y2; i++) setPixel(i , x, RGB(0, 0, 0));} 三排序:冒泡void sort_m(int * arry, int n,int l){int i, j, tem ; int t = 500 / n;for (i =0; i<n; i++)for (j=0;j<n-i- 1; j++){if (*( arry + j)>*(arry +j +1)){ resetBK(j* t, l, l + *(arry +j)); resetBK(j* t +t, l, l +*( arry + j + 1)); tem = *( arry + j);*( arry + j) = *(arry +j+1); *( arry + j + 1) = tem ; draw (j * t , l, l + *( arry +j)); draw(j*t +t,l,l + *( arry + j+ 1));}}void sort_c(int * arry, int n, int l){ int i, j, key;int t =500/ n;for (j=n- 2; j >= 0; j--){ key = *( arry +j);i =j +1; resetBK(j * t , l, l+key); while (i<n&& *( arry + i )<key){ *( arry +i -1) = *( arry +i); draw(i*t -t,l,l+*(arry+i- 1)); i =i +1;}*( arry +i - 1) = key; draw(i* t -t, l, l + key);}} 选择void sort_x(int* arry, int n, int l){int i=0, j=0, lowindex = 0;int t =500/ n;for (i =0; i<n; i ++){lowindex =i;for (j =n -1; j>i; j--) if (arry[j] < arry[lowindex ])lowindex = j;if (lowindex != i){resetBK(i*t , l, l + *(arry +i)); resetBK(lowindex* t, l,l + *(arry + lowindex )); int temp = arry[ i];arry [i] = arry[ lowindex];arry [lowindex ] = temp ; draw (i * t , l, l + *( arry +i));draw(lowindex* t, l, l + *(arry + lowindex ));}}}线程控制块tcb 中增加nice 属性,在函数sys_task_create 中初始化nice=0 /*系统调用getpriority 的执行函数获取当前线程的优先级*/int sys_getpriority (int tid){if (tid ==0) return g_task_running->nice+NZERO;// 获取当前线程的nice值uint32_t flags; struct tcb *tsk;save flags cli(flags);tsk = get_task(tid ); restore_flags(flags);return tsk->nice+NZERO; // 获取线程的nice 值}/* 系统调用setpriority 的执行函数调整当前线程的优先级线程控制块tcb 中增加estcpu 属性,在函数sys_task_create 中初始化estcpu=0; 增加priority 属性,在函数sys_task_create 中初始化priority=0; 中增加全局变量g_load_avg:表示系统的平均负荷用浮点(float-point) 表示g_load_avg 和estcpu:精度高,效率低动态调度schedule:void schedule(){struct tcb * select=g_task_head;struct tcb * my_select=g_task_running ; while (select != NULL){select->priority =127- fixedpt_toint (fixedpt_div(select->estcpu, fixedpt_fromint (4))) - select->nice * 2; // 计算所有线程的priorityselect = select->next ;}// 动态优先级select = g_task_head; while(select!=NULL){if((select->tid != 0) &&(select->state ==TASK STATE READ))Y{if(my_select->priority <select->priority )my_select=select;// 选择等待队列里的线程优先级高的elseif(my select->tid==0){my_select=select;} select=select->next;}if (my select==g task running) { if(my_select->state == TASK_STATE_READ) Y return ;my_select = task0;}printk ("0x%d -> 0x%d\r\n" , (g_task_running == NULL) -1: g_task_running->tid , select->tid);g_resched = 0;switch_to (my_select);}中添加如下g_task_running->estcpu=fixedpt_add(g_task_running->estcpu,FIXEDPT_ON)E;//计算线程使用CPU时间estcpuif(g timer ticks %HZ==0){// 每隔一秒计算一次int nready=0; // 表示处于就绪状态的线程个数struct tcb *my select=g task head;int nice;//g task running->nice;//my_select=g_task_head;fixedpt ratio ;while(my select!=NULL){if (my select->state==TASK STATE REA)DnYready++ nice=my select->nice;ratio = fixedpt_mul (FIXEDPT_TWO, g_load_avg);// 每秒钟为所有线程运行、就绪和等待)更新一次ratio = fixedpt_div (ratio , fixedpt_add (ratio , FIXEDPT_ON)E);my_select->estcpu = fixedpt_add (fixedpt_mul (ratio ,my_select->estcpu),fixedpt_fromint (nice))my_select=my_select->next;fixedpt r59 60 = fixedpt div (fixedpt fromint (59), fixedpt fromint (60));// 计算系统的平均负荷g load avgfixedpt r01 60 = fixedpt div (FIXEDPT ON,Efixedpt fromint (60)) g load avg= fixedpt add (fixedpt mul (r59 60, g load avg),fixedpt_mul (r01_60, fixedpt_fromint (nready)));主函数:int mode = 0x0118;initGraphics (mode);int y =0;for (y=0;y<; y++){setPixel/ 3,y, RGB(0, 125, 125)); setPixel/ 3 * 2, y, RGB(0, 125, 125));}五、实验结果及分析(实现的效果,包括屏幕截图、系统总体运行情况和测试情况等)静态优先级:Llxh心必ew动态优先级:。

最新操作系统实验报告实验二

最新操作系统实验报告实验二

最新操作系统实验报告实验二实验目的:1. 熟悉最新操作系统的架构和特性。

2. 掌握操作系统的基本操作和配置方法。

3. 分析操作系统的性能和稳定性。

实验环境:- 硬件环境:Intel Core i7处理器,16GB RAM,256GB SSD。

- 软件环境:最新操作系统版本X.Y.Z,图形界面和命令行界面。

实验步骤:1. 安装最新操作系统X.Y.Z,记录安装过程中的关键步骤和遇到的问题。

2. 配置系统环境,包括网络设置、显示设置、用户账户管理等。

3. 测试文件系统的性能,包括文件的创建、复制、删除和搜索操作。

4. 测试多任务处理能力,通过同时运行多个应用程序来观察系统响应时间和资源分配情况。

5. 检验系统的安全性,包括用户权限管理、防火墙设置和病毒防护功能。

6. 评估系统的稳定性,进行长时间运行测试,记录是否有崩溃或异常行为发生。

7. 对系统进行基准测试,使用专业工具如SPEC CPU测试套件来评估系统性能。

实验结果:1. 安装过程中,系统顺利识别硬件并完成驱动安装,未遇到兼容性问题。

2. 系统配置简便,图形用户界面直观易用,网络配置通过向导快速完成。

3. 文件系统测试显示,读写速度达到预期标准,搜索操作响应迅速。

4. 多任务处理测试中,系统在开启多个资源密集型应用时仍保持流畅,未出现明显延迟。

5. 安全性测试表明,用户权限分级明确,防火墙和病毒防护均能有效工作。

6. 稳定性测试中,系统连续运行72小时无故障,表现出良好的稳定性。

7. 基准测试结果显示,系统性能较前一版本有显著提升,特别是在多线程处理方面。

实验结论:最新操作系统X.Y.Z在本次实验中表现出了良好的性能和稳定性。

系统的用户界面友好,配置和管理方便。

文件系统和多任务处理能力均达到预期目标,安全性和稳定性也符合最新的操作系统标准。

推荐对性能和稳定性有较高要求的用户进行升级。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

操作系统实验报告哈尔滨工程大学计算机科学与技术学院第二讲操作系统的启动一、实验概述1. 实验名称操作系统的启动2. 实验目的跟踪调试EOS在PC机上从加电复位到成功启动的全过程,了解操作系统的启动过程。

查看EOS启动后的状态和行为,理解操作系统启动后的工作方式。

3. 实验类型验证4. 实验内容准备实验调试EOS操作系统的启动过程二、实验环境EOS操作系统和OS Lab集成实验环境,主要运用了C语言。

三、实验过程1. 源程序并附上注释/*提供该示例代码是为了阐释一个概念,或者进行一个测试,并不代表着最安全的编码实践,因此不应在应用程序或网站中使用该示例代码。

对于超出本示例代码的预期用途以外的使用所造成的偶然或继发性损失,北京英真时代科技有限公司不承担任何责任。

*/#include "EOSApp.h"int main(int argc, char* argv[]){int i;for (i = 1; i <= 5; i++) {printf("Hello,world! %d\n", i);Sleep(1000);}printf("Bye-bye!\n");return 0;}2. 程序运行时的初值和运行结果2.1 准备实验1. 启动OS Lab。

2. 新建一个EOS Kernel项目。

3. 在“项目管理器”窗口中打开boot文件夹中的boot.asm和loader.asm两个汇编文件。

boot.asm是软盘引导扇区程序的源文件,loader.asm是loader程序的源文件。

4. 按F7生成项目。

5. 生成完成后,使用Windows资源管理器打开项目文件夹中的Debug文件夹。

找到由boot.asm生成的软盘引导扇区程序boot.bin文件,该文件的大小一定为512字节(与软盘引导扇区的大小一致)。

找到由loader.asm生成的loader程序loader.bin文件,记录下此文件的大小1566字节。

找到由其它源文件生成的操作系统内核kernel.dll。

2.2 调试EOS操作系统的启动过程2.2.1 使用Bochs做为远程目标机按照下面的步骤将调试时使用的远程目标机修改为Bochs:1. 在“项目管理器”窗口中,右键点击项目节点,在弹出的快捷菜单中选择“属性”。

2. 在弹出的“属性页”对话框右侧的属性列表中找到“远程目标机”属性,将此属性值修改为“Bochs Debug”(此时按F1可以获得关于此属性的帮助)。

3. 点击“确定”按钮关闭“属性页”对话框。

接下来就可以使用Bochs模拟器调试BIOS程序和软盘引导扇区程序了。

2.2.2 调试BIOS程序按F5启动调试,此时会弹出两个Bochs窗口。

标题为“Bochs for windows - Display”的窗口相当于计算机的显示器,显示操作系统的输出。

标题为“Bochs for windows - Console”的窗口是Bochs的控制台,用来输入调试命令,输出各种调试信息。

启动调试后,Bochs在CPU要执行的第一条指令(即BIOS的第一条指令)处中断。

此时,Display窗口没有显示任何内容,Console窗口显示要执行的BIOS第一条指令的相关信息,并等待用户输入调试命令。

从Console窗口显示的内容中,我们可以获得关于BIOS第一条指令的如下信息:(1)行首的[0xfffffff0]表示此条指令所在的物理地址。

(2)f000:fff0表示此条指令所在的逻辑地址(段地址:偏移地址)。

(3)jmp far f000:e05b是此条指令的反汇编代码。

(4)行尾的ea5be000f0是此条指令的十六进制字节码,可以看出此条指令有5个字节。

查看CPU在没有执行任何指令之前主要寄存器中的数据,以及内存中的数据:1. 在Console窗口中输入调试命令sreg后按回车,显示当前CPU中各个段寄存器的值,其中CS寄存器信息行中的“s=0xf000”表示CS寄存器的值为0xf000。

0x00000000:0000fff0”表示IP寄存器的值为0xfff0。

出的这1K物理内存的值都为0,说明BIOS中断向量表还没有被加载到此处。

4. 输入调试命令xp /512b 0x7c00,查看软盘引导扇区应该被加载到的内存位置。

输出的内存值都为0,说明软盘引导扇区还没有被加载到此处。

可以验证BIOS第一条指令所在逻辑地址中的段地址和CS寄存器值是一致的,偏移地址和IP 寄存器的值是一致的。

由于内存还没有被使用,所以其中的值都为0。

2.2.3 调试软盘引导扇区程序接下来从0x7c00处调试软盘引导扇区程序:1. 输入调试命令vb 0x0000:0x7c00,这样就在逻辑地址0x0000:0x7c00(相当于物理地址0x7c00)处添加了一个断点。

2. 输入调试命令c继续执行,在0x7c00处的断点中断。

中断后会在Console窗口中输出下一个要执行的指令,即软盘引导扇区程序的第一条指令。

3.在纸上分别记录下此条指令的字节码(eb6d)和此条指令要跳转执行的下一条指令的地址(括号中的0x00007c6f)。

4.输入调试命令sreg验证CS寄存器(0x0000)的值。

5.输入调试命令r验证IP寄存器(0x7c00)的值。

6.由于BIOS程序此时已经执行完毕,输入调试命令xp /1024b 0x0000验证此时BIOS中断向量表已经被载入。

7.输入调试命令xp /512b 0x7c00显示软盘引导扇区程序的所有字节码。

观察此块内存最开始的两个字节分别为0xeb和0x6d,这和引导程序第一条指令的字节码(eb6d)是相同的。

此块内存最后的两个字节分别为0x55和0xaa,表示引导扇区是激活的,可以用来引导操作系统,这两个字节是boot.asm中最后一行语句 dw 0xaa55 定义的。

8.输入调试命令xp /512b 0x0600验证图3-2中第一个用户可用区域是空白的。

9. 输入调试命令xp /512b 0x7e00验证图3-2中第二个用户可用区域是空白的。

10. 自己设计两个查看内存的调试命令,分别验证这两个用户可用区域的高地址端也是的。

11. 输入调试命令xp /512b 0xa0000验证图3-2中上位内存已经被系统占用。

12. 自己设计一个查看内存的调试命令,验证上位内存的高地址端已经被系统占用。

NASM汇编器在将boot.asm生成为boot.bin的同时,会生成一个boot.lst列表文件,帮助开发者调试boot.asm文件中的汇编代码。

按照下面的步骤查看boot.lst文件:1. 在“项目管理器”窗口中,右键点击“boot”文件夹中的boot.asm文件。

2. 在弹出的快捷菜单中选择“打开生成的列表文件”,在源代码编辑器中就会打开文件boot.lst。

3. 将boot.lst文件和boot.asm文件对比可以发现,此文件包含了boot.asm文件中所有的汇编代码,同时在代码的左侧又添加了更多的信息。

4. 在boot.lst中查找到软盘引导扇区程序第一条指令所在的行(第73行) 73 00000000 EB6D jmp short Start 此行包含的信息有:73是行号。

00000000是此条指令相对于程序开始位置的偏移(第一条指令应该为0)。

EB6D 是此条指令的字节码,和之前记录下来的指令字节码是一致的。

软盘引导扇区程序的主要任务就是将软盘中的loader.bin文件加载到物理内存0x1000处,然后跳转到loader程序的第一条指令(物理地址0x1000处的指令)继续执行loader程序。

按照下面的步骤调试此过程:1. 在boot.lst文件中查找到加载完毕loader.bin文件后要跳转到loader程序中执行的指令(第278行)根据此指令相对于程序开始(0x7C00)的偏移(0x0181)可以得到此指令的逻辑地址为0x0000:7D81。

2.输入调试命令vb 0x0000:0x7d81添加一个断点。

3.输入调试命令c继续执行,到断点处中断。

在Console窗口中显示此条指令会跳转到物理内存0x1000处(即Loader程序的第一条指令)继续执行。

4.按照打开boot.lst文件的方法打开loader.lst文件,并在此文件中查找到loader程序的第一条指令(第33行)5.输入调试命令xp /8b 0x1000查看内存0x1000处的数据,验证此块内存的前三个字节和loader.lst文件中的第一条指令的字节码是相同的。

6.根据之前记录的loader.bin文件的大小,自己设计一个查看内存的调试命令,查看内存中loader程序结束位置的字节码,并与loader.lst文件中最后指令的字节码比较,验证loader 程序被完全加载到了正确的位置。

2.2.4 调试加载程序Loader程序的主要任务是将操作系统内核(kernel.dll文件)加载到内存中,然后让CPU进入保护模式并且启用分页机制,最后进入操作系统内核开始执行(跳转到kernel.dll的入口点执行)。

按照下面的步骤调试上述过程:1.在loader.lst文件中查找到准备进入EOS操作系统内核执行的指令(第755行)2.计算此条指令的物理地址要复杂一些:偏移地址实际上是相对于节(节SECTION是NASM汇编中的概念)开始的。

由于在boot.asm程序中只有一个节,所以之前计算的结果都是正确的,但是在loader.asm程序中有两个节,并且此条指令是在第二个节中。

下面引用的代码是loader.lst中第一个节的最后一条指令(第593行)因为第一个节中最后一条指令的偏移为0x03c1,并占用了3个字节(字节码为C20600),所以可以计算出进入内核执行的指令所在的物理地址为0x1513(0x1000+0x03c1+0x3+0x14f)。

3.使用添加物理地址断点的调试命令pb 0x1513添加一个断点。

4.输入调试命令c继续执行,到断点处中断。

在Console窗口中显示要执行的下一条指令(注意,此时的逻辑地址都为虚拟地址):由于这里使用了函数指针的概念,所以,根据反汇编指令可以确定内核入口点函数的地址就保存在虚拟地址0x8000117处的四个字节中。

5.使用查看虚拟内存的调试命令x /1wx 0x80001117查看内存中保存的32位函数入口地址,在Console窗口中会输出类似下面的内容:记录下此块内存中保存的函数地址。

2.2.5 调试内核调试内核的步骤如下:1.在OS Lab的“项目管理器”窗口中打开ke文件夹中的start.c文件,此文件中只定义了一个函数,就是操作系统内核的入口点函数KiSystemStartup。

相关文档
最新文档