由设备号获取主次设备号:
MAJOR(dev_t dev)
MINOR(dev_t dev)
字符驱动的常用的API:
void cdev_init(struct cdev *, struct file_operations *)
struct cdev * cdev_alloc(void)
void cdev_put(struct cdev *p)
int cdev_add(struct cdev * , dev_t, unsigned)
void cdev_del(struct cdev *)
分配设备号的API:
int register_chrdev_region(dev_t from, unsigned count, const char *name)
int alloc_chrdev_region(dev_t* dev, unsigned baseminor, unsigned count, const char * name)
删除设备号的API":
void unregister_chardev_region(dev_t from, unsigned count)
用户空间到内核空间的转换问题:
copy_to_user():内核空间到用户空间
copy_from_user():从用户空间到内核空间
如果复制简单的类型的时候,需要用
get_user(val, (int *)arg) :从用户空间获取数据,arg是用户空间的地址
put_user(val, (int *)arg):输出数据到用户空间, arg是用户空间的地址
内核空间在访问用户空间之前,必须进行检查,确保是用户空间的地址;检查的方式:access_ok(type, addr, size)
关于IOCONTRL的内容就不在次赘述,比较简单。