欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ioctl接口(一) -25

程序员文章站 2022-06-13 21:08:17
...

ioctl接口(一)

unlocked_ipctl接口

  • 什么是unlocked_ioctl 接口?

    unlocked_ioctl 实际上就是ioctl接口,但是功能和对应的系统调用均没有发生变化。

  • unlocked_ioctl和read/write函数有什么相同点和不同点?

    相同点:都可以往内核中写数据。

    不同点:read函数只能完成读的功能,write 函数只能完成写的功能。但是read和write 在读写大数据时效率比较高

    ​ ioctl既可以读也可以写。读取大数据效率不是很高。

  • unlocked_ioctl接口命令规则

    第一个分区: 0-7,命令的编号,范围是0~255

    第二个分区:8-15, 命令的幻数。

    第一个分区和第二个分区主要的作用是用来区分命令的。

    第三个分区:16-29表示传递的数据的大小。

    第四个分区:30-31代表读写的方向。

    ​ 00 :表示用户程序和驱动程序没有数据传递

    ​ 10 :表示用户程序向驱动里面读数据

    ​ 01 : 表示用户程序向驱动里面写数据

    ​ 11 : 先写数据到驱动里面然后在从驱动里面把数据读出来

  • 命令的合成宏与分解宏

合成宏:

_IO(type,nr)		:用来定义没有数据传递的命令
_IOR(type,nr,size)	:用来定义从驱动中读取数据的命令
_IOW(type,nr,size)	:用来定义向驱动写入数据的命令
_IOWR(type,nr,size)	:用来定义数据交换类型的命令,先写入数据,再读取数据这类命令。
参数:
type		:表示命令组成的幻数,也就是8~15位
nr:表示命令组成的编号,也就是0~7位
size		:表示命令组成的参数传递大小,注意这里不是传递数字,而是数据类型,如要传递4字节,就可以写成int。

分解宏:

_lOC_DIR(nr)	分解命令的方向,也就是上面说30~31位的值
_IOC_TYPE(nr) 	分解命令的魔数,也就是上面说8~15位的值
_IOC_NR(nr)		分解命令的编号,也就是上面说0~7位
_IOC_SIZE(nr) 	分解命令的复制数据大小,也就是上面说的16~29位
参数说明:
nr:				要分解的命令

代码

  • app.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>



#define CMD_TEST0 _IO('',0);
#define CMD_TEST0 _IO('L',0)
#define CMD_TEST1 _IO('L',1)
#define CMD_TEST2 _IOW('L',3, int)
#define CMD_TEST3 _IOR('L',3,int)

int main(int argc, char const *argv[]){
    printf("30~31 is %d \n",  _IOC_DIR(CMD_TEST0));
    printf("30~31 is %d \n",  _IOC_DIR(CMD_TEST1));
    printf("30~31 is %d \n",  _IOC_DIR(CMD_TEST2));
    printf("30~31 is %d \n",  _IOC_DIR(CMD_TEST3));

    printf("7~15 is %c \n", _IOC_TYPE(CMD_TEST0));
    printf("7~15 is %c \n", _IOC_TYPE(CMD_TEST1));

    printf("0~7 is %d \n", _IOC_NR(CMD_TEST2));
}
相关标签: 内核 linux c++