- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
内核与设备驱动编程
南京大学
黄开成 101180046
2013.1.7
摘要
本次实验通过研究8253的各种工作方式以及编程控制方法,编写了驱动程序和应用程序来控制扬声器来播放了一段音乐,以及通过按键模拟琴键控制实现了交互,在实验过程中对驱动开发流程、字符设备驱动的编写、ioctl系统调用、内核空间内存分配等有了进一步的认识。
一、实验目的
1.学习linux操作系统下内核程序的编写和应用
2.学习可编程接口芯片的编程控制方法
二、实验原理
1.设备驱动程序
驱动程序是一组负责将应用程序的一些需求,如读写等操作正确无误的传递给相关硬件,并使硬件能够做出正确的反应的代码。驱动程序像是一个黑盒子,它隐藏了硬件的工作细节,应用程序只要通过一组标准化的接口,就可以实现对硬件的操作。在编写设备驱动程序一定要牢记其作用在于提供机制,即解决提供什么功能的问题,而如何使用这些功能则交给用户程序处理。设备驱动程序基本框架如下:
初始化设备模块--设备打开模块--数据读写和控制模块--设备释放,卸载模块
此外Linux下的设备驱动程序被组织成一组完成不同任务的函数集合,通过这些函数使得Linux下的设备犹如普通文件一样。应用程序可以像操作普通文件一样对硬件设备进行操作。这些函数就是open() close() read() write() ioctl()等。
open()函数
对设备特殊文件进行open()系统调用时,将调用驱动程序的open () 函数,int open(struct inode * inode ,struct file * file);其中参数inode为设备特殊文件的inode (索引结点) 结构的指针,参数file是指向这一设备的文件结构的指针。open()的主要任务是确定硬件处在就绪状态、验证次设备号的合法性、控制使用设备的进程数、根据执行情况返回状态码(0表示成功,负数表示存在错误) 等;
read()函数
当对设备特殊文件进行read()系统调用时,将调用驱动程序read()函数,void read(struct inode * inode ,struct file * file ,char * buf ,int count);参数buf是指向用户空间缓冲区的指针,由用户进程给出,count为用户进程要求读取的字节数,也由用户给出。read() 函数的功能就是从硬设备或内核内存中读取或复制count个字节到buf 指定的缓冲区中。在复制数据时要注意,驱动程序运行在内核中,而buf指定的缓冲区在用户内存区中,是不能直接在内核中访问使用的,因此,必须使用特殊的复制函数来完成复制工作。
write()函数
当设备特殊文件进行write()系统调用时,将调用驱动程序的write()函数,它的形式参数和read()一样,write()的功能是将参数buf指定的缓冲区中的count个字节内容复制到硬件或内核内存中
ioctl()函数
该函数是特殊的控制函数,可以通过它向设备传递控制信息或从设备取得状态信息,函数原型为:int ioctl(struct inode * inode ,struct file * file ,unsigned int cmd ,unsigned long arg);
参数cmd为设备驱动程序要执行的命令的代码,由用户自定义,参数arg 为相应的命令提供参数,类型可以是整型、指针等。
2、内核模块
Linux的内核模块是一段能够动态加载入内核空间运行和从内核卸载的代码,在不需要重启系统的情况下能够增加内核的功能,linux中的设备驱动程序经常以模块的形式出现,它使内核能够读取连接到系统的设备。内核模块的编写流程如下:
a.查看原理图,理解设备的工作原理(本次实验要了解8235、8255芯片原理)
b.定义主设备号和创建对应设备(注意不要与内核已有主设备号冲突,可以利用动态分配主设备号来避免)
c.设计所需要的实现的文件操作,定义file_operations结构
d.编译该设备驱动到内核或者使用insmod命令动态加载
e.编写简单应用程序测试设备驱动程序
3、8253、8255芯片原理
8253是计算机上的可编程的定时/计数器,作为系统的硬件时钟设备。8253在系统中占有40H--43H端口,43H端口为控制寄存器地址
您可能关注的文档
最近下载
- 山东省烟台市2023-2024学年高二上学期期末考试数学试卷.docx VIP
- 中国成人惊厥性癫痫持续状态诊治指南(2025版).pptx VIP
- 第5章-水环境中的界面过程(吸附)1.pptx VIP
- 基础分部验收监理评估报告.doc VIP
- IPC-2221C-EN TOC2023印制版设计通用标准 Generic Standard on Printed Board Design.pdf VIP
- 交管12123学法减分题库(含答案).docx VIP
- 企业移出经营异常名录申请表.pdf VIP
- 龙门架及井架物料提升机安全技术规范.docx VIP
- 2025年交管12123学法减分考试题库500题(含答案).pdf VIP
- 众海智能ZH6751消防控制室图形显示装置使用说明书.pdf
原创力文档


文档评论(0)