国嵌内核驱动进阶班-7-1(Ioctl设备控制)

本文详细介绍了ioctl在用户空间和内核空间的应用及其API。ioctl用于实现除读写设备外的其他功能,例如设置串口的波特率等。文章还深入探讨了内核驱动中ioctl命令的定义与实现,并给出了具体示例。

ioctl 

控制设备

除了读写设备之外,其他功能的实现需要ioctl。如串口的波特率的设定。


 

用户空间:

ioctl的应用

  • api 

int ioctl(int fd, unsigned long cmd, ...)

fd 文件描述符

cmd 发送的命令

...依赖cmd命令


 

内核空间

  • api 

  int (*ioctl)(struct inode *inode, struct file *flip, unsigned int cmd, unsigned long arg)

  inode 文件的物理信息(如文件的设备编号)

  flip 表示打开文件

  cmd 来自于用户空间的cmd

      arg 

  •  内核驱动的实现
    • 定义命令

include/asm/ioctl.h

类型(幻数)8

序号 8传送方向参数大小
设备(Document/ioctl-number.txt 记录已经使用的幻数)指定设备的第几个命令

_IOC_NONE

_IOC_READ(从设备读)

_IOC_WRITE(向设备写)

用户数据的大小

13到14位

 

内核提供定义命令的宏

 _IO(type,nr)         没有参数的命令

_IOR(type,nr,datetype)    从设备读取数据

_IOW(type,nr,datetype)   向设备中写数据

_IOWR(type,nr,datetype)   向设备读写数据


_IOC_TYPE(cmd)  从命令中取得幻数(幻数type决定设备)

_IOC_NR(cmd)     从命令中取得命令的个数

_IOC_DIR(cmd)    从命令取得direction

 

例子

#define MEM_IOC_MAGIC 'm'

#define MEM_IOCSET  _LOW(MEM_IOC_MAGIC, 0, int)

#define MEM_IOCGQSET  _LOR(MEM_IOC_MAGIC, 1, int) 

    • 实现命令

1. ioctl 返回值

  EINVAL=-1“非法参数”

2. ioctl参数

  arg 指针的检测

        ※ 用户空间指针,不可以直接使用。

 

  不需要检测:

  copy_from_user

  copy_to_user

  get_user

  put_user

   需要检测:

  __get_user

  __put_user

  

  检测函数:

  int access_ok(int type, )

  type :VERIFY_WRITE VERIFY_READ

  

if (__IOC_DIR(cmd) & _IOC_READ)
err = !access_ok(VERIFY_WRITE, (void __user*)args, _IOC_SIZE(cmd));

else if (__IOC_DIR(cmd) & _IOC_WRITE)
er r = !access_ok(VERIFY_READ, (void __user*)args, _IOC_SIZE(cmd));

if (err)
erturn -EFAULT;

3. 命令的实现

switch(cmd)

{

  case MEM_IOCSQUANTUM:

  break;

        case MEM_IOCSQUANTUM:

        break;

        default:

  return -EINVAL;

}

  

 

 

3. 

转载于:https://www.cnblogs.com/renhl/p/4547967.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值