我编译和运行的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内核中更改中断处理程序代码.
我有一个等待中断发生的用户线程.如果发生中断,那么我想要做的第一件事就是执行该用户线程.
有没有办法让它发挥作用.
谢谢
我已经开始学习Linux驱动程序,但我发现它有点困难.
我一直在研究i2c驱动程序,我对驱动程序的入口点感到很困惑.驱动程序是否从MOUDULE_INIT()宏开始?
而且我也想知道如何知道驱动程序如何运行的过程.我得到了这本书,Linux设备驱动程序,但我仍然很困惑.你可以帮帮我吗?非常感谢.
我将以i2c驱动程序为例.其中有很多功能,我只想知道如何在i2c驱动程序中协调功能的关系?
在过去的几天里,我正在研究很多关于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编译器启动代码为我们做这项工作吗?
我正在使用asm/i387.h中的kernel_fpu_begin和kernel_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_begin和kernel_fpu_end; 但是kernel_fpu_begin在打电话之前已经打过电话了foo.这会导致未定义的行为吗?
此外,我是否应该kernel_fpu_end在foo函数内部调用?我在调用后返回一个doublekernel_fpu_end,这意味着访问浮点寄存器是不安全的吗?
我最初的猜测是不要在函数内部使用kernel_fpu_begin和kernel_fpu_end调用foo; 但是如果foo将双重转换返回到unsigned而不是 - 程序员不会知道使用kernel_fpu_begin …
我目前正在学习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回调并offp在read和write回调中进行了处理,但仍然无法正常工作。
为什么我们可以在软件中断的情况下睡觉,而在硬件中断的情况下是不允许的?例如,系统调用可以睡眠,而ISR无法睡眠.
我遇到过一个术语 - Linux中的内存漏洞.我相信这是重新映射I/O的内存.我的理解是否正确?
问题是关于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]立场?这是什么意思?
我想创建一个演示,向学生解释处理器振铃和系统调用。我在一个演示文稿中正在考虑做这样的事情:
我可以使用Linux或Windows,更容易
关于在哪里可以找到有助于我的代码的任何想法?我可以使用哪些受保护的说明?
谢谢!