每一个存在于文件系统里面的文件都会关联一个inode 结构,该结构主要用来记录文件物理上的信息。因此, 它和代表打开文件的file结构是不同的。一个文件没有被打开时不会关联file结构,但是却会关联一个inode 结构。
重要成员:
dev_t i_rdev:设备号
3.2 设备操作-open
open设备方法是驱动程序用来为以后的操作完成初始化准备工作的。在大部分驱动程序
中,open完成如下工作:
标明次设备号
启动设备
3.2 设备操作-release
release方法的作用正好与open相反。这个设备方法有时也称为close,它应该:
关闭设备。
3.2 设备操作-read
read设备方法通常完成2件事情:
从设备中读取数据(属于硬件访问类操作)
将读取到的数据返回给应用程序
ssize_t (*read) (struct file *filp, char __user *buff, size_t count, loff_t *offp)
参数分析:
filp:与字符设备文件关联的file结构指针, 由内核创建。
buff : 从设备读取到的数据,需要保存到的位置。由read系统调用提供该参数。
count: 请求传输的数据量,由read系统调用提供该参数。
offp: 文件的读写位置,由内核从file结构中取出后,传递进来。
buff参数是来源于用户空间的指针,这类指针都不能被内核代码直接引用,必须使用专门的函数
int copy_from_user(void *to, const void __user *from, int n)
int copy_to_user(void __user *to, const void *from, int n)
3.2 设备操作-write
write设备方法通常完成2件事情:
从应用程序提供的地址中取出数据将数据写入设备(属于硬件访问类操作)
ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *)
其参数类似于read
2.3 驱动注销
当我们从内核中卸载驱动程序的时候,需要使用cdev_del函数来完成字符设备的注销。
先写一个自动分配字符设备号手动分配字符设备节点的例子及APP
手动安装步骤:
Insmod char_dev.ko
查看字符设备号
cat /proc/devices
再安装设备节点
mknod /dev/my_chardev c 248 0
然后是测试app
./my_char_dev_app 1
内核驱动代码char_dev.c
#include <linux/module.h>
#include <linux/init.h>
#include <linux/io.h>
#include <linux/fs.h>
#include <asm/device.h> //下面这三个头文件是由于动态创建需要加的
#include <linux/device.h>
#include <linux/cdev.h>
#include "my_cdev.h"
struct cdev cdev;
dev_t devno;//这里是动态分配设备号
int my_cdev_open(struct inode *node,struct file *filp)
{
printk("my_cdev_open sucess!\n");
return 0;
}