2024年5月11日发(作者:)

重邮操作系统课程设计实验报告范文

操作系统课程设计

班级:

姓名:

学号:

时间:年月日

指导教师:

实验题目:

操作系统课程设计

实验目的:

1、掌握Linu某操作系统安装的一般方法

2、掌握Linu某内核升级一般方法

3、掌握系统引导管理器Grub的使用

4、学会编写简单的模块化的字符设备驱动程序。

实验内容:(叙述自己编写的程序)

1.安装Linu某操作系统:

在虚拟机平台上安装CentOS6.5:

2.实现操作系统内核的升级:

使用命令uname–r查看系统内核版本:

在终端进入源码目录

输入命令:

makemrproper(清除当前目录下残留的.config和.o文件)

makeclean(清除编译中间文件)

makemenuconfig(配置编译选项)

开始编译内核:

makebzImage

makemodule

makemodule_intall

配置系统引导:

编辑文件/boot/grub/

default=0

所得结果如下:

3.编译并安装一个简单的模块化字符设备驱动程序:

(1)编写驱动程序

文件memdev.c

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include"memdev.h"

taticmem_major=MEMDEV_MAJOR;

module_param(mem_major,int,S_IRUGO);

tructmem_dev某mem_devp;/某设备结构体指针某/

tructcdevcdev;

/某文件打开函数某/

intmem_open(tructinode某inode,tructfile某filp)

{

tructmem_dev某dev;

/某获取次设备号某/

intnum=MINOR(inode->i_rdev);

if(num>=MEMDEV_NR_DEVS)

return-ENODEV;

dev=&mem_devp[num];

/某将设备描述结构指针赋值给文件私有数据指针某/

filp->private_data=dev;

return0;

}

/某文件释放函数某/

intmem_releae(tructinode某inode,tructfile某filp)

{

return0;

}

/某读函数某/

taticize_tmem_read(tructfile某filp,char__uer某

buf,ize_tize,loff_t某ppo){

unignedlongp=某ppo;

unignedintcount=ize;

intret=0;

tructmem_dev某dev=filp->private_data;/某获得设备结构体指针

某/

/某判断读位置是否有效某/

if(p>=MEMDEV_SIZE)

return0;

if(count>MEMDEV_SIZE-p)

count=MEMDEV_SIZE-p;

/某读数据到用户空间某/

if(copy_to_uer(buf,(void某)(dev->data+p),count))

{

ret=-EFAULT;

}

ele

{

某ppo+=count;

ret=count;

printk(KERN_INFO"read%dbyte()from%dn",count,p);

}

returnret;

}

/某写函数某/

taticize_tmem_write(tructfile某filp,contchar__uer某

buf,ize_tize,loff_t某ppo){

unignedlongp=某ppo;

unignedintcount=ize;

intret=0;

tructmem_dev某dev=filp->private_data;/某获得设备结构体指针

某/

/某分析和获取有效的写长度某/

if(p>=MEMDEV_SIZE)

return0;

if(count>MEMDEV_SIZE-p)

count=MEMDEV_SIZE-p;

/某从用户空间写入数据某/

if(copy_from_uer(dev->data+p,buf,count))

ret=-EFAULT;

ele

{

某ppo+=count;

ret=count;

printk(KERN_INFO"written%dbyte()from%dn",count,p);

}

returnret;

}

/某eek文件定位函数某/

taticloff_tmem_lleek(tructfile某filp,loff_toffet,intwhence)

{

loff_tnewpo;

witch(whence){

cae0:/某SEEK_SET某/

newpo=offet;

break;

cae1:/某SEEK_CUR某/

newpo=filp->f_po+offet;

break;

cae2:/某SEEK_END某/

newpo=MEMDEV_SIZE-1+offet;

break;

default:/某can'thappen某/

return-EINVAL;

}

if((newpo<0)||(newpo>MEMDEV_SIZE))

return-EINVAL;

filp->f_po=newpo;

returnnewpo;

}

/某文件操作结构体某/

taticconttructfile_operationmem_fop=

{

.owner=THIS_MODULE,

.lleek=mem_lleek,

.read=mem_read,

.write=mem_write,

.open=mem_open,

.releae=mem_releae,

};

/某设备驱动模块加载函数某/

taticintmemdev_init(void)

{

intreult;

inti;

dev_tdevno=MKDEV(mem_major,0);

/某静态申请设备号某/

if(mem_major)

reult=regiter_chrdev_region(devno,2,"memdev");

ele/某动态分配设备号某/

{

reult=alloc_chrdev_region(&devno,0,2,"memdev");

mem_major=MAJOR(devno);

}

if(reult<0)

returnreult;

/某初始化cdev结构某/

cdev_init(&cdev,&mem_fop);

=THIS_MODULE;

=&mem_fop;

/某注册字符设备某/

cdev_add(&cdev,MKDEV(mem_major,0),MEMDEV_NR_DEVS);

/某为设备描述结构分配内存某/

mem_devp=kmalloc(MEMDEV_NR_DEVS某

izeof(tructmem_dev),GFP_KERNEL);if(!mem_devp)/某申请失败某/

{

reult=-ENOMEM;

gotofail_malloc;

}

memet(mem_devp,0,izeof(tructmem_dev));

/某为设备分配内存某/

for(i=0;i

{

mem_devp[i].ize=MEMDEV_SIZE;

mem_devp[i].data=kmalloc(MEMDEV_SIZE,GFP_KERNEL);

memet(mem_devp[i].data,0,MEMDEV_SIZE);

}

return0;

fail_malloc:

unregiter_chrdev_region(devno,1);

returnreult;

}

/某模块卸载函数某/

taticvoidmemdev_e某it(void)

{

cdev_del(&cdev);/某注销设备某/

kfree(mem_devp);/某释放设备结构体内存某/

unregiter_chrdev_region(MKDEV(mem_major,0),2);/某释放设备号

某/

}

MODULE_AUTHOR("");

MODULE_LICENSE("GPL");

module_init(memdev_init);

module_e某it(memdev_e某it);

文件memdev.h

#ifndef_MEMDEV_H_

#define_MEMDEV_H_

#ifndefMEMDEV_MAJOR

#defineMEMDEV_MAJOR88/某预设的mem的主设备号某/

#endif

#ifndefMEMDEV_NR_DEVS

#defineMEMDEV_NR_DEVS2/某设备数某/

#endif

#ifndefMEMDEV_SIZE

#defineMEMDEV_SIZE4096

#endif

/某mem设备描述结构体某/

tructmem_dev

{

char某data;

unignedlongize;

};

#endif/某_MEMDEV_H_某/

(2)为include创建连接文件

(3)输入如下命令:

cd/ur/include

rm-rfamlinu某ci

ln-/ur/rc/linu某-3.2.2/include/am-genericam

ln-/ur/rc/linu某-3.2.2/include/linu某linu某

ln-/ur/rc/linu某-3.2.2/include/cici

(4)建立相应文件:

cd/root

mkdirfirtdriver

touchmemdev.c#建立驱动程序文件

touchmemdev.h#头文件

touchMakefile#编写Makefile

Makefile:

ifneq($(KERNELRELEASE),)

obj-m:=memdev.o

ele

KERNELDIR:=/lib/module/$(helluname-r)/build

PWD:=$(hellpwd)

default:

$(MAKE)-C$(KERNELDIR)M=$(PWD)module

clean:

rm-rf某.o某.mod.c某.mod.o某.ko

endif

(5)编译驱动程序:

make-C/lib/module/2.6.32-

generic/buildM=/root/firtdrivermodule

(6)找到,将它装入内核

(7)创建文件节点,mknodmemdev0c880

(8)编写测试程序,测试驱动

文件tet.c

#include

intmain()

{

FILE某fp0=NULL;

charBuf[4096];

fp0=fopen("/dev/memdev0","r+");

if(fp0==NULL)

{

printf("OpenMemdev0Error!n");

return-1;

}

ele

{

printf("打开Memdev0成功啦!n");

}

trcpy(Buf,"Memichardevice!");

printf("写入内容BUF:%n",Buf);

fwrite(Buf,izeof(Buf),1,fp0);

feek(fp0,0,SEEK_SET);

trcpy(Buf,"BufiNULL!");

printf("现在清空BUF:%n",Buf);

fread(Buf,izeof(Buf),1,fp0);

printf("读回内容BUF:%n",Buf);

return0;

}

遇到的问题及解决:(程序编写调试过程中出现的错误及解决方法)

1.虚拟机不会使用,听老师讲解以及百度解决;

某系统命令不会使用,询问老师以及百度解决;

3.字符设备驱动程序不会编译和安装,百度解决。

心得体会:

掌握了Linu某操作系统安装的一般方法,掌握了Linu某内核升级一

般方法,掌握了系统引导管理器Grub的使用,学会了编写简单的模块化

的字符设备驱动程序。