linux内核编程实验报告7

linux内核编程实验报告7

ID:27997699

大小:162.10 KB

页数:12页

时间:2018-12-07

linux内核编程实验报告7_第1页
linux内核编程实验报告7_第2页
linux内核编程实验报告7_第3页
linux内核编程实验报告7_第4页
linux内核编程实验报告7_第5页
资源描述:

《linux内核编程实验报告7》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、Linux内核分析实验报告实验题目:字符设备驱动程序实验实验目的:学习设备驱动程序的组织,为一个虚拟设备FIFO队列(编写自己的设备驱动程序)。境境骤一环环步件件验硬软实:内存1G以上:Linux(Ubuntu)2-6:实验原理:启动一个进程,向设备的缓冲区中写入数据。其中设置了两种锁,互斥锁与同步锁。设备的结构体声明如下:structscull_dev{chardata[SCULL_DATA_SIZE];/*缓冲区队列structsemaphoresem;互斥锁structsemaphores

2、em_read;读同步锁structsemaphoresem_write;写同步锁structcdevcdev;/*字符设备结构*/Ioff_tptr_write;读进程的指针Ioff_tptr_read;写进程的指针};如果读进程进入字符队列读,则挂在读同步锁上等待,知道有写进程的执行完毕唤醒这些进程,同样,如果过多的进程进入队列中写,则缓冲区写完后,剩下的写进程会在写等待队列上等待,直到有读进程唤醒写进程。以上实现了同步于互斥。FIFO机制的实现,主要依赖于Ioff_tptr_write和I

3、off_tptr.read两个指针,每次写完数据,指针变化力dev->ptr_write=(dev->ptr_write+count)/SCULL_DATA_SIZE循环右移,同理读指针也是。因为与锁配合使用,所以不会发生数据的覆盖,因此很好地实现了数据的完整,也实现了FIFO机制。二:主要数据结构说明:(1)file_operations:函数简介:file_operations结构(指向它的指针常用fops表示)中包含了一组函数指针(方法),主要用来实现系统调用,例如open,read等等。

4、每个打开的文件和一组函数关联。对于特定设备屮不支持的操作,该结构屮对应指针可置力NULL。一种标准化的结构初始化方法可以不编写NULL字段,仅声明设备可支持操作的函数名。例如对于只读设备可以声明为:structfile_operationsmy_fops={.owner=THIS_MODULE,.open=my_open,.read=my_read,.release=my_release,(2)file函数说明:file结构(指向它的指针常用filp表示)代表一个打开的文件(注意它与用户空间中的

5、FILE结构无任何关联),每执行一次open就建立一个(并传递给所有fops中声明了的操作函数),直到所有打开的文件都关闭。(3)inode在内核中包含了一个文件大量的内部信息,多个filp可以同时指向单一的一个inode。对于字符没备驱动主要关注的两个字段:structinodefdev_ti_rdev;//设备号structcdev*i_cdev;//structcdev是字符设备内部结构,当某类字符设备有多个//子设备时i_cdev是队列中的头指针。三:函数说明:1ssize_tsculL

6、write(structfile*fiIp,constchar—user*buf,size_tcount,Ioff一t*f_pos)主要功能:写进程写入字符串时,首先中请锁sem.write,如果能够中请,再申请互斥锁sem,如果能申请到,则实现以下过程:得到设备的写指针,然后更新写指针。接着把设备缓冲区的数据拷贝到用户态。释放互斥锁,唤醒读进程。ssizetscullwrite(structfile*filpfconstchar_user*buffsize_tcount,lofftpos){p

7、rintk("writeM);structsculldev*dev=filp->privatedata;ssizetretval=-ENOMEM;/*valueusedin"gotoout"statements*///@2if(downinterruptible(&dev->semwrite))//同步return-ERESTARTSYS;if(downinterruptible(&dev->sem))"互斥return-ERESTARTSYS;/*/对文件指针的操作/*/

8、*fpos=sc

9、ullllseek(filp,dev->ptrwrite,SEEKSET);dev->ptrwrite=(dev->ptrwrite+count)/SCULLDATASIZE;if(copyfromuser(dev->data+*fposrbuf,count)){retval/:-EFAULT;gotoout;}retval=count;//@3out:up(&dev->sem):up(&dev->semread);returnretval;}ssize_tscull_read(structfi

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。