Linux驱动快速参考

本文简单描述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网络驱动快速参考》