gpt4 book ai didi

linux - 什么系列的数字可以用于新驱动程序中添加的新 ioctl

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:03:07 27 4
gpt4 key购买 nike

引用这个链接http://stackoverflow.com/questions/8922102/adding-new-ioctls-into-kernel-number-range 我开始知道编码是强制性的如果未使用 copy-to-user/copy-from-user,则将指令转换为 ioctl 数字。

请有人解释如何通过设置编码方向获得新的 ioctl 数字。

最佳答案

您需要使用 _IO() 系列宏和文档中的指南 in the official ioctl-number documentation . _IO 宏在 ioctl.h 中声明.大多数采用一个 8 位 int 来表示类型,一个 8 位 int 来表示 ioctl 编号和数据类型(如果您打算将数据传递到 IOCTL 调用中)。理想情况下,该类型对于您的驱动程序是唯一的,但是大多数数字已经分配,​​因此很难做到。 ioctl编号只是为了区别于其他编号,可以按顺序分配。

您可以从 Chapter 6 of the LDD3 获得更多信息.


编辑:您的评论让我相信您需要一个具体的例子。您不应该通过十六进制值来引用 IOCTL 编号。而是像这样使用 _IO() 宏:

// The type for all of my IOCTL calls.
// This number is from 0 to 255.
// Does not conflict with any number assignments in ioctl-number.txt.
#define MYIOC_TYPE 0xA4

// This ioctl takes no arguments. It does something in the driver
// without passing data back and forth. The ioctl number is from 0 to 255.
#define MYIOC_DOFOO _IO(MYIOC_TYPE, 0x00)

// This ioctl reads an integer value from the driver.
#define MYIOC_GETFOO _IOR(MYIOC_TYPE, 0x01, int)

// This ioctl writes an integer value from the driver.
#define MYIOC_SETFOO _IOW(MYIOC_TYPE, 0x02, int)

// This ioctl is confusing and is probably to be avoided.
// It writes a value to the driver while at the same time
// retrieves a value in the same pointer.
#define MYIOC_SETANDGETFOO _IOWR(MYIOC_TYPE, 0x03, int)

宏将数据编码为 ioctl 编号。因此,与其引用单个十六进制数字,不如引用 ioctl 的类型和数字更合适。这些宏还有一个额外的好处,即它们记录了数据去向/来自的方向以及数据的类型。

您可以从 Chapter 6 of the LDD3 获得更多信息.

关于linux - 什么系列的数字可以用于新驱动程序中添加的新 ioctl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17480841/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com