Linux设备驱动开发详解--笔记6--字符设备驱动

来源:互联网 发布:剑灵动漫人物捏脸数据 编辑:程序博客网 时间:2024/06/11 09:56

使用下列洪可以通过主设备号和次设备号生成dev_t

MKDEV(int major, int mainor)

 

如果复制的内存是简单类型,如char、int、long等,则可以使用简单的put_user()和get_user()

 

Linux系统建议以如图方式定义ioctl命令码

 

命了码的设备类型字段为一个“幻数”,可以是0-0xff之间的值,内核中的ioctl-number.txt给出了一些推荐的和已经使用了的“幻数”,新设备驱动定义“幻数”的时候要避免与其发生冲突。

命令码的方向字段为2位,该字段表示数据传送的方向,可能的值是_IOC_NONE(无数据传输)、_IOC_READ(读)、_IOC_WRITE(写)和_IOC_READ|_IOC_WRITE(双向)。数据传送的方向是从应用程序的角度来看的

命令码的数据长度字段表示涉及的用户数据的大小,这个成员的长度通常依赖于体系结构,通常是13位或者14位

 

内核还定义了_IO()、_IOR()、_IOW()和_IOWR()这四个宏来辅助生成命令

 

内核中预定义了一些io控制命令,如果某设备驱动中包含了与预定义命令一样的命令,这些命令会被当做预定义命令被内核处理而不是被设备驱动处理,预定义命令有如下4种:

FIOCLEX FIONCLEX FIOQSIZE FIONBIO p142

 

dev = container_of(inode->i_cdev, struct globalmem_dev, cdev);

container_of的作用是通过结构体成员的指针找到对应结构体的指针,这个技巧在Linux内核编程中十分有常用。第1个参数是结构体成员的指针,第2个参数为整个结构体的类型,第3个参数为传入的第1个参数(结构体成员)的类型,返回整个结构体的指针

原创粉丝点击