标签: linux-device-driver

copy_from_user() 的任何例子?内核和用户空间

我正在寻找将 PID 值从用户空间复制到内核空间,这是我的代码快照。

内核模块:

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <asm/siginfo.h>
#include <linux/rcupdate.h>
#include <linux/sched.h>
#include <linux/uaccess.h>
#include <linux/signal.h>

MODULE_LICENSE ("GPL");

struct siginfo sinfo;
pid_t pid;
struct task_struct *task;

int init_module() 
{
    memset(&sinfo, 0, sizeof(struct siginfo));
    sinfo.si_signo = SIGIO;
    sinfo.si_code = SI_USER;
    pid = 5218; // Everytime a new PID 
    // task = find_task_by_vpid(pid); I am also working on new and old version of UBUNTU so thats why this is here
    task = pid_task(find_vpid(pid), PIDTYPE_PID); 
    printk("%d .\n", task);

    if(task …
Run Code Online (Sandbox Code Playgroud)

c pid linux-device-driver linux-kernel

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

kthread &amp; interupt -- 处理程序 -- 有可能吗

Linux 驱动程序是否有可能拥有一个 kthread、中断句柄和系统调用。意味着 linux Kernel 内核是否允许以上三个?

中断处理程序将在中断时保存来自通信通道的接收数据。
Kthread 会将数据传输出通信通道。
系统调用可用于配置驱动程序或获取其状态。

此外,如果中断处理程序和 kthread 正在使用 - 相同的硬件寄存器 - 那么我们如何保护这个关键部分?

linux linux-device-driver linux-kernel

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

Linux的apanic机制和与更新的ram_console/persistent_ram机制的区别

在内核恐慌(OOPS)的情况下,我正在研究Linux上的不同日志记录机制.到目前为止,我在网上搜索,我已经能够得到以下信息:

  • apanic是完成工作的旧机制.
  • ram_console/persistent_ram是一种新机制.

有人可以在这方面给我启发以下内容吗?

  • 什么是旧的apanic机制,从高层来看这是如何工作的?
  • 为什么弃用apanic机制,支持ram_console/persistent_ram机制?
  • 新的ram_console/persistent_ram mechinsm给表带来了什么好处.
  • ram_console/persistent_ram以什么方式在功能上与旧的apanic方法不同?

我只是在寻找指针和高级答案,从某种意义上说,我可以采取进一步研究机制的方向.我将不胜感激这方面的任何相关信息.

谢谢

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

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

多个中断处理程序如何共享地址0x00000018

我正在阅读关于如何在ARM中处理中断并且知道何时任何硬件中断到达地址0x00000018的指令被执行,这通常是跳转到受尊重的中断处理程序,但是对于不同的模块可能有许多中断处理程序.

那么,这些不同的处理程序如何映射到地址0x00000018?

另外,arm cpu如何知道中断提升是irq或fiq,谁决定它以及哪个设备引发了中断,如何映射到这个中断的受尊重的处理程序.

任何机构都可以指向一个简单的中断处理程序代码,我可以看到所有中断处理程序的作用吗?

arm linux-device-driver linux-kernel interrupt-handling

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

用"dev_groups"替换已弃用的"dev_attrs"属性

我正在尝试编译Linux设备驱动程序(内核模块),但该模块最后一次更新于2013年4月,当然它不再编译在最近的(3.13)内核上,这是错误:

als_sys.c:99:2: error: unknown field ‘dev_attrs’ specified in initializer
Run Code Online (Sandbox Code Playgroud)

我已经搜索了但是我发现的所有内容都是补丁,没有关于更新旧模块的明确"教程",我唯一理解的是我需要使用dev_groups它,但它不接受相同的值dev_attrs和我不知道如何调整现有代码.

代码(其中一些,整个代码可以在这里找到):

# als_sys.c

static ssize_t
illuminance_show(struct device *dev, struct device_attribute *attr, char *buf)
{
    struct als_device *als = to_als_device(dev);
    int illuminance;
    int result;

    result = als->ops->get_illuminance(als, &illuminance);
    if (result)
        return result;

    if (!illuminance)
        return sprintf(buf, "0\n");
    else if (illuminance == -1)
        return sprintf(buf, "-1\n");
    else if (illuminance < -1)
        return -ERANGE;
    else
        return sprintf(buf, "%d\n", illuminance);
}

# truncated - also "adjustment_show" is similar …
Run Code Online (Sandbox Code Playgroud)

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

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

如何计算非线性 skb/payload 的 TCP/UDP 校验和?

我正在尝试在发送的 skb 上计算 TCP/UDP 标头校验和。

基本上,有两个函数可以完成所有工作(在这个 stackoverflow 问题中也提到这个也是):

  • csum_tcpudp_magic
  • csum_partial

例如,对于 TCP:

  tcph->check = 0;
  tcph->check = csum_tcpudp_magic(iph->saddr,
                                  iph->daddr,
                                  tcp_packet_len,
                                  IPPROTO_TCP,
                                  csum_partial((unsigned char *)tcph,
                                               tcp_packet_len,
                                               0));
Run Code Online (Sandbox Code Playgroud)

这工作正常 - 我能够传输 TCP/UDP 数据包并在接收端使用 wireshark 验证校验和。但是,我找不到有关碎片化 SKB 的任何信息。

当 TCP/UDP 负载碎片化时,这两个“魔法”函数会处理这种情况吗?

此外,TCP/UDP 标头可能位于 SKB 的非线性部分(也可能是分段的)。

这些功能也会处理这种情况吗?

我确实明白我可以尝试使用更大的数据包,这会导致它们碎片化,但是现在错误处理的代价将是内核 oops,而且我无法关闭系统。

networking udp tcp linux-device-driver linux-kernel

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

max732x.c I2C IO 扩展器 + GPIO 键,带 Linux 设备树不工作

我正在使用飞思卡尔 MX6 和飞思卡尔 3.10.31 修改内核。我有一个用作 IO 扩展器的 Maxim MAX7325,它的按钮连接到 P0-P2。来自 7325 的中断线连接到 GPIO_3 焊盘(我认为是 GPIO1_3...)

我在设备树中设置了 7325 和 gpio-keys,如下所示:

max7325_reset: max7325-reset {
  compatible = "gpio-reset";
  reset-gpios = <&gpio5 16 GPIO_ACTIVE_LOW>;
  reset-delay-us = <1>;
  #reset-cells = <0>;
};


gpio-keys {
  compatible = "gpio-keys";

  sw2 {
     gpios = <&max7325 2 GPIO_ACTIVE_LOW>;
     linux,code = <30>;    //a
     gpio-key,wakeup;
  };
};
Run Code Online (Sandbox Code Playgroud)

&i2c1 {
   clock-frequency = <100000>;
   pinctrl-names = "default";
   pinctrl-0 = <&pinctrl_i2c1_2>;
   status = "okay";

   max7325: gpio@68 {
      compatible = "maxim,max7325";
      reg = <0x68>; …
Run Code Online (Sandbox Code Playgroud)

linux-device-driver gpio device-tree max732x.c

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

前缀 printk / pr_* 调用

我想在我的驱动程序(调试)输出前加上它的名字,即[myDriver] Actual message. 因为printk(level NAMEMACRO "Actual message\n")每次我想覆盖printk/pr_*实际包含该[myDriver]部分时都写起来很烦人。但是我想不出办法来做到这一点。在最好的情况下,解决方案不会强迫我更改代码中的printk/pr_*调用(更改调用后,这变得微不足道)。

这可能吗?(由于我包含了其他标题,而​​这些printk标题又包含标题,因此将始终定义此规则,因此不会按照不同的 so 答案中的建议链接到原始内容)

现在的司机有什么理由不注意这个文本吗?(还有另一种方法可以按驱动程序过滤 dmesg 吗?)

我有点意识到,dev_dbg但我还没有发现任何针对一般警告的开发人员,所以我将使用printk/ pr_err

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

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

使用 GCC 为 Linux 设备驱动程序编译 Intel AVX 内在函数

我在 corei7 上的 ubuntu 上运行 gcc 版本 4.8.2。

从谷歌搜索中找到了有关 AVX 内在函数的信息,但我不确定这组内在函数是否可以用于 Linux 设备驱动程序并对其进行编译。

如果可以,这里的任何人都可以告诉我什么是 makefile 的正确设置以及在 c 源中包含哪些头文件以使用 gcc 编译这个 avx?

谢谢。

gcc intel linux-device-driver linux-kernel avx

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

如何调整NAPI的投票期?

我可以理解Linux中的NAPI会从中断模式转换为轮询模式以处理高数据包速率.

NAPI使用权重来决定每个轮询周期中要处理的数据包数量; 它还确保每个轮询周期中的数据包处理少于一个jiffies.

但是,我无法在任何地方找到(谷歌)NAPI的民意调查期间?我们可以将民意调查期改为我们想要的任何值吗?

非常感谢您的任何帮助!


根据我的观察,似乎NAPI的民意调查时间是2秒,但我想确保我的观察是正确的.

linux networking linux-device-driver

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