版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
操作系统课程设计
实验报告册班级: 学号: *教师: 实验说明重要提示实验1 系统调用实验2 核模块实验3 文件系统实验4 设备管理实验说明.实验做为学习的重要促进手段,是为了深化对理论的理解,锻炼实践动手能力。.实验同时也作为考核的手段。.实验容会在课程进行中下达,并且会分次地、部分地被抽查。.课程结束时,要求把所有的实验整理成一个完整的电子文档并上交,做为最后成绩的评定依据。.如果有兴趣的合适的题目,也可自己选题目。格式说明.本文档文件名命名为“学号-”,如“13071000_小王”。.留白部分不足的自己调整长度,也可加页(增加容应在表格)。.每次的实验报告都要在这个文件中(按照实验次序依次)增加,而不是每次一个新的word文件。.本文档保存为doc格式(请勿用Word2007的docx格式)。重要提示:.实验正文建议使用小四号或五号宋体。.若附加图形,则请直接嵌入到实验手册相应位置。.各实验的源程序,请按实验分目录存放,如第一个实验的源程序存放在目录12公下,第二个实验的源程序存放在目录1262下等等,依次类推。可互相讨论,但严禁抄袭网络或同学的实验结果。
实验目的为Linux核增加一个系统调用,并编写用户进程的程序来测试要求该系统调用能够完成以下功能:.该系统调用有1个切1型参数,返回值为int。.若参数为偶数,则输出自己学号后四位.若参数为奇数,则输出自己学号的后五位实验容.系统调用的实现.增加系统调用.Linux核的构建报告容要求(1)实现方法和思路(2)测试及结果实验编号1题目系统调用报告正文要给linux增加系统调用,可以用修改核源码并重新编译的方法实现一:基本过程是.在系统调用表文件中给要增加的一个系统调用的名字.在系统调用号文件中给要新增的系统调用分配一个系统调用号.增加系统调用声明.添加系统调用的实现.重新编译核.编写测试驱动函数,测试系统调用是否添加成功一:在系统调用表文件中增加系统调用的名字.longs/s_rt_tgsigqueueinfo/*335*/.longsysperfeventapen.lonqsvsmvcaTl二:在系统调用号文件中给要新增的系统调用分配一个系统调用号^define_NR._pipe2331^define_NR._inotify_initl332(■define_NR._preadv333f-define_NR._pwrit&v334J-define_NR._rt_tgsigqueueinfa335define_NR._perf_eventopen336^defineNRiihycaU337三:增加系统调用声明asmlinkagelongsysperfeventopen(structperf_event_attr_user珀tt「一upt「,pid_tpid,intcpurintgraup/d,unsignedlongflag5)asmlinkagelongsys_mmappgoff(unsignedlongaddrrursignedlonglenrursignedlongprot,unsignedlongflags,unsignedlongfdFunsignedlongpgoff);asmlinkagelongsysmycallfintnum];四:添加系统调用的实现要为linux核增加系统调用,首先必须要实现系统的核调用也就是提供功能的一个函数根据题目要求,当给改系统调用传递int参数为奇数时输出自己学号的后五位,当系统调用接受的参数为偶数时,输出自己学号的后四位所以,系统调用的实现如下可以看到系统调用的实现同基本的C语言没多大差别,只是能使用的库不一样在linux核中的代码不能使用标准C库,只能使用核提供的库所以能调用的函数会有不同最后实现代码如下returnret;}asmlinkagelorgsys_mycall(intnum}{if(num2==fllprintlk(,l2257,1);elseprintlk("12257");returnrum;)当参数num为偶数时输出2257也就是学号的后四位当参数为奇数时输出12257也就是学号的后四位可以看到输出函数式printk而不是printf,因为在核中不能使用标准C函数五:编译核六:测试系统调用测试驱动函数如下#include<stdio.h>#include<stdlib.h>Lntmain[voL1)(printf(・%d\n\syscall(337r5});return0;测试输出如下由于在系统调用实现时忘记在末尾加换行符了。。所以输出的两个是在一行的也就是2257和12257,但是可以看到系统调用时实现了的。实验目的.学习linux核模块的编写及加载的方法.理解linux核模块的机制实验容.编写linux核模块并测试.编写可以带参数的linux核模块并测试.使用核模块的方法为linux增加系统调用1、用核模块的方法完成实验1的报告容要求(1)实现方法和思路(2)测试及结果实验编号2题目核模块报告正文实验容:编写一个核模块;编译该模块;加载、卸载该模块;实验步骤:新建模块目录用编辑器(vi)编辑源文件Stnclude<linux/tnit*h>#tnclude<1tnux./moduleih>#include^linux/kernel*statictrbthell&tntt(void){prtntkCHelloworld\n");return0;]staticvoidhelloexitfvoid){prlritkC1Hellomoduleextt\n,p)B)nodule_intt(hello_init);n&dule_ex:tt(helLB_extt);— 一M0DULE_LICEN5E("GPL,r);MODULE_AUTHOR("xtanb");MODULEZDESCRIPTION(,,hello,r);-分析:模块入口函数为hello_init(),由module_init()宏指定,在模块被加载的时候被调用向系统注册。入口函数的返回值:0表示成功,非0表示失败。模块的退出函数为hello_exit(),由module_exit()宏指定,在模块被卸载时被调用向系统注销,主要来完成资源的清理工作。它被调用完毕后,就模块就被核清除了。一个模块最少需要有入口和退出函数。2.4核后,引入识别代码是否在GPL许可下发布的机制。在使用非公开的源代码产品时会得到警告。通过宏MODULE_LICENSE(“GPL”),设置模块遵守GPL证书,取消警告信息。宏MODULE_DESCRIPTION()用来描述模块的用途。宏MODULE_AUTHOR()用来声明模块的作者。宏MODULE_SUPPORTED_DEVICE()声明模块支持的设备。这些宏都在头文件linux/module.h定义,使用这些宏只是用来提供识别信息。用编辑器编辑Makefileobj-m:=heltonoduletoKERNELDIR:=/Tib/moduleE/3.11.6-26-generiH/buildpmd:=$(shellpwd)nodules:S 写(HAKE)-CS(KERMFLDIR)M=$(PHD)nodulesGFiQdules_install;$(MAKE)-CS(KERMELDIR)M-$(PWD)modules_install一clean:rm-rf*.acore,depend,end*.ko*.nod,c.tmp_ixersion£编译模块
^include^Itnux/init.h>#include<linux/module^h^ffinclude^linux/Fioduleparan*^include<ltnux/kernel.h^>MODULE_LICENSE();staticchar*who= ;statictnttimes=;module_paraFi(times,tnt,SIRUSR);module_paran(who,chdrp,S_IRUSR);statictnthello_init(votd){tntt;for(i=;L♦ttnes;itt)prtntk(%d ,i,who);return:}staticvoidhelLoextt(void){printk( %5fwho);}module-lnitthelLO-init);module_extt(helLo_extt);传入参数「00t@)clmnb:/h0rqei/Kianb/Ho『kSpmce7lopei「dting_svsteiTi/d£signirig/rn0dulei£_panaiTi#insmdp日「己m七巴5七*k口who=Kidnbtimes=3,输出结果[14256.529661][14273.961773][14522.939790][14522.939797]HelloworldHellomoduleexit(0)hello,xidnb!(1)hello,xtanbl[14256.529661][14273.961773][14522.939790][14522.939797]容二..用核模块的方式为系统添加一个系统调用为Linux核增加一个系统调用,并编写用户进程的程序来测试。要求该系统调用够完成以下功能:.该系统调用有1个int型参数,返回值为int。.若参数为偶数,则输出自己学号后四位.若参数为奇数,则输出自己学号的后五位基本思路就是通过修改系统调用参数表所在的存地址并加入系统调用即可实验编号3题目文件系统实验目的.了解/proc文件系统.掌握修改/proc文件系统的方法.利用/proc与核交互创建以及使用/proc文件实验容1.利用/proc与核交互2、利用核模块方法创建/proc文件报告容要求(1)(2)实现方法和思路测试及结果报告正文实验一:本实验只使用标准C函数进行修改/proc文件也就是说直接readwrite/proc里的文件从而达到与核交互的目的代码如下^include<stdio.ti>/include<stdlib.h>#include<sys/stat.h>intmainfintargc,char**argv}dFILE*fp=fopen(argv[1]r"w"l"if(fp==NULL]1printf("Errorwhileopenfilehostna(ne\n");}char串buf =argv[1];// chmiodf7prQC/sys/kernel/hostnameMF777);// intlen= fwritef"bbb"r 1, 3r fp);L6fseekffp,0F SEEK SET);fprintf(fp, argv[2]];// if(lenV= 0)〃 printf("Errorwhilewritefilehostna(ne\n,1);return0;}输出结果xianb(axiarb:-/proc_fs/praltcat/proc/sirs/kernel/hostnametxb "xianb(axiarb:-/proc_fs/prolj|可以看到实现了功能完成了hostname文件的修改xianbtaxianb:-/proc_fs/prol$tiostnametxb容二:通过核的/proc编程接口进行/proc文件的操作本试验通过构造可加载核模块,通过核的/proc编程接口进行/proc文件的操作需要用到的基本函数有structproc_dir_entry*create_proc_entry(constchar*name,mode_tmode,structproc_dir_entry*parent)这个函数创建一个/proc文件structproc_dir_entry*create_proc_read_entry(constchar*name,mode_tmodestructproc_dir_entry*base,read_proc_t*read_proc,void*data)这个函数创建一个/proc的只读文件structproc_dir_entry*proc_mkdir(constchar*name,structproc_dir_entry*parent)这个函数创建一个/proc目录删除节点(文件或者目录)remove_proc_entry()voidremove_proc_entry(constchar*name,structproc_dir_entry*parent)该函数将删除一个proc节点(按文件名删除)以上函数只能创建一个文件,要想使创建的文件发挥作用,还有两个域的值需要填写,它们是read_proc和write_proc。该两个函数都是回调函数,当对文件进行读写时,系统会自动调用相应的回调函数。可以使用write_proc函数向/proc中写入一项。这个函数的原型如下int(*write_proc)(structfile*file,constchar*buffer,unsignedlongcountvoid*data)file参数实际上是一个打开文件结构(我们可以忽略这个参数)。buffer参数是传递给您的字符串数据。缓冲区地址实际上是一个用户空间的缓冲区,因此我们不能直接读取它。count参数定义了在buff中有多少数据要被写入。data参数是一个指向私有数据的指针可以使用read_proc函数从一个/proc项中读取数据(从核空间到用户空间)。这个函数的原型如下:int(*read_proc)(char*page,char**start,off_toff,intcount,int*eof,void*data)page参数是这些数据写入到的位置,其中count定义了可以写入的最大字符数。在返回多页数据(通常一页是4KB)时,我们需要使用start和off参数。当所有数据全部写入之后,就需要设置eof(文件结束参数)。与write类似,data表示的也是私有数据。此处提供的page缓冲区在核空间中。实验代码如下~.yinclude<Linux/rTiOduLe.h>#inelude<liniJi/kernel.h>#include<linLK/pracfs.h>#include<linLM/sched.hs-#include<\lmjx/uaccess.defineSTRTNGLEN1024charglot)aI_buffer[striN6LEN]:structproc_dir_entry4exainplE_dirF4helln_file,,current_file,*symlink;IS 一一 一 一 一intproc_read_current(char-'page,char**starthDf__tintcount』int*eQftWDid+data)<intlen;trymoduleget[THISMODULE);Ten=sprintTtpsrje,"countprocessusages:\nna»e:\npid:^d\n'r(urrent-xjow.,current;UtOdule_pUt(TH15_MQDULEHreturn-len;1intprac_read_hello|char char**start,off_toff,intcountrint=€口1,void*dats)Iintlen;trymodule get [THIS HODULE);len=sprintf(page,"xianbr.essage:^s\nwrite:^s\n"rcurrent->conrirglobalbuffer);moduleput〔「115 阳口ULE);returnlen;)intproc_writehello(structfile+file,constclhar=buf,unsignedlangcount,vdlg=datalIintlen;try_module_get(THISHODULE);ificount三STRIN6LEN>{len=STRINGLEN-1;)else(len=count;Jlemcount;38 }39copyfro» r(global_buffer,bufjlen)j41 globalbuffer[len]=T\81;42 nodule-put(THISMODULE)j43 returnlem;44}4546staticintinit{void}47{4a exampledir二procmkdir[F,proc1312125711.null1;currentfile=createprocreadentryC'tang^^e&66hexampledir,procreadcurrentsNULL);hell.a_file-c:reate_proc_entry("xianlb"F6844.example_dir];51 strcpy(global_bufferFr,xianbr,);52 hello_file->read_proc=proc_read_heUo;heH.o_file-write_proc=p「<K_“「近E_hEllo;:54 一 一 —一55 symlink=proc_syiT.ink("tang_tooB.exanple_dir^"tang"!;56 return明37}5S59italicvoidcleanup(voidJ69(61 remave_proc_entryftang_tDQM,example_dLr);62reiftave_proc:2entry("tang",exdnpledlrT;63 ruiM廿g「preic:「电intryCKlmnbi,exampledlr)j6A reiftavepracentry(■pracl_t,NULL);65)6667module_init(init);G8Jodule_e?(it(cleanup);可以看到代码创建一个/proc13121257的目录并且创建两个文件以及一个link文件结果如下r<»t@txb:/proc/proc13121257#lltotal9dr-)cr-xr-)c2rootrootQ2014-12-0304:09dr-)cr-xr-)c153rootroot02014-12-0303:42--/-rw-e-rw-1rootroot02014-12-0304:09tangLntfxntfxntfx1rootroot42014-12-0304:05tangtoo->tang-rw-r--r--1rootroot02014-12-0304:09xianb若对文件进行读写操作则如下显示root@txb:/pror/proc13121257#cattangcountprocessusages:name:cat□id:2831raotfatxb:/proc/pracl312L257#echo33>xianbroot@txb:/proc/procL3121257#catxianbxianbmessage:catwrite:33实验编号4题目设备管理实验目的了解linux设备文件了解linux设备驱动程序的编写实验容1.实现一个linux字符设备驱动文件报告容要求(1)实现方法和思路(2)测试及结果报告正文.首先了解1瓶抽设备驱动文件的基本数据结构核设备驱动程序表结构(infs/devices.c)structdevice_struct{constchar*name;//devicenamestructfile_operations*fops;);字符设备驱动程序的基本操作和数据结构.字符设备驱动程序:设备表:全局数组chrdevs[255],主设备号是它的下标登记:register_chrdev()/unregister_chrdev()缺省操作集合:file_ops:def_chr_fops,仅定义了open方法;inode_ops: chrdev_inode_operations,仅定义了其中的file_operation=&def_chr_fops.三:关键代码intirit_modijle0printk{-hello13—yr);//if(regi5ter_chrdev(60rDEVICENAHE,6rwbuf_fop-5))if(register_chrdev(60rDEVICENAHE,6rwbijf_fop-5))printk("registererror\nN);rettrr-lj)prirtkf1register口k\rT);rettrnQj)voidcledrupmodule(J<"unregisterchrdev(60rDEVICENAME);prirtkftrreg□k\r,ll;prirtkfbye13121257\nB);returr;实现了驱动程序的初始化以及退出清理函数在初始化中用register_chrdev函数进行注册在退出中用unregister_chrdev函数进行清理2.关键的字符设备驱动程序的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 15091.2-2026加工食品基本术语和分类第2部分:加工食品分类
- 2026年冀中职业学院单招职业倾向性测试题库附参考答案详解(典型题)
- 2026年南京旅游职业学院单招综合素质考试题库附答案详解(达标题)
- 2026年北海职业学院单招职业适应性测试题库带答案详解(研优卷)
- 2026年内蒙古科技职业学院单招综合素质考试题库含答案详解(轻巧夺冠)
- 2026年兰州石化职业技术大学单招职业倾向性考试题库带答案详解(a卷)
- 2026年冀中职业学院单招职业适应性测试题库带答案详解(a卷)
- 2026年兰考三农职业学院单招职业技能测试题库附参考答案详解(综合卷)
- 2026年华东政法大学单招职业适应性测试题库附答案详解(精练)
- 2026年兰考三农职业学院单招职业适应性考试题库带答案详解(模拟题)
- 现在完成时复习课课件+2025-2026学年外研版八年级英语下册
- 2025至2030中国智能语音助手用户接受度与隐私保护研究报告
- 大疆社招在线测评题目
- 齐成控股集团招聘笔试题库2026
- 菏泽医专综评试题及答案
- 2026年交管12123驾照学法减分题库(考试直接用)
- 国企投融资课件
- 配送管理实务说课
- 全国项目管理标准体系建设指南(2025版)
- 三级安全培训再教育课件
- 电子物料基础知识培训课件
评论
0/150
提交评论