Articles of 设备

如何copy_to_user一个string和在linux内核读取函数中使用offp

声明: static char status[128] = "off\0"; 并实现了readfunction: static ssize_t read_proc(struct file *filep, char __user *buf, size_t len, loff_t *offp) { ssize_t cnt = strlen(status), ret; ret = copy_to_user(buf, status, cnt); *offp += cnt; return cnt; } 我如何考虑offp ? 目前它打印的status是无尽的

Unix下的键盘设备

如何捕获所有的用户input,一次读取一个字节? 我做了这个编码,但它不工作 if ((fd = open("/dev/char", O_RDONLY) != 1) { tty = open("/dev/tty", O_RDONLY); tcsetattr(0, TCSANOW, &orig_info); read (fd, &buf, sizeof(char)); } close(fd); 我希望terminal等待input,但没有。

如何从用户空间注册一个虚拟卡alsa?

我正在从用户空间开发一个虚拟设备 (使用umview http://wiki.virtualsquare.org/wiki/index.php/UMview )所以,我需要注册我的设备到系统的声卡列表 (我从来没有在内核模块中使用alsa,所以我认为我需要调用snd_card_register()函数) 但我无法从用户空间find一种方法… 也许我可以写一个系统调用来做到这一点?

通过设备文件符号链接查找总线编号和设备编号

我有一个由udev规则生成的设备文件( SYMLINK ) /dev/CDMAModem 。 我想查找实际设备的总线编号和设备编号。 其实我想在我的C ++程序中执行设备/dev/bus/usb/BUS_NO/DEVICE_NO上的USBDEVFS_RESET ioctl。 —- udev规则—- SUBSYSTEMS=="usb", ACTION=="add", DRIVERS=="zte_ev", ATTRS{bNumEndpoints}=="03", SYMLINK+="CDMAModem" SUBSYSTEMS=="usb", ACTION=="remove", DRIVERS=="zte_ev", ATTRS{bNumEndpoints}=="03", SYMLINK-="CDMAModem"

Linux设备驱动程序不安全FXSAVE / FXRSTOR错误 – 任何先例?

有一个令人讨厌的问题,暂时难倒了我公司的一些工程师试图进行debugging。 C ++程序通常运行在具有MPI的多核计算机集群上。 它会跑很长一段时间 – 也许是几天 – 然后突然失败。 大多数工程师已经消除了程序本身出现任何错误的合理可能性,所以他们开始将责任归于可能的硬件问题,但是我怀疑在Linux内核模块或者设备中必定存在软件问题驱动程序。 令人怀疑的是内核模块或设备驱动程序为了执行一些浮点计算,正在以对SMP系统不安全的方式执行FXSAVE / FXRSTOR。 这可能与FXS​​AVE在需要重入的内核例程中的静态缓冲区一样简单。 这将创build一个竞争条件错误,很less会损坏线程的浮点上下文。 在应用程序层面,似乎发生的情况是MXCSR的一个或多个位(即FXSAVE / FXRSTOR上下文的一部分)突然更改,但没有应用程序代码可以对其进行更改。 我在Windows上遇到了类似的问题,最终在video驱动程序中出现了一个错误,例如当应用程序代码被操作系统抢占时,该线程上下文中的某些MXCSR位已损坏。 我不是Linux Kernel黑客或设备驱动程序开发方面的专家,但是我正在读的是重入规则已经发生了很大的变化。 在非SMP和SMP(多核)系统之间; 在内核版本之间; 等等。所以种族条件错误的可能性似乎是合理的。 所以我的问题是: 是否有任何已知的Linux驱动程序(或内核)错误符合该描述? 如果他们有类似的症状,我可以引用任何先例都是有帮助的。 在这一点上,很多涉及到的人都是(IMHO)浪费时间思考“好吧,我的代码中没有错误,所以它肯定是坏的硬件”。 我想让他们超越这个,寻找更有可能成为真正原因的东西。

如何编写Linux驱动程序模块调用/使用另一个驱动程序模块?

我正在开发一个Linux驱动程序可加载模块,我必须在我的驱动程序中使用另一个设备(驱动程序堆叠在另一个驱动程序上) 如何在我的驱动程序中调用/使用另一个驱动程序? 我认为他们都在内核中,所以可能有一种方法可以直接使用另一个驱动程序。

如何检查C中的networking设备状态?

我想检查一个networking设备状态,例如promiscous模式。 基本上像ip显示一个命令。 也许有人能把我推向正确的方向? 我想在Linux中做这个,所以linux特定的头文件可用。

如何确定设备内存的页面帧号?

从LDD3 / Ch。 15 /节“使用remap_pfn_range”和“一个简单的实现”,pfn等同于vm_pgoff字段。 我很困惑。 这怎么可能呢? 请注意,vm_pgoff被描述为: 文件中区域的偏移量,以页面为单位。 当文件或设备被映射时,这是映射在该区域中的第一页的文件位置。 因此,如果映射的第一页也对应于文件的第一页(我认为这很常见),那么vm_pgoff就是0.正确吗? 如果是这样,这似乎不是remap_pfn_range()的pfn参数的正确值。 我在这里错过了什么? 什么是正确的价值? 为便于参考,我正在从下面的LDD3中复制相关的代码(页码426) static int simple_remap_mmap(struct file *filp, struct vm_area_struct *vma) { if (remap_pfn_range(vma, vma->vm_start, vm->vm_pgoff, vma->vm_end – vma->vm_start, vma->vm_page_prot)) return -EAGAIN; … }

与Docker共享设备(摄像头,USB驱动器等)

我需要使用我的docker容器在我的主机Linux机器上从/dev共享特定的设备。 –privileged标志用于在–privileged docker run被调用时共享/dev中的任何设备,但是随后添加或移除的设备不会传播到容器中。 我尝试了docker run -v=/dev:/dev …但是最终导致了像/ dev / pts这样的文件的权限和所有权,导致主机不能创build新的伪terminal。 我也尝试了–device标志,但是这不允许你共享一个尚不存在的设备。 最后,我尝试共享像-v=/dev/video0:/dev/video0这样的设备的卷,但是如果/ dev / video0在运行之前不存在,那么docker会在那里创build一个目录,并且networking摄像头不会在/ dev / video0时插入。 有没有更好的方式来获得这种支持的function?

打击pipe道处理

有谁知道bash如何处理通过pipe道发送数据? cat file.txt | tail -20 该命令是否将file.txt的所有内容打印到缓冲区中,然后通过尾部读取? 或者是这个命令,比如说,将file.txt的内容一行一行地打印出来,然后在每一行中暂停处理,然后请求更多的数据? 我问的原因是我正在一个embedded式设备上编写一个程序,该程序基本上对一些数据块执行一系列的操作,其中一个操作的输出作为下一个操作的input被发送。 我想知道linux(bash)如何处理这个问题,所以请给我一个一般的答案,不是特别是当我运行“cat file.txt | tail -20”时会发生什么情况。 预先感谢您的回复! 编辑:Shog9指出了相关的维基百科文章,这并没有直接引导我的文章,但它帮助我find这个: http : //en.wikipedia.org/wiki/Pipeline_%28Unix%29#Implementation哪些有我正在寻找的信息。 我很抱歉没有说清楚。 当然,你正在使用一个pipe道,当然你正在使用命令的各个部分的标准input和标准输出。 我认为这太明显,不能说明。 我在问的是如何处理/实施。 由于这两个程序不能同时运行,数据如何从标准input发送到标准输出? 如果第一个程序产生的数据比第二个程序快得多,会发生什么? 系统是否运行第一个命令,直到终止或stdout缓冲区已满,然后转到下一个程序,依此类推,直到没有更多的数据需要处理或者存在更复杂的机制?