内核驱动学习(三)

一、驱动设备

1、驱动设备分类:字符设备;块设备;网络接口;

注:块设备是以块(通常是512字节)为最小传输单位的设备,块设备不能按字节处理数据。而linux则允许块设备传送任意数目的字节

其他分类:USB设备;PCI设备;平台总线设备(platform虚拟总线)

二、使用字符设备驱动

1、编译,安装驱动文件

2、创建设备文件

3、编写应用程序

注:设备文件与设备驱动程序是靠什么来对应的呢?:主设备号

三、字符驱动编程模型

1、分配设备描述结构cdev:静态;动态分配

2、初始化设备描述结构   :即设置file_operations *fops; cdev_init()

3、注册设备描述结构:即设置设备号和设备个数 ; cdev_add()

4、硬件初始化


5、实现设备操作,即设备方法


6、驱动注销:注销设备描述结构:cdev_del;       注销设备号:unregister_chrdev_region

7、linux系统中,每个打开的文件,在内核中都会关联一个struct file;;;每个文件都关联一个inode结构

8、用于空间的指针都不能被内核代码直接引用,必须使用copy_from_user;copy_to_user

四、应用程序是怎么访问到驱动程序的

1、反汇编:arm-linux-objdump -D -S read_mem >dump

2、设置r7,调用svc指令(系统调用指令;pc指针会从用户空间进入到内核空间,且入口相同)

3、根据r7的值查表,调用表中的实现函数

4、实现函数中,首先根据文件描述符得到struct file;然后再查看struct file 中的file _operation  *f_op,这就是驱动程序中的操作了

五、字符设备控制实现

1、用于函数:ioctl        驱动函数:unlocked_ioctl

2、命令cmd:命令是一个整数;类型(8位),序号,参数传送方向,参数长度

3、linux系统提供了定义命令的宏:_IO(type, nr);_IOR();_IOW()

六、硬件访问技术

1、把物理地址映射为虚拟地址:动态映射ioremap(physaddr,size);  静态映射:内核启动时自动将物理地址映射为虚拟地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值