重邮操作系统课程设计实验报告范文.docx
- 文档编号:12294209
- 上传时间:2023-06-05
- 格式:DOCX
- 页数:12
- 大小:16.83KB
重邮操作系统课程设计实验报告范文.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的使用,学会了编写简单的模块化的字符设备驱动程序。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 课程设计 实验 报告 范文