Articles of ioctl

什么是使用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。 […]

ioctl参数(例如0x1268 / BLKSSZGET)在哪里实际指定?

我正在寻找描述ioctl 0x1268(BLKSSZGET)的预期参数和行为的明确规范。 这个数字在很多地方都被声明(其中没有一个包含明确的参考源),比如linux/fs.h ,但是我没有find它的规范。 当然,在过去的某个时刻,有人决定0x1268会得到设备的物理扇区大小,并在某个地方logging下来。 这些信息来自哪里,我可以在哪里find它? 编辑:我不是问BLKSSZGET一般做什么,也不是问我在什么头被定义。我正在寻找一个明确的,标准化的来源,说明什么样的参数types应该采取什么样的行为应该是任何驱动程序实现它。 具体来说,我问的是,在util-linux 2.23(和2.24)的blkdiscard里面有一个错误,其中的扇区大小被查询到uint64_t ,但是高32位没有受到影响,因为BLKSSZGET 似乎期望一个32-这会导致不正确的扇区大小,不正确的alignment计算以及应该成功的blkdiscard失败。 所以在提交补丁之前,我需要绝对确定地确定问题是blkdiscard应该使用32位整数,还是我的内核中的驱动程序应该使用64位整数。 编辑2:由于我们在这个话题上,所提议的补丁假设blkdiscard是不正确的是: — sys-utils/blkdiscard.c-2.23 2013-11-01 18:28:19.270004947 -0400 +++ sys-utils/blkdiscard.c 2013-11-01 18:29:07.334002382 -0400 @@ -71,7 +71,8 @@ { char *path; int c, fd, verbose = 0, secure = 0; – uint64_t end, blksize, secsize, range[2]; + uint64_t end, blksize, range[2]; + uint32_t secsize; struct stat […]

使用ioctl在Linux中获取IPv6地址

我试图在我的Linux操作系统中获得IPv6地址,如下所示: sd = Socket_m(AF_INET6_m, SOCK_DGRAM_m, 0); ifc.ifc_buf = buffer_p; ifc.ifc_len = buffSize; Ioctl_m(sd, SIOCGIFCONF, &ifc); 如果为接口configuration了任何IPv4地址,则它将成功工作,但如果接口只有一个IPv6地址,则不会由ioctl返回。 例如,由于只configuration了IPv6地址,导致无法获得从接口的IPv6地址: br1 Link encap:Ethernet HWaddr 00:10:18:2D:BB:34 inet6 addr: fe80::210:18ff:fe2d:be54/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:194244850 errors:0 dropped:0 overruns:0 frame:0 TX packets:72005 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:12331900995 (11760.6 Mb) TX bytes:6192406 (5.9 Mb)

这个macros是什么意思_IOR(MY_MACIG,0,int)?

我正在通过ioctl示例程序来检查它如何与内核空间进行通信。 在程序WRITE_IOCTL被用作命令 #define WRITE_IOCTL _IOW(MY_MACIG, 1, int) ioctl(fd, WRITE_IOCTL, "hello world") 我无法理解什么是_IOW(MY_MACIG, 1, int) 。 这里是我下载程序的链接。 请帮帮我。 http://people.ee.ethz.ch/~arkeller/linux/multi/kernel_user_space_howto-4.html

使用RNDADDENTROPY将熵添加到/ dev / random

我有一个产生一些噪声的设备,我想添加到embedded式Linux系统中/ dev / random设备的熵池中。 我正在阅读/ dev / random的手册页 ,我不太了解你传递给RNDADDENTROPY ioctl调用的结构。 RNDADDENTROPY Add some additional entropy to the input pool, incrementing the entropy count. This differs from writing to /dev/random or /dev/urandom, which only adds some data but does not increment the entropy count. The following structure is used: struct rand_pool_info { int entropy_count; int buf_size; […]

想知道如何使用ioctl / SIOCGIFADDR / SIOCGIFCONF获取Mac OS X上的以太网接口信息?

您是否遇到了一个问题,弄清楚如何使用ioctl / SIOCGIFADDR / SIOCGIFCONF获取Mac OS X上的界面信息? 我遇到了很多麻烦,使得在Linux上运行良好的代码能够在Mac OS X上运行。

如何检查接口是否启动

标题几乎说明了一切。 如果我运行ifconfig ,我得到这个: eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet -snip- netmask 255.255.255.0 broadcast -snip- … 使用这个,我可以知道它是否启动( <UP,… ),但我希望能够在C(或C ++,如果有一个更简单的解决scheme)这样做,而不依赖于parsing外部进程。 这是我到目前为止(不起作用): bool is_interface_online(std::string interface) { struct ifreq ifr; int sock = socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP); memset(&ifr, 0, sizeof(ifr)); strcpy(ifr.ifr_name, interface.c_str()); if (ioctl(sock, SIOCGIFFLAGS, &ifr) < 0) { perror("SIOCGIFFLAGS"); } close(sock); return !!(ifr.ifr_flags | IFF_UP); } 任何人都可以为我指出正确的方向吗?

unlocked_ioctl vs正常的ioctl

在我的驱动程序的file_operations结构中,我有: struct file_operations Fops = { read: device_read, write: device_write, unlocked_ioctl: device_ioctl, … }; 即没有使用ioctl字段。 这足以避免大内核锁,并进入device_ioctl()没有任何同步? 或者我必须更改代码的用户空间部分中的ioctl()调用吗?

在Linux上使用I2C进行读写

我试图读取/写入通过地址为0b 1010 011的I2C总线连接的FM24CL64-GTR FRAM芯片。 当我试图写3个字节(数据地址2个字节,+数据一个字节)时,我得到一个内核消息( [12406.360000] i2c-adapter i2c-0: sendbytes: NAK bailout. ),以及写回车!= 3.请参阅下面的代码: #include <linux/i2c-dev.h> #include <fcntl.h> #include <unistd.h> #include <stdint.h> int file; char filename[20]; int addr = 0x53; // 0b1010011; /* The I2C address */ uint16_t dataAddr = 0x1234; uint8_t val = 0x5c; uint8_t buf[3]; sprintf(filename,"/dev/i2c-%d",0); if ((file = open(filename,O_RDWR)) < 0) exit(1); if […]

给无效的论据的ioctl

我想在两个不同的程序之间发送一个打开的文件描述符。 所以我用named pipes使用ioctl来做到这一点。 但是我得到了ioctl的无效参数。 #include <stropts.h> #include "accesories.c" #include <fcntl.h> #include <errno.h> #include <string.h> #include <sys/ioctl.h> #define MSGSIZ 63 char *fifo = "fifo"; int send_err(int fd, int errcode, const char *msg) { int n; if ((n = strlen(msg)) > 0) if (write(fd, msg, n) != n) /* send the error message */ return(-1); if (errcode […]