- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
正如标题所述,我正在编写一个内核模块,我希望模块创建的字符设备自动显示。我可以在我的 module_init
和 module_exit
中使用 mknod
和 rm
来创建和删除设备吗?
编辑:不确定这是否被允许,但作为问题的扩展,我在哪里可以找到更多这样的信息?我的大多数谷歌搜索都导致对非常旧的信息(内核 2.6 及更早版本)感到非常困惑,学习如何编写内核模块的最佳地点是什么?
最佳答案
不,你不能从内核空间使用 mknod 和 rm cli。这些是 bash 命令。但是存在其他选项可以从内核空间创建和删除模块的设备节点文件。在模块初始化函数中,您可以在为您的设备注册后使用 class_create() 和 device_create() 函数。在调用 cdev_init() 之后,您可以使用这两个函数来创建节点文件。类似地,您可以在 module_exit 函数中使用 device_destroy() 和 class_destroy() 函数来删除节点文件。
以下是在字符设备初始化函数中创建/dev/kmem 的示例代码:
int majorNum;
dev_t devNo; // Major and Minor device numbers combined into 32 bits
struct class *pClass; // class_create will set this
static int __init devkoInit(void) {
struct device *pDev;
// Register character device
majorNum = register_chrdev(0, "devko", &fileOps);
if (majorNum < 0) {
printk(KERN_ALERT "Could not register device: %d\n", majorNum);
return majorNum;
}
devNo = MKDEV(majorNum, 0); // Create a dev_t, 32 bit version of numbers
// Create /sys/class/kmem in preparation of creating /dev/kmem
pClass = class_create(THIS_MODULE, "kmem");
if (IS_ERR(pClass)) {
printk(KERN_WARNING "\ncan't create class");
unregister_chrdev_region(devNo, 1);
return -1;
}
// Create /dev/kmem for this char dev
if (IS_ERR(pDev = device_create(pClass, NULL, devNo, NULL, "kmem"))) {
printk(KERN_WARNING "devko.ko can't create device /dev/kmem\n");
class_destroy(pClass);
unregister_chrdev_region(devNo, 1);
return -1;
}
return 0;
} // end of devkoInit
static void __exit devkoExit(void) {
// Clean up after ourselves
device_destroy(pClass, devNo); // Remove the /dev/kmem
class_destroy(pClass); // Remove class /sys/class/kmem
unregister_chrdev(majorNum, DEVICE_NAME); // Unregister the device
} // end of devkoExit
关于我可以从我的内核模块调用 mknod 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49350553/
我需要使用 mknod() 创建目录(在我的情况下不允许使用 mkdir()),我会从某个目录调用程序并介绍应该在前一个目录中创建新目录的路径。 例如:如果我是 /home/user/test/ 并且
正如标题所述,我正在编写一个内核模块,我希望模块创建的字符设备自动显示。我可以在我的 module_init 和 module_exit 中使用 mknod 和 rm 来创建和删除设备吗? 编辑:不确
我正在尝试使用 mknod() 命令创建一个 FIFO 命名管道: int main() { char* file="pipe.txt"; int state; state = mknod(file,
语言:C 操作系统: Ubuntu 我只是尝试使用以下命令创建一个名为管道的 FIFO: state = mknod("pipe.txt", S_IFIFO | 0666, 0); 问题是我总是让状态
我正在学习从 Kernel Module Programming Guide 编写字符设备驱动程序, 并使用了 mknod在 /dev 中创建一个节点和我的司机谈谈。 但是,在检查了联机帮助页并观察到
我对这个 makefile 有问题,总是告诉我不允许 mknod 'T0' 操作 all: tx es_mux demux mknod T0 p mknod T1 p m
我想了解如何在 Linux 中使用命名管道进行 IPC。我在这个 link 找到了示例代码. 谁能告诉我 mknod() 中模式参数的作用是什么?我对权限部分特别感兴趣。为什么对该参数进行按位或运算?
我试图使用 os.mknod在 Windows 7 中的 Python 3.5.0 中的函数,但是我发现错误: Traceback (most recent call last): File ""
我在/dev/文件夹中创建了一个字符设备文件,如下所示: mode_t mode = S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH|S_IFCHR;
/*Creating a special file */ #include #include #include #include #include #include int main(in
我想在我的代码中使用 mknod 来创建一个文件,但是 man 说,那 The only portable use of mknod() is to create a FIFO-special fil
我想在 Python 中创建一个新文件,因为我正在使用 mknod 命令,但出现错误: os.mknod(); AttributeError: module 'os' has no attribute
创建命名管道时 mkfifo() 和 mknod() 有什么区别? 我尝试搜索但没有得到满意的答案。 最佳答案 使用 mkfifo()是标准化和便携的。使用mknod()一般来说,它是不可移植的——它
我的代码 #!/bin/sh major=$(awk '$2=="module_dev" {print $1}' /proc/devices) echo $major mknod /dev/modul
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
os.mknod() 是 Mac 上的特权调用吗?总是失败,不允许操作? In [1]: import os In [2]: os.mknod("/tmp/test123") ------------
我正在尝试制作一个使用命名管道与 Raspberry Pi 3 上的 C++ 程序通信的 C 程序。 当我编译我的一些代码时,GCC 发出的警告: /home/pi/BluetoothTest/bto
我正在尝试制作一个 c 程序,我正在使用 mknod 命令,例如 #include #include #include char info[50]; main() { int fdr;
我正在从 Linux 移植到 FreeBSD,遇到了::mknod() 失败并出现错误: [EINVAL] Creating anything else than a block
让角色出现在/dev 中的最佳方法是什么?我有一个调用 register_chrdev 的驱动程序,当我加载模块时,我在/proc/devices 中看到了条目。但是,我仍然必须在命令行上调用 mkn
我是一名优秀的程序员,十分优秀!