gpt4 book ai didi

linux-kernel - 将自定义标志传递给设备驱动程序中的 "open"

转载 作者:行者123 更新时间:2023-12-04 04:35:10 27 4
gpt4 key购买 nike

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

我在 LDD3 中找到了这个例子:

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

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

最佳答案

是的,这是可能的。看看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 的另一个有值(value)的补充:

By the way, you'll need to do make install_headers, copy the new headers, and it looks like you'll need to recompile glibc so it becomes aware of the API change.

关于linux-kernel - 将自定义标志传递给设备驱动程序中的 "open",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31020420/

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