lxm嵌入式Linux操作系统课程设计报告so

嵌  入  式

课程设计

专业:11级计算机科学与技术

班级:1班

姓名:刘晓满

学号:100304011122

指导老师:


基于ARM9的视频监控系统

1. 课程设计目的

1)   掌握Linux开发坏境的搭建;

2)   了解Linux内核的配置和文件系统的制作;

3)   掌握bootloader、内核和文件系统的移植;

4)   巩固本学期所学的关于“嵌入式Linux操作系统”方面的知识。

2. 课程设计题目描述和要求

2.1  设计的意义:

伴随着嵌入式技术、图像处理技术和无线网络传输技术的发展,传统模拟视频监控系统和基于PC的远程视频监控系统由于自身的不足,已经无法满足现代社会应用中不断涌现出来的新需求,于是基于嵌入式技术的无线网络数字视频监控系统就应因而生了。例如远程监控、远程教学、远程医疗诊断、远程购物、远程探视、电视电话会议等应用都迫切需要高质量的网络视频传输的支持。考虑到了所用的硬件设备大部分都已经具备和我们所学到的知识及本身的能力有限,选择基于ARM9的视频监控系统作为我们本次的课程设计题目是比较实际而且比较容易掌握嵌入式开发的基本方法,这也为将来实现无线视频监控系统打下坚实的基础。

2.2  设计实现功能要求:

1)   利用USB摄像头进行采集图像数据的采集;

2)   利用S3C2440对所采集到图像数据进行压缩;

3)   通过以太网卡模块将压缩后的图像信息发送到网络上。

2.3 设计用到的设备

1)   带有串口和并口的计算机

2)   友善之臂开发板

3)   USB摄像头

4)   JTAG调试器

5)   串口线

3. 课程设计报告内容

3.1系统的工作原理

系统可以分为4 个模块:图像采集模块、图像存储模块、图像处理与系统控制模块、图像数据发送模块。系统在S3C2440 的控制下从USB 摄像头采集图像数据,然后经过DMA 方式将图像数据传输到内存缓冲区中,由软件将图像数据读出并对图像数据进行压缩和打包处理后存入Flash 中, 最后经过以太网络发送到远程接收端服务器。本系统的设计难点是如何保证内存中图像数据的读取与USB 摄像头的同步以及图像数据的实时处理。系统采用S3C2440 作为嵌入式处理器, 由于S3C2440 高达400MHz 的处理能力,完全可以完成图像数据的实时处理需求,比一般采用添加图像硬件处理模块减少了系统的成本。

3.2建立Linux开发环境

3.2.1安装Fedora9.0

3.2.2建立交叉编译环境

搭建交叉编译环境是嵌入式开发的第一步,也是必备的一步。搭建交叉环境的方法很多,不同的体系结构、不同的操作内容甚至是不同版本的内核,都会用到不用的交叉编译器,选择合适的交叉编译器对于嵌入式开发是非常重要的。由于我们本次用到的是linux 2.6.32.2内核,故我们选择了编译器arm-linux-gcc-4.3.2。以下安装交叉编译器的步骤:

1)        下载交叉编译器arm-linux-gcc-4.3.2,下载地址:http://www.handhelds.org/download/projects/toolchain/arm-linux-gcc-4.3.2.tar.bz2

2)        复制arm-linux-gcc-4.3.2.tar.bz2到目录 tmp/下并解压:

# cd /tmp

# tar xvzf arm-linux-gcc-4.3.2.tar.bz2

3)   把编译器路径加入系统环境变量,运行命令

 #gedit /root/.bashrc

编辑/root/.bashrc 文件,在最后一行设置:

export PATH=$PATH:/usr/local/arm/4.3.2/bin

3.2.3解压安装源代码和工具

1)   下载linux 2.6.32.2内核源代码

下载地址:http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.2.tar.gz

2)   复制内核代码至目录/tmp/linux 并解压

# tar –xvzf linux-2.6.32.2.tar.gz

3)   解压目标文件系统

这里我们使用现有的根文件系统资源root_qtopia-20100108.tgz,将它复制至目录/usr/src 并解压

# tar –xvzf root_qtopia-20100108.tgz

4)   安装目标文件系统映象制作工具mkyaffs2image

要把上一步中的root_qtopia 目录烧写入目标板中使用, 就需要使用相应的mkyaffs2image 工具,它是一个命令行的程序,使用它可以把主机上的目标文件系统目录制作成一个映象文件,以烧写到开发板中。

 #tar xvzf /tmp/linux/mkyaffs2image.tgz –C /

3.2.4配置网络文件系统NFS服务

1)   设置共享目录

运行命令 #gedit /etc/exports

编辑 nfs 服务的配置文件,添加以下内容:

/opt/FriendlyARM/mini2440/root_qtopia *(rw,sync,no_root_squash)

其中:/opt/FriendlyARM/mini2440/root_qtopia 表示nfs 共享目录,它可以作为开发板的根文件系统通过nfs 挂接;* 表示所有的客户机都可以挂接此目录rw 表示挂接此目录的客户机对该目录有读写的权力;no_root_squash 表示允许挂接此目录的客户机享有该主机的root 身份

2)   启动NFS 服务

在命令行下运行:

#/etc/init.d/nfs start

3.3 定制Linux内核

Linux 内核是一个社区共同开发的作品,具备一个现代操作系统的所有功能,并能对绝大多数硬件提供支持。然而,我们本次设计有很多功能都没有用到的,为了尽可能减少编译出来的内核体积,在配置内核时,只需要配置需要用到的模块。常用的配置内核的方法有make config ,make menuconfig和make xconfig这里我们使用最广泛的make menuconfig。执行“make menuconfig”,可进入配置内核界面:

1)   配置CPU平台选项

在主菜单里面,选择System Type,按回车进入,使用上下方向控制键一直找到 S3C2440 机器平台选项,可以进入 S3C2400 Machines 子菜单,可以看到里面有很多常见的使用 S3C2440 的目标板平台选项,在此选“FriendlyARM Mini2440 development board”

2)   配置万能驱动USB摄像头

在Device Drivers 菜单里面,选择 Multimedia devices,回车进入,选择如图“*”号选项,并选择Video capture adapters 进入

出现如图菜单,找到如图选项并进入

出现如图菜单,选择如图“*”号选项,再选GSPCA based webcams 进入

这里我们选择所有类型USB 摄像头的支持

3)   配置网卡驱动

要配置网卡驱动,首先要配置网络协议支持.在主菜单中,选择 Netwoking support,回车进入子菜单, 选择 Networking options 并进入下一级菜单,如图配置选项

选择完毕,一直退回到主菜单,并选择进入 Device Drivers 菜单。找到 Network device support,选择进入下一级菜单, 找到并进入 Ethernet (10 or 100Mbit) 选项, 选中:

<*> Generic Media Independent Interface device support

<*> DM9000 support

4)   配置串口驱动

在 Character devices 菜单中,选择进入Serial drivers - - ->,选择如图选项,来配置串口驱动

5)   配置yaff2s文件系统的支持

要使用 yaffs2 文件系统,需要先配置nand flash 驱动支持,在Device drivers 菜单中选择MTD 选项,按回车进入,找到 NAND Device Support 选项并进入,如图选择 Nand Flash 驱动支持

返回到内核配置主菜单,找到 File systems 选项进入,然后找到选项 Miscellaneous filesystems 并进入,再找到 YAFFS2 支持选项,如图选择

6)   配置NFS文件系统

在 File System 菜单中,选择Network File Systems 文件系统的支持且进入, 选择如图选项,这样配置编译出的内核就可以通过 NFS 启动系统了。

完成内核的配置并保存好,接着执行命令:

#make dep       ;生成依赖文件

#make zImage    ;生成压缩的内核影象文件

3.4 制作目标文件系统映象

进入/opt/FriendlyARM/mini2440 工作目录,执行以下命令:

#cd /opt/FriendlyARM/mini2440

#mkyaffs2image root_qtopia root_qtopia.img

3.5 移植bootloader

(1) 打开DNW 程序,接上USB 电缆,根据菜单选择功能号[v]开始下载supervivi

(2)点击“USB Port->Transmit/Restore”选项,并选择打开文件supervivi开始下载。

(3)下载完毕,BIOS 会自动烧写supervivi 到Nand Flash 分区中,并返回到主菜单。

3.6 移植Linux内核

(1)在BIOS 主菜单中选择功能号[k],开始下载linux 内核zImage

(2) 点击“USB Port->Transmit”选项,并选择打开相应的内核文件zImage开始下载.

(3) 下载完毕,BIOS 会自动烧写内核到Nand Flash 分区中,并返回到主菜单

3.7移植根文件系统

(1)在BIOS 主菜单中选择功能号[y],开始下载yaffs 根文件系统映象文件

(2) 点击“ USB Port->Transmit/Restore ” 选项, 并选择打开相应的文件系统映象文件

root_qtopia.img开始下载。

(3)下载完毕,BIOS 会自动烧写内核到Nand Flash 分区中,并返回到主菜单

4.小结

在网上可以找到很多关于视频监控方面的资料,甚至是现成的设计论文,我们本次设计参考了众多书籍及网络上的理论知识,在理解的基础上结合思考及实践,根据现有的硬件设备,对完整的内核代码进行了相应的裁减,配置出适合我们所设计的系统的内核。整个过程看似有点按部就班,但真正操作起来并没有那么简单,很多时候都会出现一些莫名其妙的错误,以致无法进行下一步的操作。这时就需要回归到理论方面的知识中去,经过多次尝试及同学的帮助才能得以解决。

参考文献

[1]李新峰、何广生、赵秀文。基于ARM9的嵌入式Linux开发技术。电子工业出版社,2008

[2]孙天泽。嵌入式Linux操作系统。人民邮电出版社。2009

[3]ARM9 Linux 实验教程。深圳英蓓特公司出品,2005

[4]杨水清、张剑、施云飞。ARM嵌入式Linux系统开发技术详解。电子工业出版社,2008

[5]俞建新、王健、宋健建。嵌入式系统基础教程。机械工业出版社,2009

 

第二篇:【精品课程设计】操作系统课程设计之Linux磁盘空间管理

*******************

实践教学

*******************

兰州理工大学

计算机与通信学院

20xx年秋季学期

课程设计

题 专业班级: 08级计算机1班 姓 名: 学 号: 指导教师: 成 绩:

目 录

摘 要 ............................................................. 3

前 言 ............................................................. 4

正 文 ............................................................. 5

1. 实验目的 ..................................................... 5

2. 设计思想 ..................................................... 5

3. 实验结构图 ................................................... 6

4. 各模块的伪码算法 ............................................. 6

5. 测试分析 .................................................... 11

6. 测试结果 .................................................... 12

7. 源程序 ...................................................... 15

总 结 ............................................................ 25

参考文献 ......................................................... 26

致 谢 ........................................................... 27

2

摘 要

要把文件信息存放在存储介质上,必须先找出存储介质上可供使用的空闲块。存储介质上某个文件不再需要时,又要收回它所占的存储空间作为空闲块。用户作业在执行期间经常要求建立一个新文件或撤消一个不再需要的文件,因此,文件系统必须要为它们分配存储空间或收回它所占的存储空间。如何实现存储空间的分配和收回,取决于对空闲块的管理方法,主要有两种对磁盘存储空间的分配和收回的方法:位示图法(用一张位示图(简称位图)来指示磁盘存储空间的使用情况),空闲块链接法(在UNIX操作系统中,把磁盘存储空间的空闲块成组链接)。

关键词:磁盘的分配和回收管理;位示图;成组链接。

3

前 言

通过该题目的设计过程,掌握磁盘存储管理的原理、软件开发方法并提高解决实际问题的能力。学习使用位示图管理磁盘空间的分配与回收,了解程序运行前和回收磁盘的物理地址过程。学会用模拟UNIX系统的成组链接法实现磁盘空间的管理。了解UNIX的命令及使用格式,熟悉UNIX/LINUX的常用基本命令,练习并掌握UNIX提供的vi编辑器来编译C程序,学会利用gcc、gdb编译、调试C程序。希望通过本次设计过程可以提高自己的分析问题的能力和实际动手的能力,将学到的知识用于实践中。

4

正 文

1. 实验目的

磁盘格式化时,系统把磁盘存储空间分成许多磁道。每个磁道又分成若干个扇区(又叫做块)。这些空间就是用来存放用户文件的。当用户的文件不再需要时,就应该删除。把一个文件存放到磁盘上时,可以组织成连续文件,链接文件,索引文件等。因此,磁盘空间的分配方法也有两种,一种是连续空间的分配;一种是不连续空间的分配(又叫动态分配)。如何充分有效的利用磁盘空间,是操作系统应解决的重要课题之一。通过本实验,使学生对磁盘空间的分配与回收有一个较深入的理解。

2. 设计思想

? 位示图法:

一个简单的管理方法是用一张位示图(简称位图)来指示磁盘存储空间的使用情况。一个盘组的分块确定后,根据分配的总块数决定位图由多少个字组成,位图中的每一位与盘组分块一一对应。位示图是一张可以反映磁盘空间是否被占有的模拟图,用一个二维数组表示磁盘的空间,数组内每一个元素表示磁盘内相应的分块,数组元素为“1”表示该块已被占,“0”表示该块为空。数组元素位置与磁盘分块一一对应,即可描述出磁盘空间的利用情况。

? 成组链接法:

首先定义磁盘分配数组并初始化,9个一维数组分别表示9个空闲块,程序运行时,先将专用块A〔0〕复制到内存中,然后进行功能选择,分配时,查MA,从中找出空闲块号,当一组的空闲块只剩第一块时,应把该块中指出的下一组的空闲块数和块号复制到专用块这,然后把该块分配给申请者,当一组的空 5

闲块分配完后则把专用块内容(下一组链接情况)复制到内存,再为申请者分配。 回收时,输入待回收的块号,查找该块是否已被分配,若未分配,退出,否则,当前组不满规定块数时,将归还块登记入该组,若当前组已满,则另建一新组,这时归还块作为新一组的第一块,应把内存中登记的一组链接情况MA复制到归还块中,然后在MA这重新登记一个新组。显示分组情况。系统初始化时先将专用块内容读入 内存 ,当有申请空闲块要求时,就直接在内存专用块中找到哪些块是空闲的,每分配一块后把空闲块数减 1。但要把一组中第一块分配出去之前,可以先把登记在该块中的下一组的块号保存在专用块中(此时 ,原专用块中的信息巳经无用了 ,因它指示的一组空闲块都已分配掉)。当中文组空闲块分配完后,则将下一组内容读入内存专用块中,以便继续分配时查找。

3. 实验结构图

精品课程设计操作系统课程设计之Linux磁盘空间管理

4. 各模块的伪码算法

1) 对位示图法

6

? 定义分配函数:

void assign()

{

unsigned int n=0,i,s=1,j,k,q,m,sq,zhm,cid;

for(i=0 ,k=0;i<5;i++)

{q=size[i] ;

j=0;

while(1)

{

j++ ;

if((q%2)==0)

{ if(j==1) size[i]+=1;

else

{for(m=1;m<j;m++)

s*=2 ;

size[i]+=s;}

k=1;

break ;/*完成后退出*/ }

q=q/2;

}

if(k==1) /*将找到的位示图位转换成物理地址*/ { if((j-1)/8==1)

{zhm=2*i+1;

cid=(j-9)/4;

sq=(j-9)%4;}

else

{zhm=2*i;

7

cid=(j-1)/4;

sq=(j-1)%4;

}

n=1;

break;/*退出for循环*/

}

}

if(n==0)

printf("没有空间可分配!\n");

else

{printf("分配成功!\n");/*输出物理地址*/ printf("柱面号为: %d\n",zhm);

printf("磁道号为: %d\n",cid);

printf("扇区号为: %d\n",sq);

}

printf("分配后的位示图为:\n");

out();

}

? 定义回收函数:

void callback()/*回收函数*/

{ unsigned int i,j,s=1,q,m,sq,zhm,cid;

printf("确定要回收块的柱面号、磁道号、扇区号:\n"); printf("请输入柱面号:");

scanf("%d",&zhm);

printf("\n请输入磁道号:");

scanf("%d",&cid);

printf("\n请输入扇区号:");

scanf("%d",&sq);

8

if(zhm%2==0)/*计算对应的位示图位置*/ { i=zhm/2;

j=cid*4+sq+1;

}

else

{ i=(zhm-1)/2;

j=cid*4+sq+9;

}

q=size[i];

m=j-1;

while(m)

{q=q/2;

m--;}

if(q%2==1)/*判断该块是否被分配*/

{if(j==1)size[i]-=1;/*将位示图对应为置零*/ else

{for(m=1;m<j;m++)

s*=2 ;

size[i]-=s;}

printf("回收成功!");

printf("回收后的位示图为:\n"); out();

}

else

printf("该块以被分配!");

}

2) 对成组链接法

9

? 分配函数:

void assign()

{int s,i;

if(MA[0]>1) /*若该组不止一个空闲块*/ { i=MA[0];

s=MA[i];

MA[0]--;

printf("\nnumber of the block:%d",s); }

else if(MA[0]==1) /*只剩一个空闲块*/

{if(MA[1]!=0) /*还有其它空闲块组*/ { s=MA[1];

for(i=0;i<=3;i++)

A[0][i]=A[s][i];

MA[0]--;

printf("\nnumber of the block:%d",s); }

else /*没有其它空闲块组*/

{ printf("\nThere isn't any space");

return;

}

}

else /*当前组已分配完*/

{for(i=0;i<=3;i++)

MA[i]=A[0][i];

assign();

}

display(); /*显示分组情况*/

}

10

? 回收函数:

void callback()

{ int i,j,temp;

printf("\ninput the No. of the block you want to callback:");

scanf("%d",&j);

getchar(); /*得到待回收的空闲块号*/

for(temp=1;temp<=No;temp++)

{ if(mark[temp]==j)

break;}

if(temp<No+1) /*若该空闲块已在,退出*/

{ printf("\nThe block is in the disk");

return;

}

if(MA[0]<3) /*当前组不满3块*/

{ i=MA[0];

MA[i+1]=j;

MA[0]++;

}

else /*已有3块*/

{for(i=0;i<=3;i++)

A[j][i]=MA[i];

MA[0]=1;

MA[1]=j;

}

display(); /*显示*/

}

5. 测试分析

用位示图表示的磁盘空间可以很形象的反映出磁盘中空间的利用情况,不足 11

之处在于每次分配与回收只可以对单一的分块进行操作,不能同时进行几个块的分配与回收,要进行多个块的分配时,只能单独分配,且块之间没有相互链接,对于大的空间分配只能在连续空间进行。

用成组链接法模拟的磁盘空间能够解决用位示图中存在的问题,它可以通过链表的形式存取信息,对于较大的空间分配,若一个磁盘空间不够,通过指针找到下一个空闲的分区,但操作过程比较复杂,没有位示图方便,简捷。

6. 测试结果

1) 位示图法

? 编译及连接时界面:

精品课程设计操作系统课程设计之Linux磁盘空间管理

? 刚运行时界面:

12

? 分配空间时界面:

精品课程设计操作系统课程设计之Linux磁盘空间管理

? 回收空间时界面:

精品课程设计操作系统课程设计之Linux磁盘空间管理

13

2) 成组链接法

? 分配空间时界面:

精品课程设计操作系统课程设计之Linux磁盘空间管理

精品课程设计操作系统课程设计之Linux磁盘空间管理

14

? 回收空间时界面:

精品课程设计操作系统课程设计之Linux磁盘空间管理

7. 源程序

? 位示图法:

#include<stdio.h>

unsigned int size[5]={1,1,1,1,1};/*保存位示图*/

void out()/*输出位示图函数*/

{ unsigned int i,j,m;

for(j=0;j<5;j++)/*循环输出size的各个数的各个二进制位*/ {m=size[j];

for(i=0;i<16;i++) /**/

{printf("%d ",m%2);

m=m/2;

if(i==7)

printf("\n");

}

15

printf("\n");

}

}

void callback()/*回收函数*/

{ unsigned int i,j,s=1,q,m,sq,zhm,cid;

printf("确定要回收块的柱面号、磁道号、扇区号:\n"); printf("请输入柱面号:");

scanf("%d",&zhm);

printf("\n请输入磁道号:");

scanf("%d",&cid);

printf("\n请输入扇区号:");

scanf("%d",&sq);

if(zhm%2==0)/*计算对应的位示图位置*/

{ i=zhm/2;

j=cid*4+sq+1;

}

else

{ i=(zhm-1)/2;

j=cid*4+sq+9;

}

q=size[i];

m=j-1;

while(m)

{q=q/2;

m--;}

if(q%2==1)/*判断该块是否被分配*/

{if(j==1)size[i]-=1;/*将位示图对应为置零*/ else

{for(m=1;m<j;m++)

s*=2 ;

16

size[i]-=s;}

printf("回收成功!");

printf("回收后的位示图为:\n");

out();

}

else

printf("该块以被分配!");

}

void assign()

{

unsigned int n=0,i,s=1,j,k,q,m,sq,zhm,cid;

for(i=0 ,k=0;i<5;i++)

{q=size[i] ;

j=0;

while(1)

{

j++ ;

if((q%2)==0)

{ if(j==1) size[i]+=1;

else

{for(m=1;m<j;m++)

s*=2 ;

size[i]+=s;}

k=1;

break ; /*完成后退出*/ }

q=q/2;

}

if(k==1) /*将找到的位示图位转换成物理地址*/ { if((j-1)/8==1)

17

{zhm=2*i+1;

cid=(j-9)/4;

sq=(j-9)%4;}

else

{zhm=2*i;

cid=(j-1)/4;

sq=(j-1)%4;

}

n=1;

break;/*退出for循环*/ }

}

if(n==0)

printf("没有空间可分配!\n");

else

{printf("分配成功!\n");/*输出物理地址*/ printf("柱面号为: %d\n",zhm); printf("磁道号为: %d\n",cid);

printf("扇区号为: %d\n",sq);

}

printf("分配后的位示图为:\n");

out();

}

void menu() /*功能选择函数*/ { int choice;

char judge;

printf("\n请选择操作:(1--分配,2--回收):"); scanf("%d",&choice);

getchar();

18

if(choice==1)

assign();

else if(choice==2)

callback();

else

printf("\n没有此项!");

printf("\n继续还是退出?(y--继续,n--退出):");

scanf("%c",&judge);

getchar();

if(judge=='y')

menu();

else

{ printf("\n现在的位示图:\n");

out();

printf("\n按任意键退出!\n");

getchar();

}

}

main()

{

printf("\t\t————欢迎进入磁盘空间管理模拟实验———— \n"); printf( " \n");

printf("★★★★08级计算机一 08240128 李彦博★★★★\n"); printf("﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌\n"); out();

menu();

}

? 成组链接法:

#include<stdio.h>

19

int MA[4]; /*空闲块数组*/

intA[9][4]={{3,1,2,3},{3,4,5,6},{0,0,0,0},{0,0,0,0},{3,0,7,8},{0,0,0,0},{0,0,0,0},{0,0,0,0},{ 0,0,0,0}}; /*磁盘空间*/

int mark[9]; /*存放已分配的块*/

int No=0; /*已分配的块数*/

void display1()

{int i,j,temp,count;

No=0;

if(MA[1]!=0)

{i=MA[0];

printf("\ngroup1:");

for(j=1;j<=i;j++)

{ printf("%d ",MA[j]);

mark[++No]=MA[j];

}

temp=MA[1];

count=2;

while(A[temp][1]!=0) { printf("\ngroup%d:",count);

i=A[temp][0];

for(j=1;j<=i;j++)

{printf("%d ",A[temp][j]);

mark[++No]=A[temp][j];

}

count++;

temp=A[temp][1];

}

printf("\ngroup%d:",count);

i=A[temp][0];

for(j=2;j<=i+1;j++)

20

if(A[temp][j]>0)

{printf("%d ",A[temp][j]); mark[++No]=A[temp][j];

}

}

else

{i=MA[0];

if(i==1)

printf("\nThe blocks are all assigned"); else

{printf("\ngroup1:");

for(j=2;j<=i;j++)

{printf("%d ",MA[j]); mark[++No]=MA[j]; }

}

}

}

void display() /*显示分组情况*/

{ int i,j;

if(MA[0]!=0)

display1();

else

{i=MA[1];

for(j=0;j<=3;j++)

MA[j]=A[i][j];

display1();

}

}

21

void assign() /*分配空闲块*/

{int s,i;

if(MA[0]>1) /*若该组不止一个空闲块*/

{ i=MA[0];

s=MA[i];

MA[0]--;

printf("\nnumber of the block:%d",s); }

else if(MA[0]==1) /*只剩一个空闲块*/

{if(MA[1]!=0) /*还有其它空闲块组*/ { s=MA[1];

for(i=0;i<=3;i++)

A[0][i]=A[s][i];

MA[0]--;

printf("\nnumber of the block:%d",s); }

else /*没有其它空闲块组*/

{ printf("\nThere isn't any space");

return;

}

}

else /*当前组已分配完*/

{for(i=0;i<=3;i++)

MA[i]=A[0][i];

assign();

}

display(); /*显示分组情况*/

}

void callback() /*回收空闲块*/

{ int i,j,temp;

22

printf("\ninput the No. of the block you want to callback:"); scanf("%d",&j);

getchar(); /*得到待回收的空闲块号*/ for(temp=1;temp<=No;temp++)

{ if(mark[temp]==j)

break;

}

if(temp<No+1) /*若该空闲块已在,退出*/ { printf("\nThe block is in the disk"); return;

}

if(MA[0]<3) /*当前组不满3块*/ { i=MA[0];

MA[i+1]=j;

MA[0]++;

}

else /*已有3块*/

{for(i=0;i<=3;i++)

A[j][i]=MA[i];

MA[0]=1;

MA[1]=j;

}

display(); /*显示*/

}

void menu() /*功能选择函数*/

{ int choice;

char judge;

printf("\n做出选择:(1--分配,2--回收):"); scanf("%d",&choice);

getchar();

23

if(choice==1)

assign();

else if(choice==2)

callback();

else

printf("\n错误请求!");

printf("\ncontinue or not (y--Yes,n--Not):"); scanf("%c",&judge);

getchar();

if(judge=='y')

menu();

else

{ printf("\nNow the graph is:"); display();

printf("\npress any key to quit");

}

}

main()

{ int i;

for(i=0;i<=3;i++)

MA[i]=A[0][i];

display();

menu();

}

24

总 结

经过本次课程设计,完成题目“磁盘空间管理模拟实验”, 熟悉了UNIX/LINUX的常用基本命令,理解并掌握了UNIX提供的vi编辑器来编译C程序,学会利用gcc、gdb编译、调试C程序。

做课程设计是为了对平时学习的理论知识与实际操作相结合,在理论和实践上进一步巩固已学基本理论及应用知识并加以综合提高,学会将知识应用于实际的方法,提高分析和解决问题的能力。在做课程设计的过程中,深深感觉到自身所学知识的有限。有些题目书本上没有提及,所以就没有去研究过,做的时候突然间觉得自己真的有点无知,虽然现在去看依然可以解决问题,但还是浪费了许多,这一点是必须在以后的学习中加以改进的地方,同时也要督促自己在学习的过程中不断的完善自我。在设计过程中的思考和讨论,对现有知识能够运用计算机来解决现实生活中的实际问题确立了信心,对模块化程序设计思想有了比较清晰的印象,为今后的程序设计奠定了一定的心理和技术上的准备。

这次课程设计加强了我对计算机操作系统的认识,对我个人而言是对所学课程内容掌握情况的一次自我验证。通过课程设计提高了我对所学知识的综合应用能力,全面检查并掌握所学的内容,培养独立思考,在分析问题、解决问题的过程中,更是获得一种成功的喜悦。

25

参考文献

1) 汤子瀛,哲凤屏.《计算机操作系统》.西安电子科技大学学出版社.

2) 王清,李光明.《计算机操作系统》.冶金工业出版社.

3) 孙钟秀等. 操作系统教程. 高等教育出版社

4) 曾明. Linux操作系统应用教程. 陕西科学技术出版社.

5) 张丽芬,刘利雄.《操作系统实验教程》. 清华大学出版社.

6) 孟静, 操作系统教程--原理和实例分析. 高等教育出版社

7) 周长林,计算机操作系统教程. 高等教育出版社

8) 张尧学,计算机操作系统教程,清华大学出版社

9) 任满杰,操作系统原理实用教程,电子工业出版社

26

致 谢

完成项目以后,我了解了“团结”、“耐心”、“基础”、“效率”、“沟通”的重要性。在此,我衷心的感谢王旭阳老师对我细心的指导,她在我的课程设计过程中提出了指导性的方案和架构,并指引我阅读相关的资料和书籍,使我在不熟悉的领域中仍能迅速掌握新的技术;也诚挚感谢我的操作系统刘嘉老师对我的认真教导,她使我了解到了好多关于操作系统方面的知识;最后我要感谢我的同学,在课设过程中,给了我很大的帮助。

27

相关推荐