MKDEV
功能 将主、次设备号转换成dev_t类型 主设备号 major 次设备号 minor头文件
定义在<linux/cdev.h>中的宏
MKDEV(int major,int minor)
宏定义
#define MKDEV(major,minor) (((major) << MINORBITS) | (minor))
参数
major为主设备号
minor为次设备号
返回值
成功执行返回dev_t类型的设备编号
注解:
1 Linux设备号
主设备号用来表示一个特定的驱动程序。次设备号用来表示使用该驱动程序的各
设备。例如一个嵌入式系统,有两个LED指示灯,LED灯需要独立的打开或者关闭。那么
,可以写一个LED灯的字符设备驱动程序,可以将其主设备号注册成5号设备,次设备号
分别为1和2。这里,次设备号就分别表示两个LED灯。
主设备号相同的设 备是同类设备(使用同一个驱动程序)。
有些设备是对实际存在的物理硬件的抽象,有些设备则是内核自身提供的功能(不依赖于特定的物理硬件,又称为"虚拟设备")。
每个设备在 /dev 目录下都有一个对应的文件(节点)。
可以通过 cat /proc/devices 命令查看当前已经加载的设备驱动程序的主设备号。
内核能够识别的所有设备都记录在源码树下的 documentation/devices.txt 文件中。
在 /dev 目录下除了字符设备和块设备节点之外还通常还会存在:fifo管道、socket、软/硬连接、目录。这些东西没有主/次设备号。
copy_to_user
作用:从内核区中读取数据到用户区简述:
#include <linux/uaccess.h>
unsigned long copy_to_user(void __user *to, const void *from, unsigned long n);
如果数据拷贝成功,则返回零;否则,返回没有拷贝成功的数据字节数。
*to是用户空间的指针,
*from是内核空间指针,
n表示从内核空间向用户空间拷贝数据的字节数
注解:
1 __user宏
__user宏简单告诉编译器(通过 noderef)不应该解除这个指针的引用(因为在当前地址空间中它是没有意义的)。
(void __user *)arg 指的是arg值是一个用户空间的地址,不能直接进行拷贝等,要使用例如copy_from_user,copy_to_user等函数。
默认是内核空间,因为这是驱动,是在内核空间运行的。