- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
一
1. 如何编写一个 LINUX驱动?
2. Linux 设备中字符设备与块设备有什么主要的区别?请分别列举一些实际的设备说出它们是
属于哪一类设备。
字符设备:字符设备是个能够像字节流(类似文件)一样被访问的设备,由字符设备驱动程序
来实现这种特性。字符设备驱动程序通常至少实现 open,close,read 和 write 系统调用。字符终端、
串口、鼠标、键盘、摄像头、声卡和显卡等就是典型的字符设备。
块设备:和字符设备类似,块设备也是通过 /dev 目录下的文件系统节点来访问。块设备上能
够容纳文件系统,如: u 盘, SD卡,磁盘等。
字符设备和块设备的区别仅仅在于内核内部管理数据的方式,也就是内核及驱动程序之间的软
件接口,而这些不同对用户来讲是透明的。
3. 查看驱动模块中打印信息应该使用什么命令?如何查看内核中已有的字符设备的信息?如何
查看正在使用的有哪些中断号?
1) 查看驱动模块中打印信息的命令: dmesg
2) 查看字符设备信息可以用 lsmod 和 modprobe,lsmod 可以查看模块的依赖关系, modprobe
在加载模块时会加载其他依赖的模块。
3 )显示当前使用的中断号 cat/proc/interrupt
4. 请简述主设备号和次设备号的用途。如果执行 mknodchartestc464 ,创建 chartest
使用的是那一类设备驱动程序。
1)主设备号:主设备号标识设备对应的驱动程序。虽然现代的 linux 内核允许多个驱动程序共
享主设备号,但我们看待的大多数设备仍然按照“一个主设备对应一个驱动程序”的原则组织。
次设备号:次设备号由内核使用,用于正确确定设备文件所指的设备。依赖于驱动程序的编写
方式,我们可以通过次设备号获得一个指向内核设备的直接指针,也可将此设备号当作设备本地数组
的索引。
2 )chartest 由驱动程序 4 管理,该文件所指的设备是 64 号设备。(感觉类似于串口终端或者
字符设备终端)。
5. 设备驱动程序中如何注册一个字符设备?分别解释一下它的几个参数的含义。
注册一个字符设备驱动有两种方法:
1)voidcdev_init(structcdev*cdev,structfile_operations*fops)
该注册函数可以将 cdev 结构嵌入到自己的设备特定的结构中。 cdev 是一个指向结构体 cdev
的指针,而 fops 是指向一个类似于 file_operations 结构(可以是 file_operations 结构,但不
限于该结构)的指针 .
页脚内容 1
一
2 )
intregister_chrdev(unsignedintmajor,constchar*namem,structfile)operations*fopen);
该注册函数是早期的注册函数, major 是设备的主设备号, name是驱动程序的名称, 而 fops
是默认的 file_operations 结构(这是只限于 file_operations 结构)。
6. 请简述中断于 DMA的区别。 Linux 设备驱动程序中,使用哪个函数注册和注销中断处理程序?
1)MDA不需 CPU参与而中断是需要 CPU参与的。
2 )中断注册函数和中断注销函数
注册中断:
intrequest_irq(unsignedintirq,irqreturn_t(*handler)(int,void*,structpt_regs*),unsi
gnedlongflags,constchar*dev_name,void*dev_id);
注销中断;
Voidfree_irq(unsignedintirq,void*dev_id);
文档评论(0)