栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何使用ioctl()操作内核模块?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何使用ioctl()操作内核模块?

您需要的示例代码可以在

drivers/watchdog/softdog.c
(撰写本文时来自Linux
2.6.33)中找到,该代码说明了正确的文件操作以及如何允许用户区使用ioctl()填充结构。

对于需要编写琐碎字符设备驱动程序的任何人来说,这实际上都是一个很棒的实用教程。

在回答我自己的问题时,我剖析了softdog的ioctl界面,这可能对您有所帮助。

这是它的要旨(尽管还不是很详尽)…

在其中,

softdog_ioctl()
您可以看到struct watchdog_info的简单初始化,该初始化发布了功能,版本和设备信息:

    static const struct watchdog_info ident = { .options =   WDIOF_SETTIMEOUT |   WDIOF_KEEPALIVEPING |   WDIOF_MAGICCLOSE, .firmware_version =     0, .identity =  "Software Watchdog",    };

然后,我们看一个简单的情况,用户只是想获得以下功能:

    switch (cmd) {    case WDIOC_GETSUPPORT: return copy_to_user(argp, &ident, sizeof(ident)) ? -EFAULT : 0;

…当然,这会将上面的初始化值填充到相应的用户空间watchdog_info中。如果copy_to_user()失败,则返回-
EFAULT,这将导致相应的用户空间ioctl()调用返回-1,并设置了有意义的errno。

注意,魔术请求实际上是在linux / watchdog.h中定义的,以便内核和用户空间共享它们:

#define WDIOC_GETSUPPORT        _IOR(WATCHDOG_IOCTL_base, 0, struct watchdog_info)#define WDIOC_GETSTATUS         _IOR(WATCHDOG_IOCTL_base, 1, int)#define WDIOC_GETBOOTSTATUS     _IOR(WATCHDOG_IOCTL_base, 2, int)#define WDIOC_GETTEMP_IOR(WATCHDOG_IOCTL_base, 3, int)#define WDIOC_SETOPTIONS        _IOR(WATCHDOG_IOCTL_base, 4, int)#define WDIOC_KEEPALIVE         _IOR(WATCHDOG_IOCTL_base, 5, int)#define WDIOC_SETTIMEOUT        _IOWR(WATCHDOG_IOCTL_base, 6, int)#define WDIOC_GETTIMEOUT        _IOR(WATCHDOG_IOCTL_base, 7, int)#define WDIOC_SETPRETIMEOUT     _IOWR(WATCHDOG_IOCTL_base, 8, int)#define WDIOC_GETPRETIMEOUT     _IOR(WATCHDOG_IOCTL_base, 9, int)#define WDIOC_GETTIMELEFT       _IOR(WATCHDOG_IOCTL_base, 10, int)

WDIOC显然表示“看门狗ioctl”

您可以轻松地将这一步骤更进一步,让驱动程序执行某项操作并将其结果放入结构中,然后将其复制到用户空间。例如,如果struct
watchdog_info也有一个member

__u32 result_pre
。注意,
__u32
只是内核的版本
uint32_t

使用ioctl(),用户可以将对象的地址(可以是结构,整数)传递给内核,无论内核希望内核将其答复写入相同的对象并将结果复制到提供的地址中。

您需要做的第二件事是确保设备在有人打开,读取,写入或使用像ioctl()这样的钩子时都知道该怎么做,通过研究softdog可以轻松地看到它们。

感兴趣的是:

static const struct file_operations softdog_fops = {        .owner          = THIS_MODULE,        .llseek         = no_llseek,        .write          = softdog_write,        .unlocked_ioctl = softdog_ioctl,        .open= softdog_open,        .release        = softdog_release,};

在哪里看到unlocked_ioctl处理程序将… …您猜对了,softdog_ioctl()。

我认为您可能是在并置一层复杂的层,当处理ioctl()时,它实际上并不存在,这真的很简单。出于同样的原因,除非绝对必要,否则大多数内核开发人员都不愿添加新的ioctl接口。太容易忘记ioctl()将要填充的类型与执行此操作所使用的魔术的关系,这是copy_to_user()失败通常导致内核腐烂而导致大量用户空间进程卡住的主要原因磁盘睡眠。

对于计时器,我同意,ioctl()是理智的最短路径。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/370270.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号