- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
linux驱动原理
linux 内核配置工具
make config(命令行) make menuconfig(菜单) make xconfig(图形)
linux 内核的三种配置方式
y 直接编译进内核 n(不变编译) M(编译成模块)
3、 内核的配置选择保存在内核源码根目录的隐藏文件 .config中
4、 内核配置系统的三个组成
Makefile(编译命令) Kconfig(生成配置菜单) 配置工具
5、 驱动程序的作用是提供访问设备的能力,而具体控制设备是由应用程序去实现。
6、 用户态:应用程序工作时的状态
内核态:内核工作时的状态,可访问硬件资源,内核态与用户态数据传输需用函数API:copy_to_user copy_from_user 7、 linux 内核加载驱动的两种方式:静态编译和动态链接(insmod)
8、 linux 设备分类:字符设备、块设备、网络设备
9、 linux 驱动程序没有main函数,驱动程序为内核的一部分,运行时常驻内存 10、 内核注册设备的顺序:
a 申请设备号
b)注册设备
c)创建设备文件节点 11、 注销设备顺序
a 删除设备文件节点
b)注销设备
c)注销设备号 12、注册字符设备函数 regster_chrdev major,dev_name,ops ;
a) major: 向内核申请的主设备号
major 0 申请的具体设备号 :返回0 则成功
major 0(让内核自动分配设备号):返回 0 则成功
dev_name: 设备名称 保存在 /proc/devices里面
设备文件名 是程序device_create 函数或者 mknod命令 申请
设备文件节点时创建的文件,保存在/dev/目录内 13、linux 模块编译步骤:
A) 把驱动源码拷贝到内核文件的 driver/char/内
B) 修改Kconfig 添加编译模块
C) 修改Makefile 添加编译命令
D) 返回至内核源码根目录 执行 make menuconfig 把编译模块设置为M
E) make modules
1、 系统中可以随机访问(不需要按顺序)访问固定大小数据片的设备称为块设备
2、 块设备与字符设备的区别:
A) 字符设备必须按照字符流的方式有序访问,比如:串口,键盘属于字符设备
如果一个设备时是随机的、无序的访问,那么它属于块设备。
块设备只能以块为单位接受输入和返回输出,而字符设备是以字节为单位
块设备对于 IO请求有对应的缓冲区,因此块设备可以选择什么顺序进行响应,而字符设备无序缓冲可以直接读写。
块设备中最小的可寻址单元是扇区,扇区大小时2的整数倍,而最常见的大小是512个字节,扇区是所有块设备的基本单元块设备不能对比扇区还小的单元进行寻址和操作,但是块设备一次可以传输多个扇区。
块设备的注册与注销
块设备和字符设备一样,必须使用一套注册接口来时的内核可以使用它们的设备,但是块设备和字符设备的注册细节不一样。
块设备注册函数: register_blkdev 在linux/fs.h中
Int register_blkdev unsigned int major,const chat* devname ;
参数为设备使用的主编号和关联的设备ID(/proc/devices);
若major传递为0,那么内核会分配一个新的主编号给调用者
返回负数代表注册失败
块设备取消注册函数
Int unregister_blkdev unsigned int major,const char* devname ;
5、块设备操作的结构体
Struct block_device_operations 成员:
Int(*open)(struct inode* ,struct file* );
Int(*release)(struct inode*,struct file*);
当设备打开或者关闭的时候会调用open和release函数
Int(*ioctl)(struct inode*,struct file*,unsigned int cmd,unsigned long);
Struct module* owner;
Gendisk结构体
定义在linux/blkdev.h
Struct gendisk 成员
Int major :主设备号
Int first_minor :第一个次设备号
Int minors :最大的次设备数,如果不能分区则为1 同一个磁盘的各个分区共享一个主设备号,如果有分区,那么必须为每个分区都分配不同的次设备号,次设备号常用值为16,它允许磁盘有15个分区。
文档评论(0)