Articles of ioctl

Linux内核模块 – IOCTL使用返回ENOTTY

我在小内核模块上工作。 我试图使用IOCTL(在ioctl_add),但我得到ENOTTY,当我调用它,在开关检查,在底部的主。 代码如下。 有没有人知道我在做什么错? user.c的: #include <stdio.h> #include <stdlib.h> #include <stdarg.h> #include <unistd.h> #include <sys/types.h> #include <sys/ioctl.h> #include <linux/ioctl.h> #include <sys/stat.h> #include <sys/poll.h> #include <fcntl.h> #include <string.h> #include <errno.h> #define IOCTL_TYPE (100) #define IOCTL_ADD (_IO(IOCTL_TYPE, 1)) void cleanup() { if(f>=0) { close(f); } } int ioctl_add(int f) { int ret; ret = ioctl(f, IOCTL_ADD); printf("Add […]

ws_xpixel和ws_ypixel

这里是我用来打印当前terminal的像素分辨率的代码。 #include <sys/ioctl.h> #include <stdio.h> #include <unistd.h> int main (int argc, char *argv[]) { struct winsize ww; ioctl(STDOUT_FILENO, TIOCGWINSZ, &ww); printf ("x-pixels %d\n", ww.ws_xpixel); printf ("y-pixels %d\n", ww.ws_ypixel); return 0; } 我用这个作为winsize参考。 但是代码只打印零。 如果我使用ws_row或ws_row它工作正常。 请帮忙,谢谢!

通过IOCTL将结构体传递给设备驱动程序

我正在尝试从用户空间传递一个结构到内核空间。 我一直在尝试了很多个小时,而且还没有工作。 这是我迄今为止所做的。 int device_ioctl(struct inode *inode, struct file *filep, unsigned int cmd, unsigned long arg){ int ret, SIZE; switch(cmd){ case PASS_STRUCT_ARRAY_SIZE: SIZE = (int *)arg; if(ret < 0){ printk("Error in PASS_STRUCT_ARRAY_SIZE\n"); return -1; } printk("Struct Array Size : %d\n",SIZE); break; case PASS_STRUCT: struct mesg{ int pIDs[SIZE]; int niceVal; }; struct mesg data; ret = […]

在32位模式和64位操作系统的64位模式下编译ioctl函数有什么不同?

我有一个64位的Enterprice SuSE 11我有一个应用程序打开一个HIDRAW设备,并运行一个ioctl函数来获取这个设备的原始信息,如下所示: struct hidraw_devinfo devinfo; int fd = open("/dev/hidraw0", 0); int ret = ioctl(fd, HIDIOCGRAWINFO, &devinfo); … 如果我以64位模式编译这个程序,没有错误,也没有问题,当我执行应用程序时,ioctl函数可以正常工作。 g++ main.cpp 如果我用32位模式编译这个程序,也没有错误,也没有问题。 但是当我执行应用程序的ioctl函数返回EINVAL错误(errno = 22,无效的参数) g++ -m32 main.cpp 有什么问题? 注意: struct hidraw_devinfo { __u32 bustype; __s16 vendor; __s16 product; }

SIOCETHTOOL对SIOCGMIIPHY对SIOCGIFFLAGS

在互联网上进行了一些search后,我才知道,以下是可用于获取/设置以太网接口参数的选项列表。 SIOCETHTOOL SIOCGMIIPHY SIOCGIFFLAGS 我甚至看到一些关于SIOCETHTOOL使用的“stackoverflow”问题。 但是我有的问题是: 比较这三个接口(意味着API)在多核方面提供和支持的特性。 什么时候应该select其中的一个选项。 我几乎找不到SIOCETHTOOL和SIOCGMIIPHY文件。 你能指点一下吗?

用户权限检查ioctl命令

我正在实现字符驱动程序(Linux),并且有一些IOCTL命令在我的驱动程序中,只需要由ADMIN执行。 我的问题是我如何检查我的ioctl命令实施下的用户权限,并限制非特权用户访问IOCTL。

在内核中添加新的IOCTL(数字范围)

我在写新的内核模块,并添加实现新的IOCTL的。 IOCTL的编号有什么规定? 也许有一些“用户范围”? 我在embedded式平台上使用内核2.6.21。

通过TIOCGICOUNT检索错误计数器总是返回错误(-1)

在开发用于USB到RS422转换器模块的接口应用程序时,遇到了停止显示问题。 我需要检索UART错误计数器的成帧,溢出,奇偶校验和中断错误。 但是对ioctl的调用总是返回-1,并且来自检索结构的计数器值跳到非常大的数字。 我用来检索计数器的代码如下: struct serial_icounter_struct counters; int ret = ioctl(portDescriptor, TIOCGICOUNT, &counters); 要设置portDescriptor我正在使用类似的代码来: int portDescriptor = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY); struct termios new_port_settings; //clear the new struct memset(&new_port_settings, 0, sizeof(new_port_settings)); //set port settings new_port_settings.c_cflag = B57600 | CS8 | CLOCAL | CREAD; new_port_settings.c_oflag = 0; new_port_settings.c_lflag = 0; new_port_settings.c_cc[VMIN] = 0; new_port_settings.c_cc[VTIME] […]

如何在Linux设备驱动程序中设置errno?

我正在devise一个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? ret = -1; } return ret; } 我该怎么做才能做到这一点? 提前谢谢! 请允许我更详细地解释我的申请。 我的设备位于/ dev / myCharDev。 我的用户空间应用程序是这样的: #define […]

什么是使用Linuxmacrosaccess_ok()

我一直在做一些研究,我对这个macros有点困惑。 希望有人能给我一些指导。 我有一些ioctl代码(我已经inheritance,没有写),如果在从用户空间复制数据之前检查access_ok()是否做了第一件事: #define __lddk_copy_from_user(a,b,c) copy_from_user(a,b,c) #define __lddk_copy_to_user(a,b,c) copy_to_user(a,b,c) long can_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { switch(cmd) { case COMMAND: if(! access_ok(VERIFY_READ, (void *)arg, sizeof(Message_par_t))) return(retval); if(! access_ok(VERIFY_WRITE, (void *)arg, sizeof(Message_par_t))) return(retval); argp = &Command; __lddk_copy_from_user( (void *) argp,(Command_par_t *) arg, sizeof(Command_par_t)); 所以代码工作得很好,但我不确定是否需要。 第一个问题来自access_ok返回的描述: 如果该区域可能可访问,该函数返回非零值(尽pipe访问可能仍然导致-EFAULT)。 这个函数简单地检查地址是否可能在用户空间中,而不是在内核中。 所以这意味着它确实没有什么更多的,然后确保我们检查的指针可能初始化在用户空间? 既然我们知道除了用户空间调用之外,我们不能进入这个函数,除非我们打开一个有效的文件描述符到这个设备,否则这是不可能发生的,这真的是需要的吗? 确实没有得到一个NULL指针是否真的更安全? 第二个问题来自这个描述: types参数可以指定为VERIFY_READ或VERIFY_WRITE。 […]