标签: linux-device-driver

轮询立即从驱动程序退出

这是我第一次在 linux 内核中实现驱动程序并面临这个问题的经验。

我正在尝试在我的角色驱动程序中实现“poll()”。我已经调用了 poll_wait() 并传递了一个等待队列。

当从用户空间程序打开此驱动程序的设备文件并在此设备文件描述符(fd)上调用“轮询”系统调用时,即使没有数据要发送到用户空间,轮询系统调用也会立即退出。

它不等待甚至超时时间。

我无法弄清楚是什么导致了这个问题。

任何人都可以提出任何解决方案吗?

c linux-device-driver linux-kernel

3
推荐指数
1
解决办法
926
查看次数

在构建 linux 内核之前只清理选定的模块

我在这里遇到一种情况,我需要针对不同的配置构建相同的内核。现在我试图在不进行 make clean 的情况下构建内核,但这给我带来了问题。有可能一个配置具有一些内置驱动程序,而其他配置可能具有与模块相同的驱动程序。就我而言,我想避免 make clean 以节省时间!编译一个新的内核需要很多时间,因为我之前编译过相同的内核,只更改了几个驱动程序/模块,我想知道除了清理整个内核之外的任何替代选项。

谢谢!

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

3
推荐指数
1
解决办法
3656
查看次数

为什么 __GFP_HIGHMEM 标志不能应用于 __get_free_page() 或 kmalloc()

我基本上想知道两件事

\n\n
    \n
  1. kmalloc 是如何工作的,我的意思是 kmalloc 调用哪个函数来分配内存,是 alloc_pages() 还是 __ger_free_pages()。
  2. \n
  3. 为什么 __GFP_HIGHMEM 标志不能应用于 __get_free_page() 或 kmalloc()
  4. \n
\n\n

我从 LKD Robert Love 中得到了以下摘录,任何人都可以更好地解释在给出 __GFP_HIGHMEM 标志时使用 alloc_pages() 的确切问题是什么。

\n\n

第 240 页 第 12 章

\n\n
\n

您不能将 __GFP_HIGHMEM 指定为 __get_free_pages() 或 \n kmalloc()。因为它们都返回逻辑地址,而不是页结构,所以这些函数可能会分配当前未映射到内核 xe2x80x99s 虚拟地址空间中的内存,因此不会分配内存。有一个逻辑地址。只有 alloc_pages() 可以分配高内存。但是,大多数分配不会指定区域修饰符,因为 ZONE_NORMAL 就足够了。

\n
\n

linux linux-device-driver linux-kernel

3
推荐指数
1
解决办法
1817
查看次数

错误:函数“create_proc_entry”的隐式声明

内核版本:3.13.0-32-generic

\n\n

当我构建模块时出现错误

\n\n
\n

make -C /lib/modules/3.13.0-32-generic/build\n M=/home/wipro/Downloads/proc 模块 make[1]: 进入目录\n /usr/src/linux-headers-3.13.0-32-generic\' CC [M] \n /home/wipro/Downloads/proc/proc.o /home/wipro/Downloads/proc/proc.c:\n In function \xe2\x80\x98proc_win_init\xe2\x80\x99: /home/wipro/Downloads/proc/proc.c:21:5:\n error: implicit declaration of function \xe2\x80\x98create_proc_entry\xe2\x80\x99\n [-Werror=implicit-function-declaration]\n if ((file = create_proc_entry("rel_time", 0666, parent)) == NULL) {\n ^ /home/wipro/Downloads/proc/proc.c:21:15: warning: assignment makes pointer from integer without a cast [enabled by default]\n if ((file = create_proc_entry("rel_time", 0666, parent)) == NULL) {\n ^ /home/wipro/Downloads/proc/proc.c:25:9: error: dereferencing pointer to incomplete type\n file->read_proc = time_read;\n ^ /home/wipro/Downloads/proc/proc.c:26:9: error: dereferencing pointer to incomplete type\n …

linux kernel linux-device-driver

3
推荐指数
1
解决办法
3497
查看次数

从 Python 更新 proc 条目的推荐方法是什么

我有一个 linux proc 条目,其中/proc/sys/fs/offs/ts/enable切换自定义内核模块中的标志。将值设置为 1 将启用模块中的一种模式,设置为 0 将禁用该模式。

在 bash 中,要启用该模式,我只需这样做

echo 1 > /proc/sys/fs/offs/ts/enable
Run Code Online (Sandbox Code Playgroud)

要禁用它,

echo 0 > /proc/sys/fs/offs/ts/enable
Run Code Online (Sandbox Code Playgroud)

我有一个用 Python 2.7 编写的守护进程,它将查找一些外部事件触发器,当该事件触发时,应该启用或禁用内核模块中的功能。该守护进程以 root 权限运行,因此我不应该遇到任何类型的权限问题。

有没有推荐的方法从 python 设置这个值?

例如,假设我的函数现在看起来像这样。

def set_mode(enable=True):
    with open('/proc/sys/fs/offs/ts/enable', 'w') as p:
        if enable:
            p.write("1")
        else:
            p.write("0")
        p.flush()
Run Code Online (Sandbox Code Playgroud)

python linux linux-device-driver linux-kernel

3
推荐指数
1
解决办法
2307
查看次数

eMMC 卡的安全删除(BLKSECDISCARD 返回 EOPNOTSUPP)

我需要安全地擦除嵌入式系统中的 MMC 卡。然而,我的ioctl(BLKSECDISCARD)回报EOPNOTSUPP,(也是如此BLKDISCARD)。

MMC驱动通过读取内核代码,通过设置使能DISCARD QUEUE_FLAG_DISCARDkernel/linux/drivers/mmc/card/queue.c mmc_queue_setup_discard()调用如下:

if (mmc_can_erase(card))
    mmc_queue_setup_discard(mq->queue, card);
Run Code Online (Sandbox Code Playgroud)

其中mmc_can_erase()定义kernel/linux/drivers/mmc/core/core.c为:

int mmc_can_erase(struct mmc_card *card)
{
    if ((card->host->caps & MMC_CAP_ERASE) &&
        (card->csd.cmdclass & CCC_ERASE) && card->erase_size)
        return 1;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

mmc_can_erase()需要满足什么条件?

是卡的特性、控制器、驱动程序、内核的构建方式还是其他什么?

理想情况下,我想启用该BLKSECDISCARD功能,但不确定我需要做什么,或者即使它可以在我的嵌入式系统上实现。能做到吗?

security sd-card erase linux-device-driver

3
推荐指数
1
解决办法
1775
查看次数

cdev_add 和 device_create 函数之间的区别?

我是 linux 设备驱动程序开发的新手。我不明白 cdev_add 到底是做什么的。我查看了一些简单的字符设备驱动程序代码,我看到 cdev_add 和 device_create 函数一起使用。例如:

/* Create device class, visible in /sys/class */
dummy_class = class_create(THIS_MODULE, "dummy_char_class");
if (IS_ERR(dummy_class)) {
    pr_err("Error creating dummy char class.\n");
    unregister_chrdev_region(MKDEV(major, 0), 1);
    return PTR_ERR(dummy_class);
}

/* Initialize the char device and tie a file_operations to it */
cdev_init(&dummy_cdev, &dummy_fops);
dummy_cdev.owner = THIS_MODULE;
/* Now make the device live for the users to access */
cdev_add(&dummy_cdev, devt, 1);

dummy_device = device_create(dummy_class,
                            NULL,   /* no parent device */
                            devt,    /* associated dev_t …
Run Code Online (Sandbox Code Playgroud)

linux linux-device-driver linux-kernel

3
推荐指数
1
解决办法
1907
查看次数

usb_control_msg 返回 -EAGAIN

我有一个通过 USB 接口的定制板。我正在编写 USB Linux 驱动程序。

当我在虚拟机上测试它时,一切都工作正常。但是当我切换到真实硬件并在硬件上使用 Yocto 并运行以下代码时。它失败并显示 -EAGAIN。

retval = usb_control_msg(serial->dev,
        usb_rcvctrlpipe(serial->dev, 0),
        CP210X_GET_MDMSTS,
        USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
        0,
        i,
        (void *)&modem_status,
        1,
        USB_CTRL_SET_TIMEOUT);
Run Code Online (Sandbox Code Playgroud)

retval 返回 -11。我不确定为什么虚拟机上没有发生这种情况,因为唯一的区别是 PIC 板连接到 X86 定制板并运行 Linux。

dmesg 输出:

transfer buffer not dma capable
------------[ cut here ]------------
WARNING: CPU: 1 PID: 754 at /usr/src/kernel/drivers/usb/core/hcd.c:1595 usb_hcd_map_urb_for_dma+0x3e6/0x5b0
Modules linked in: cp2108(O)
CPU: 1 PID: 754 Comm: test_quad Tainted: G           O    4.14.68-intel-pk-standard #1
task: ffff9a33b7d4a4c0 task.stack: ffff9ce5c0130000
RIP: 0010:usb_hcd_map_urb_for_dma+0x3e6/0x5b0
RSP: 0018:ffff9ce5c0133b08 EFLAGS: 00010296
RAX: …
Run Code Online (Sandbox Code Playgroud)

linux usb linux-device-driver linux-kernel yocto

3
推荐指数
1
解决办法
830
查看次数

两个节点之间的设备树依赖关系

我有两个设备树节点,一个设置 GPIO 引脚,另一个配置一个 i2c 总线,例如:

&gpio2 {
  en-gpio {
    gpio-hog;
    gpios = <5 0>;
    output-high;
  };
};

&i2c1 {
  gpiom1: gpio@27 {
    compatible = "microchip,mcp23008";
    gpio-controller;
    #gpio-cells = <2>;
    reg = <0x27>;
  };
};
Run Code Online (Sandbox Code Playgroud)

如何在 i2c 节点和 GPIO 节点之间添加依赖关系?我想要实现的是,应该在初始化 i2c 上的设备之前设置 GPIO 引脚。

linux-device-driver linux-kernel device-tree

3
推荐指数
1
解决办法
3585
查看次数

如何通过Linux内核中的c指针覆盖x86`movq`指令的操作数值

目前我已经pageA在 linux 内核的一页上使用汇编编写了一个代码段。代码是

SYM_CODE_START(sr_function)
    movq $0, %rdx
    movq $0x7ffff7fc6000, %rsi 
    movq $0x19016bc83000, %rcx
    movq $9, %rdx
    movq $0, %rdx
    jmp goto_fce_func
SYM_CODE_END(sr_function)
Run Code Online (Sandbox Code Playgroud)

在运行时,我想mov通过 c 指针覆盖指令的第一个操作数,例如,我pageA使用kmap(pageA).

这意味着,现在第一条指令movq $0, %rdx具有地址,例如0x1000

我想用C指针指向?

  1. 将第一个操作数从值0更改0x19016bc83000为第一个mov instruction movq $0, %rdx

  2. 将第一个操作数从 value0x7ffff7fc6000更改0x19016bc74000为第二个mov instruction movq $0x7ffff7fc6000, %rsi

  3. 将第一个操作数从 value0x19016bc83000更改0为第三个mov instruction movq $0x19016bc83000, %rcx

你知道我怎么能这样做吗?

使用objdump -D显示反汇编此代码段

0000000000001000 <sr_function>: …
Run Code Online (Sandbox Code Playgroud)

c linux kernel linux-device-driver linux-kernel

3
推荐指数
1
解决办法
79
查看次数