重邮操作系统课程设计实验报告范文.docx
《重邮操作系统课程设计实验报告范文.docx》由会员分享,可在线阅读,更多相关《重邮操作系统课程设计实验报告范文.docx(12页珍藏版)》请在冰豆网上搜索。
重邮操作系统课程设计实验报告范文
重邮操作系统课程设计实验报告范文
操作系统课程设计
班级:
姓名:
学号:
时间:
年月日
指导教师:
实验题目:
操作系统课程设计
实验目的:
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/grub.conf
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%d\n",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%d\n",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);
cdev.owner=THIS_MODULE;
cdev.op=&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("Mac.Zhong");
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)找到memdev.ko,将它装入内核immodmemdev.ko
(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.虚拟机不会使用,听老师讲解以及XX解决;
2.linu某系统命令不会使用,询问老师以及XX解决;
3.字符设备驱动程序不会编译和安装,XX解决。
心得体会:
掌握了Linu某操作系统安装的一般方法,掌握了Linu某内核升级一般方法,掌握了系统引导管理器Grub的使用,学会了编写简单的模块化的字符设备驱动程序。