本文简单描述Linux驱动相关函数、宏、头文件等,供后续快速查看。参考自《Linux设备驱动程序(第三版)》。
头文件
#include <linux/fs.h>
“文件系统”头文件,它是编写设备驱动需要的头文件,其中声明了许多重要的函数和数据结构。
#include <asm/uaccess.h>
该头文件声明了在内核代码和用户空间之间移动数据的函数。
数据结构
#include <linux/types.h>
dev_t
dev_t是用来在表示设备编号的数据类型。
struct file_operations;
struct file;
struct inode;
大部分设备驱动都会用到的三个重要数据结构:
struct file_operations 保存了字符驱动的方法;
struct file 表示一个打开的文件;
struct inode 表示磁盘上的一个文件。
宏
int MAJOR(dev_t dev);
int MINOR(dev_t dev);
这两个宏从设备编号中抽取主/次设备号。
dev_t MKDEV(unsigned int major, unsigned int minor);
通过主/次设备号构造一个 dev_t 数据项。
#include <linux/kernel.h>
container_of(pointer, type, field);
一个方便使用的宏, 它可用于从包含在某个结构体中的指针获得结构本身的指针。
函数
unsigned long copy_from_user (void *to, const void *from, unsigned long count);
unsigned long copy_to_user (void *to, const void *from, unsigned long count);
在用户空间和内核空间拷贝数据。
#include <asm/uaccess.h>
int access_ok(int type, const void *addr, unsigned long size);
检查一个用户空间的指针是可用的。access_ok 返回一个非零值, 如果应当允许存取。VERIFY_READ、VERIFY_WRITE access_ok 中 type 参数的可能取值。 VERIFY_WRITE 是 VERIFY_READ 的超集。
#include <asm/uaccess.h>
int put_user(datum,ptr);
int get_user(local,ptr);
int __put_user(datum,ptr);
int __get_user(local,ptr);
用来存储或获取一个数据到或从用户空间的宏。传送的字节数依赖sizeof(*ptr). 常规的版本调用 access_ok , 而常规版本( __put_user 和 __get_user ) 假定 access_ok 已经被调用了。
字符驱动
参看《Linux字符驱动快速参考》
块驱动
参看《Linux块驱动快速参考》
网络驱动
参看《Linux网络驱动快速参考》