版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
重邮操作系统课程设计实验报告范文操作系统课程设计班级:姓名:学号:时间:年月日指导教师:实验题目:操作系统课程设计实验目的:1、掌握Linu某操作系统安装的一般方法2、掌握Linu某内核升级一般方法3、掌握系统引导管理器Grub的使用4、学会编写简单的模块化的字符设备驱动程序。实验内容:(叙述自己编写的程序)1.安装Linu某操作系统:在虚拟机平台上安装CentOS6.5:2.实现操作系统内核的升级:使用命令uname–r查看系统内核版本:在终端进入源码目录输入命令:makemrproper(清除当前目录下残留的.config和.o文件)makeclean(清除编译中间文件)makemenuconfig(配置编译选项)开始编译内核:makebzImagemakemodulemakemodule_intall配置系统引导:编辑文件/boot/grub/grub.confdefault=0所得结果如下:3.编译并安装一个简单的模块化字符设备驱动程序:(1)编写驱动程序文件memdev.c#include<linu某/module.h>#include<linu某/type.h>#include<linu某/f.h>#include<linu某/errno.h>#include<linu某/mm.h>#include<linu某/ched.h>#include<linu某/init.h>#include<linu某/cdev.h>#include<am/io.h>#include<am/ytem.h>#include<am/uacce.h>#include<linu某/lab.h>#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<MEMDEV_NR_DEVS;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/includerm-rfamlinu某ciln-/ur/rc/linu某-3.2.2/include/am-genericamln-/ur/rc/linu某-3.2.2/include/linu某linu某ln-/ur/rc/linu某-3.2.2/include/cici(4)建立相应文件:cd/rootmkdirfirtdrivertouchmemdev.c#建立驱动程序文件touchmemdev.h#头文件touchMakefile#编写MakefileMakefile:ifneq($(KERNELRELEASE),)obj-m:=memdev.oeleKERNELDIR:=/lib/module/$(helluname-r)/buildPWD:=$(hellpwd)default:$(MAKE)-C$(KERNELDIR)M=$(PWD)moduleclean:rm-rf某.o某.mod.c某.mod.o某.koendif(5)编译驱动程序:make-C/lib/module/2.6.32-generic/buildM=/root/firtdrivermodule(6)找到memdev.ko,将它装入内核immodmemdev.ko(7)创建文件节点,mknodmemdev0c880(8)编写测试程序,测试驱动文件tet.c#include<tdio.h>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);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论