que15操作系统课程设计_第1页
que15操作系统课程设计_第2页
que15操作系统课程设计_第3页
que15操作系统课程设计_第4页
que15操作系统课程设计_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课程设计说明课程名称 操作系统课程设 业:物联网工 班级 2012级2设计人 2012010519102015116一、课程设计题目:Linux 5、Linux六、命题发出日期: LK 模块的编译、添加和撤 XXXXX XXXXX XXX XXXXX XXXXX XXXXX XXXXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXXXX 19XXXXX 19XXXXX 20XXXXX 30XXXXXXX 30XXXXX 30XXXXX 31XXXXX 31XXXXXX 311、通过……,了解…,理解21、2、3、设计说明(含系统框图和(或)主要算法的流程图运行结果及分总procCMOS1LKM2Linuxmycat,了解proc3LKM模块,并对比,更深刻地理解内核模块编程,1、在Linux中有一个应用非常广泛令:cat,它的作用很多,其中一个是2mycat.c代码的编辑,文件保存后,可以按着文件头部注释中说明的方法进行编译,$gccmycat.c-o文件编译成功后,按着文件中说明的方法运行$./mycat<filename>可以是mycat.cpp或其他文件的名称请观察命令运3、对照代码、结合操作系统课程内容、以及图2.1,4、运行本节命令,5、代码编辑完成后,请保存为cmos.c。然后在相同文件夹下编辑Makefile文件,内容如下:Makefile保存后,在同一 下运行make;如果报错,请根据错误提示修改;如果一切顺利,那么就生成了cmos.ko文件,可以使用ls命令查看。这表示初步的编译已经通过了。确认cmos.ko生成后,可以通过如下命令来添加该LKM模块:$sunsmodcmos内核源文件,Makfile6、添加、撤销cmos.ko内核模块,并使用cat、mycat应用程序进试1$cat/pro$cat$cat$cat$cat$cat$cat$cat2、完成如下代码的撰写,mycat.c#include<fcntl.h>//foropen()#include<stdio.h>//forperror()#include<unistd.h>//forread(),write(),close()intmain(intargc,char*argv[]){inti,fd,ch;//declarelocalvariablesfor(i=1;i<argc;i++){fd=open(argv[i],O_RDONLYif(fd<0){perror(argv[i]);continue;}while(read(fd,&ch,1)==1)write(STDOUT_FILENO,&ch,1);close(fd);}}文件保存后,可以按着文件头部注释中说明的方法进行编译,$gccmycat.c-o文件编译成功后,按着文件中说明的方法运行$./mycat<filename>mycat.cpp3运行本节命令,查看输出结果$cat/prouinfo-CPU的信息(型号,家族,缓存大小等)$cat/proc/modules-$cat/proc/meminfo-$cat/proc/iomemIO$cat/proc/self/maps-进程cat实际的进程空间分$cat/proc/devices-$cat/proc/filesystems-$cat/proc/version-4、代码编辑完成后,cmos.c。然后在相同文件夹下编辑obj-m:=cmos.oKDIR:=/lib/modules/$(suname-r)/buildPWD:=$(spwd)$(MAKE)-C$(KDIR)SUBDIRS=$(PWD)rm-r-f.tmp_versions*.mod.c.*.cmd*.oMakefile保存后,在同一 下运行make;如果报错,请根据错误提示修改;如果一切顺利,那么就生成了cmos.ko文件,可以使用ls命令查看这表示初步的编译已经通过了确认cmos.ko生成后,可以通过如下命令来添加该LKM模块:$sunsmod 下查看是否生成了cmos伪文件,也可以使用dmesg来查看内核日志中的模块添加信息一切顺利没有问题,我们可以运行如下命令来RTC信息了:$cat/proc/cmos你的显示器上的输出结果是什么?是不是RTC信息不断的在刷屏?按<Ctrl>+C组合键,可以停止刷屏。查看我们的cmos.c内核源文件,可以确认我们确实是只想输出一次RTC信息啊,但为什么一直在不断的输出呢?现在再尝试使用我们自己开发的mycat应用程序来查看RTC输出:$./mycat5、“新内核新特性:ubuntu14.04LTSproc特性”删除了老内核环境支持的多个版本的procLinuxproc_create,其函数原型为staticinlinestructproc_dir_entry*proc_create(constchar*name,umode_tmode,structproc_dir_entry*parent,conststructfile_operations*proc_fops){returnproc_create_data(name,mode,parent,proc_fops,}该函数是一个内联函数(inline),proc_creat_dataproc_creat-data的原型如下externstructproc_dir_entry*proc_create_donstchar*,umode_t,structproc_dir_entry*,conststructfile_operations*,void*);所以严格的说,在版本的Linux内核中,proc伪文件事实上只有一新版本的Linux内核删除了在ubuntu12.04LTS(Linux3.2.0内核)经常proc,ubuntu12.04LTS中我们使用一个proc自定义的读函数就可以正确的读出相关信息了。为此,在新版本Linuxprocseq_file机制绑定在一起了。也就是说,在Linux新版本的内核中proc伪文件的读写等操作都是根据seq_file机制来进行的。运行结果及分1、$cat/pro$cat$cat$cat$cat$cat$cat$cat2、$sunsmod3、尝试使用自己开发的mycat应用程序来查看RTC$./mycat总/proc伪文件系统提供了一个基于文件形式的Linux接口。它可些状态往往都是处于内核空间的,对程序员来说是作系统隔绝开的。通过本次设计,我们可以看到为了解决应用程序与内核数据的问题,也即我们不可能让一个类似于cat的应用程序直接去读CMOS中的RTC信息,我们添加了一个cmos.ko内核模块,该模块创建了一个名为cmosproc伪文件,CMOS中RTC信息了。当用户程序,比如cat,要打开/proc/cmos伪文件或/proc/cmos的信息时,cat程序中的标准库函数把相应的操作参数传递给操作系统内核对应的LKM模块,也即我们编写的cmos.ko,由cmos.ko调用相应的内核操作函数打开该设备或者相关信息,然后把操作结果返1、通过使用seq-file机制proc进程信息,了解seq_file机制,理解Linux重要的内核数据结构task_struct;2seq_fileproc伪文件,Linux内核数据结构task_struct,也就是进程控制块PCB(ProcessControlBlock)的信息1、了解seq_file2、实现procseq_file/proklist的信4、重新编辑编辑代码并运试新的tasklist模块,并用mycat和cat命1、编辑tasklist.c内核代码,添加到当前内核中运行,并且通过mycat和cat命令查看/proklistproc伪文件与seq_fileproctasklistpid在my_proc_entryproc_create(modname0,NULL,&my_proc);了参数&my_procproctasklist的操作函数,它的具体staticconststructfile_operationsmy_proc{.owner= = = =.release=其中my_open函数是自己写的,但是只有一句就是调用seq_open函数。seq_open通常在打开文件的时候使用;seq_read,seq_lseek和seq_releaseread,llseekrelease,由头文件seq_file.h定义,在seq_file.c中实现。2、查看/proklist的信息,观察这些进程处于什么状态3、重新编辑代码并运试新的tasklist模块,并用mycat和cat命令分1是否存在差异,并分析。运行结果及分11procseq_file机制是这样绑定在一起的文件级别的操作绑定。proc在创建后,seq_file机制支持的打开、读、写(seq_open、seq_read、seq_write)等函数进行文件级别的操作;工作,那么我们就需要自己重写这些函数,这些函数都需要在file_operations结构体中,并在proc文件创建时作为参数传递进去,即proc_create中seq_file对象时需要完成我们自己的工作,那么就需要定义我们自己的遍历操作函数,即:startnextstopshow四个函数,并且把相关的操作函数放在seq_operations结构体中,这个结构体需要作为参数在proc伪文件打开时传递进去,即seq_open的第二22通过重写cmos内核代码,让其不再刷屏,mycat函数能够运33两次运行./mycat/proklist显示不一样1中,读一次相当于调用上面的四个函数,之前自己写的procread065,所总在使用seq-file机制proc进程信息的设计中通过创建一个内核模块,利用proc伪文件系统以及seq_file机制,我学会了怎样去查看进程的信息。在这其中比较困惑的是proc怎样和seq_file机制绑定在一起的。概括来说,procseq_open、seq_read、seq_write等函数来进行操作,所以创建proc文件时要在proc_create中传入需要使用的file_operations作为参数,其中的操作函数可以自己重新定义。在遍历proc文件中的每个记录时需要使用seq_operations中指定的四个操作函数(必须指定,而且也只有四个):start、show、nextstop,这个结构体需要在打procseq_open,在本章实验中我们遍历进程Linux进程控制块结构task_struct时其实使用的是task_struct链表自带的遍历机制,比如宏定义next_task、初始位置init_task等。1、通过POSIX多线程创建,了解基于POSIX多线程编程下加锁和不加锁两种情况的区别,理解并掌握POSIX多线程环境下利用同步机制解决2、通过Linux多线程创建,了解基于Linux多线程编程下加锁和不加锁两种情况的区别,理解并掌握Linux多线程环境下利用同步机制解决多1、掌握基于POSIX会IEEE开发的标准族,部分已经被ISO接受为国际标准。IEEEStd.1003.1-1990或POSIX.1为操作系统的服务例程提供了源代码级别的C2、掌握基于Linux虽然Linux支持POSIXLinux也有自己一套用于基于POSIX多线程编1、基于POSIX在主线创建一个新的线程,完成一个从1到UPPER(指定的累加2、基于POSIX在主线创建两个新线程,合作完成一个从1到UPPER(指定的累3、基于POSIX常见的机制是同步机制。在主线创建两个新线程,使用基于互斥锁的1PE(指定的累加次数上限总的累加次数不变。基于Linux多线程编1、基于Linux定次数的累加工作,指定累加次数为upper。也就是说最终累加结果为:2、基于Linux多线程编程:TestAndSet在主线创建四个新的进程,分别使用临界区模型完成对一个共享变量counterupper。3、基于Linux线程主动放弃CPU。intnanospleep(conststructtimespec*req,structtimespec一行则是用于说明使用的tsStruct结构体timespecStructtime_ttv_sec;/*seconds秒Longinttv_nsec;/*nanoseconds纳秒}nanosleep函数功能是暂停某个线程直到规定的时间后恢复,参数seq就是要暂停的时间其中req->tv_sec是以秒为单位而tv_nsec以纳秒为单位,范围是[0, ]。由于调用nanosleep是使用线程进入TASK_RUNNING状态,这就意味着有可能会没有等到规定的时间就因为其它信号而被唤醒,此时函数返回-1,且还剩余的时间会被记录在rem中,当然是在rem不为空的情况下。运行结果及分12345、TestAndSet6总本次多线程环境下的竞争条件与同步机制设计对Linux支持的线程创建机制进行了一个简单的对比分析。其中pthread函数库支持用户级的线自旋锁spinlock、信号量semaphore等,这些机制都在Linux内核中得到了支持。而Linux通过clone函数支持内核级的线程创建,创建的线程由 1、通过对进程控制块task_struct中的mm_struct变量mm的操作,了以及引入的动态库等。2、通过mm中的vm_struct变量mmap的操作,了解每个段的运行情1mm.cMakefile21mm.cMakefile从逻辑地址到物理地址的过图5.1是Operatingsystemconcepts中的一个关于内存地址的基本示意图。它说明了在In IA32结构中从逻辑地址到物理地址的过程。逻辑地址可以看做是CPU发出的地址,从某种程度上讲野可以看做

pagingpaging图 两线程使用互斥锁同步完成一个计数工从逻辑地址到线性地址空间的过程见图。图5.2中断寄存器中的RPL。段寄存

16位16位段基地址以及段的5.2从逻辑地址到线性地址(虚拟地址)5.2·CPUselector:offset”32·根据选择符中的索引值、TI及RPL值,再根据相应描述符表中的段地址将描述符中的32位段址和放在ESIEDI等中的32位有效地址相加,3200

page页图5.3 页Linux线性空间在32位平台上为4GB的固定大小linux内核将这4G字节的空间分为两部分。内核使用最高的1G字节(从虚地址0xC 0xFFFFFFFF,地址0x 到0xBFFFFFFF)则由各个进程使用,称为“用户空间。(0~3G,在系统启动时,Linux0x开始的地方,即1MB开始区间前面1M空间留做他用。Linux内核映像应该在虚拟0xC,这样内核映像在内核空间的实际起始地址是0xC.而在从虚拟地址到实际物理地址时,内核空间 )开始。由此可见,内核时相对反之,给定一个物理地址Y,则其对应的虚地址为“Y+PAGE_OFFSET其中栈空间自顶向下增长,而堆空间则自下而上增长。在堆和栈之间形成的空洞(holes)则可以放入动态文件。尽管每个用户进程可以拥有3GB的用户空间,但这是虚拟地址空间,用户在这个虚拟内存中并不能真正运行,必须把用户空间中的虚地址最终到实际的物理空间才行,而这种的建立和管理则是由我们上一节上述的段机制和页机制完成的。Linux一个虚存区域是虚存空间

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论