Professional Documents
Culture Documents
一、应用程序和驱动程序的数据交互
Linux 系统下,应用程序和驱动程序之间的数据是不能直接传递,必须借助内核提供的函数
接口来实现数据的交互(本质就是内存拷贝),内核提供了两个函数,分别是
copy_to_user 和 copy_from_user。
从用户空间获取数据
函数原型
int copy_from_user(void *to, const void __user *from, int n)
函数参数
参数一:to 指的是内核空间的数据地址
参数二:from 指的是用户空间的数据地址
参数三:n 指的是打算拷贝的数据大小
返回值: 成功 返回 0 失败 返回不能拷贝的数据个数
从内核空间获取数据
函数参数
参数一:to 指的是用户空间的数据地址
参数二:from 指的是内核空间的数据地址
参数三:n 指的是打算拷贝的数据大小
返回值: 成功 返回 0 失败 返回不能拷贝的数据个数
二、物理地址与虚拟地址的转换
思考:如果已经计算出来硬件寄存器的物理地址,应该如何把物理地址转换为虚拟地址??
答案:一般在驱动程序中,常用的一种方案是先从内核空间中申请对应的一块物理内存区
然后把申请的物理内存区再转换为对应的虚拟地址。
申请物理内存区
把物理内存区进行映射
申请的物理内存区是不可以直接访问的,需要把物理内存区的地址转换为对应的虚拟地址
可以利用内核源码中提供的 ioremap 函数接口来实现。记住:得到了虚拟地址,和 C 语言
中访问地址的方式一致。
解除物理内存区的映射
释放物理内存区的资源
练习:编写驱动程序,确保驱动程序可以驱动开发板的 4 个 LED,利用应用程序来控制硬
件的亮灭。
练习:编写驱动程序,确保驱动程序可以驱动开发板的蜂鸣器,利用应用程序来控制硬件
的鸣叫。
练习:编写驱动程序,确保驱动程序可以驱动开发板的 4 个按键,利用应用程序来控制硬
件。
注意:在卸载驱动的时候,应该在出口函数去归还申请的资源,顺序很重要,尝试自己编
写出口函数。
三、