标签: linux-device-driver

"Linux内核模块程序员指南"中的chardev.c示例问题

我编译和运行的chardev.c从例子中lkmpg和写入设备时,收到了意想不到的错误:

anon@anon:~/lkmpg$ sudo echo "hi" > /dev/chardev
bash: /dev/chardev: Permission denied
Run Code Online (Sandbox Code Playgroud)

模块写入功能如下所示:

/*  
 * Called when a process writes to dev file: echo "hi" > /dev/chardev 
 */
static ssize_t
device_write(struct file *filp, const char *buff, size_t len, loff_t * off)
{
    printk(KERN_ALERT "Sorry, this operation isn't supported.\n");
    return -EINVAL;
}
Run Code Online (Sandbox Code Playgroud)

我没有收到无效操作的预期错误,并且错误打印到/ var/log/messages.

我可以从设备上读取没有问题,收到预期的结果:

anon@anon:~/lkmpg$ cat /dev/chardev 
I already told you 6 times Hello world!
Run Code Online (Sandbox Code Playgroud)

使用以下命令手动创建设备/ dev/chardev:

sudo mknod /dev/chardev c 252 0
Run Code Online (Sandbox Code Playgroud)

这是怎么回事?

- 编辑 - …

linux kernel kernel-module linux-device-driver

2
推荐指数
1
解决办法
4299
查看次数

在linux中断的上下文中运行用户线程

我正在编写一些自定义应用程序,并允许在linux内核中更改中断处理程序代码.

我有一个等待中断发生的用户线程.如果发生中断,那么我想要做的第一件事就是执行该用户线程.

有没有办法让它发挥作用.

谢谢

c linux kernel linux-device-driver linux-kernel

2
推荐指数
1
解决办法
831
查看次数

程序启动的Linux设备驱动程序?

我已经开始学习Linux驱动程序,但我发现它有点困难.

我一直在研究i2c驱动程序,我对驱动程序的入口点感到很困惑.驱动程序是否从MOUDULE_INIT()宏开始?

而且我也想知道如何知道驱动程序如何运行的过程.我得到了这本书,Linux设备驱动程序,但我仍然很困惑.你可以帮帮我吗?非常感谢.

我将以i2c驱动程序为例.其中有很多功能,我只想知道如何在i2c驱动程序中协调功能的关系?

linux-device-driver linux-kernel

2
推荐指数
1
解决办法
5332
查看次数

启动代码 - 针对ARM的Linux IRQ中断处理程序

在过去的几天里,我正在研究很多关于linux第10章的书ldd3.我有一些疑问请澄清一下.有些是我的分析,如果他们错了,请建议.

对于ARM,有一个中断向量表地址 - IRQ中断 - 0x00000018然后芯片制造商可以为USART,SPI,I2C,外部中断等硬件提供单独的中断线 - 并将它们复用到单个IRQ线臂.并有(他们选择的)寄存器来确定哪一个触发了中断.

此外,如果有一个中断线可用于GPIO引脚电平变化中断.如下所示,链路的单个中断线可以由不同设备驱动程序的许多处理程序共享.

fiq&irq handler - arm 通常,中断控制器是一个硬件单元,它将许多中断线复用在一起,为CPU产生单线.发生中断时,控制器会断言IRQ线.CPU停止执行并跳过IRQ向量(位置变化)到中断处理程序.中断处理程序读取中断控制器上的寄存器以确定中断线,然后调用正确的中断处理程序,然后清除中断 - 允许另一个中断发生.

http://www.makelinux.net/ldd3/chp-10-sect-2 此链接中描述了如何注册中断处理程序.

https://unix.stackexchange.com/questions/47306/how-does-the-linux-kernel-handle-shared-irqs Linux为同一共享线路调用所有intruppt处理程序.

我的问题是作为一个设备驱动程序程序员我只调用.... request_irq().

谁提供通用的代码 - IRQ中断@ 0x00000018地址 - 它正在读取供应商特定寄存器以确定哪个中断线引发了IRQ.然后告诉linux功能 - 调用为该IRQ线路注册的所有共享中断处理程序?

是芯片组的GCC编译器启动代码为我们做这项工作吗?

linux arm linux-device-driver interrupt-handling

2
推荐指数
1
解决办法
4896
查看次数

在kernel_fpu_end之前调用kernel_fpu_begin两次

我正在使用asm/i387.h中kernel_fpu_beginkernel_fpu_end函数来保护FPU寄存器状态,以便在Linux内核模块中进行一些简单的浮点运算.

我很好奇在kernel_fpu_begin函数之前调用函数两次的行为,kernel_fpu_end反之亦然.例如:

#include <asm/i387.h>

double foo(unsigned num){
    kernel_fpu_begin();

    double x = 3.14;
    x += num;

    kernel_fpu_end();

    return x;
}

...

kernel_fpu_begin();

double y = 1.23;
unsigned z = 42;
y -= foo(z);

kernel_fpu_end();
Run Code Online (Sandbox Code Playgroud)

foo功能,我打电话kernel_fpu_beginkernel_fpu_end; 但是kernel_fpu_begin在打电话之前已经打过电话了foo.这会导致未定义的行为吗?

此外,我是否应该kernel_fpu_endfoo函数内部调用?我在调用后返回一个doublekernel_fpu_end,这意味着访问浮点寄存器是不安全的吗?

我最初的猜测是不要在函数内部使用kernel_fpu_beginkernel_fpu_end调用foo; 但是如果foo双重转换返回到unsigned而不是 - 程序员不会知道使用kernel_fpu_begin …

c linux kernel-module linux-device-driver linux-kernel

2
推荐指数
1
解决办法
2327
查看次数

为什么运算符&gt;&gt;不能与我的char设备一起使用?

我目前正在学习linux设备驱动程序。我从一个示例驱动程序开始,它只是一个内存缓冲区。

我的代码可以在我的github上找到

我这样做来测试我的驱动程序:

# echo "Hello World" > /dev/mad
# cat /dev/mad
Hello World
Run Code Online (Sandbox Code Playgroud)

这进展顺利,但是当我使用重定向运算符添加某些内容(>>)时,其行为并非我所期望的。

# echo foo > /dev/mad
# echo bar >> /dev/mad
# cat /dev/mad
bar
Run Code Online (Sandbox Code Playgroud)

我希望有:

foo
bar
Run Code Online (Sandbox Code Playgroud)

我已经实现了llseek回调并offpreadwrite回调中进行了处理,但仍然无法正常工作。

c linux linux-device-driver

2
推荐指数
1
解决办法
215
查看次数

为什么软件中断在硬件中断时不允许睡眠?

为什么我们可以在软件中断的情况下睡觉,而在硬件中断的情况下是不允许的?例如,系统调用可以睡眠,而ISR无法睡眠.

linux device-driver linux-device-driver linux-kernel

2
推荐指数
1
解决办法
526
查看次数

内存Linux中的漏洞是什么意思?

我遇到过一个术语 - Linux中的内存漏洞.我相信这是重新映射I/O的内存.我的理解是否正确?

linux-device-driver linux-kernel ioremap

2
推荐指数
1
解决办法
1232
查看次数

printk格式中p的百分比[p]的含义

问题是关于printk格式.我正在阅读的文档位于此处

以下是我要问的摘录:

Physical addresses types phys_addr_t:

    %pa[p]  0x01234567 or 0x0123456789abcdef

    For printing a phys_addr_t type (and its derivatives, such as
    resource_size_t) which can vary based on build options, regardless of
    the width of the CPU data path. Passed by reference.
Run Code Online (Sandbox Code Playgroud)

是什么[p]%pa[p]立场?这是什么意思?

c linux device-driver linux-device-driver linux-kernel

2
推荐指数
1
解决办法
568
查看次数

演示处理器环-运行环0指令的汇编代码

我想创建一个演示,向学生解释处理器振铃和系统调用。我在一个演示文稿中正在考虑做这样的事情:

  1. 编写一些汇编代码,尝试执行一些只能在环0中运行的代码(例如,直接访问磁盘)
  2. 查看失败的代码,然后将其重写以使用系统调用(例如,使用系统调用读取文件)
  3. 如果不是那么难:在环0中运行初始代码

我可以使用Linux或Windows,更容易

关于在哪里可以找到有助于我的代码的任何想法?我可以使用哪些受保护的说明?

谢谢!

assembly cpu-architecture linux-device-driver

2
推荐指数
1
解决办法
91
查看次数