在设备驱动程序中传递自定义标志给“open”函数

4

我需要向设备驱动程序的open()调用传递一些自定义标志。

我在LDD3中找到了以下示例:

int dev_open(struct inode *inode, struct file *filp)
{
    if ((filp->f_flags & O_ACCMODE) == O_WRONLY) {
        ...
    }
}

我的问题是:是否可以定义其他标志(例如O_ACCMODEO_WRONLY)而不会与任何其他标志冲突?

1个回答

3

是的,这是可能的。请查看include/uapi/asm-generic/fcntl.h。注意下一个注释:

/*
 * When introducing new O_* bits, please check its uniqueness in fcntl_init().
 */

现在看一下fcntl_init()函数(定义在fs/fcntl.c中):
/*
 * Please add new bits here to ensure allocation uniqueness.
 * Exceptions: O_NONBLOCK is a two bit define on parisc; O_NDELAY
 * is defined as O_NONBLOCK on some platforms and not on others.
 */
BUILD_BUG_ON(20 - 1 /* for O_RDONLY being 0 */ != HWEIGHT32(
    O_RDONLY        | O_WRONLY      | O_RDWR        |
    O_CREAT         | O_EXCL        | O_NOCTTY      |
    O_TRUNC         | O_APPEND      | /* O_NONBLOCK | */
    __O_SYNC        | O_DSYNC       | FASYNC        |
    O_DIRECT        | O_LARGEFILE   | O_DIRECTORY   |
    O_NOFOLLOW      | O_NOATIME     | O_CLOEXEC     |
    __FMODE_EXEC    | O_PATH        | __O_TMPFILE
    ));

首先,您需要找到新定义的唯一值,以便可以将其与在fcntl_init()中列出的标志进行按位或运算。接下来,您需要将新定义添加到include/uapi/asm-generic/fcntl.h中。最后,将您的新定义添加到fcntl_init()中,以便在编译时进行检查。
最终问题在于找到不与现有定义冲突的值。例如,我可以看到已使用10、100、1000、10000、100000、1000000和10000000。因此,对于您的新标志,您可以使用100000000、200000000、400000000和800000000值。
更新:正如SailorCaire正确提到的那样,您还需要增加BUILD_BUG_ON()宏中的第一个数字。例如,如果它最初是BUILD_BUG_ON(20-1,并且您要向此列表添加一个元素,则应使其为BUILD_BUG_ON(21-1更新2: 另一个有价值的补充来自SailorCaire:

顺便提一下,您需要执行make install_headers,复制新的头文件,看起来您需要重新编译glibc,以使其意识到API的更改。


1
@SailorCire 为什么错误中有 20 - 1,而应该是 22 - 1?另外,你为 O_CLASSIFY 分配的数字是多少?顺便说一下,你可以使用 这个 提交作为你任务的模板。 - Sam Protsenko
1
是的,问题解决了...有趣的是我提出了一个观点却没有真正遵循它。>_< - SailorCire
1
顺便提一下,你需要执行 make install_headers 命令,复制新的头文件,并且看起来你需要重新编译 glibc 以使其意识到 API 的更改。 - SailorCire
我已经提交了一个补丁来解决这个问题。数据是从<bits/fcntl-linux.h>中提取的。你可以重新编译内核,然后修改<bits/fcntl-linux.h>;但是,当有新版本的glibc时,你的软件包管理器会将其覆盖掉。我建议在/usr/local/安装一个新版本以避免这种情况。 - SailorCire
@SailorCire 很有趣。你能否在这里分享你的补丁链接? - Sam Protsenko
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接