我正在开发一个Linux块驱动程序,目前正在测试它。我有一个IOCTL函数,目前不做任何事情。我只是使用printk来打印cmd和arg参数。当Linux启动时,它调用IOCTL函数,cmd为5331,arg为0。我正在尝试找出这个cmd可能是什么。我唯一能找到的就是对CDROM功能的引用。Linux会认为我的设备是CDROM吗?如果是这样,我怎么能说不是呢?谢谢
static int mydrv_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, unsigned long arg)
我一直在学习如何在基于linux的系统中使用IOCTL来控制设备,并阅读了一篇文章。作者说,IOCTL原型在Unix系统调用列表中脱颖而出,因为在编译过程中使用了dots int ioctl(int fd, unsigned long cmd, ...),从而阻止了类型检查。最后一部分是我不太好的地方。我担心的是,不检查类型可能会导致一些控制外围设备的问题?有什么更可靠的方法或最佳做法来监控外围设备呢?谢谢
正如在这个问题中指出的,Linux内核模块中的ioctl函数的原型是:
(第1版)
int ioctl(struct inode *i, struct file *f, unsigned int cmd, unsigned long arg);
或
(第2版)
long ioctl(struct file *f, unsigned int cmd, unsigned long arg);
我想在实现字符设备驱动程序的内核模块中使用它们。
在这种情况下,上述两种原型是否都适合?如果是,为什么?如果没有,如何选择正确的?
哪些头/源文件(S)包含这些原型?换句话说:这些原型的官方参考文件是什么?
使用非NVMe驱动器,我可以运行:
# hdparm -I /dev/whatever | grep TRIM
Data Set Management TRIM supported (limit 8 block)
Deterministic read data after TRIM
使用三星960 EVO1TB NVMe驱动器(),我得到:
# hdparm -I /dev/nvme0n1
/dev/nvme0n1:
HDIO_DRIVE_CMD(identify) failed: Inappropriate ioctl for device
我能跑
# smartctl --all /de
我正在使用ioctl()从块设备(Scsi)读取数据。
我注意到,当我读取1024扇区时,ioctl完成时没有任何问题。当我读取2048时,过了很长一段时间后,它返回ENOMEM (errno=12),这甚至没有列在可能的错误列表中(请参阅)
我已经tripple检查了我传递的缓冲区大小是否合适,所以这不可能是这种情况--没有缓冲区溢出。
那么,我如何才能知道使用ioctl读取的最大缓冲区大小?
编辑1
一些附加信息可能会对您有所帮助:
Enterprise Linux Enterprise Linux Server release 5.3 (Carthage)
Red Hat Enterpr
我有一个RK3288 SOC平台及其所有的AOSP源代码(安道尔SDK,NDK,Linux内核,U).
AOSP中存在\外部\mmc-util\mmc.c。它似乎使用ioctl函数通过不同的eMMC命令测试eMMC设备。
我想在SOC平台上构建和执行它。
请参考,但输入mm将得到以下结果:
fatal error: #include asm-generic/int-ll64.h: No such file or directory
fatal error: #include <linux/mmc/ioctl.h>: No such file or directory
我的目的是设计
在过去的几天里,我一直试图建立一个Edimax AC1750 USB Wi适配器,但没有成功。我从他们提供给您这里的驱动程序开始,发现我得到了一个make错误:
/home/ben/Desktop/EW7833UAC_linux_4.3.21_kernel_3.16-4.4/EW7833UAC_linux_v4.3.21_17997.20160531/os_dep/linux/ioctl_linux.c:14004:5: error: implicit declaration of function ‘is_compat_task’ [-Werror=implicit-function-dec
我正在设计一个Linux字符设备驱动程序。当ioctl()系统调用发生错误时,我希望设置errno。
long my_own_ioctl(struct file *file, unsigned int req, unsigned long arg)
{
long ret = 0;
BOOL isErr = FALSE;
// some operation
// ...
if (isErr) {
// set errno
// ... <--- What should I do?
如何检索网络设备的网络掩码(最好是在Linux中,但如果它是跨平台的,那么很酷)?我知道如何在Linux上使用C,但是在Python中我找不到一种方法--也许不包括ctype。或者解析ifconfig。还有别的办法吗?
ioctl(socknr, SIOCGIFNETMASK, &ifreq) // C version