这是我第一次在 linux 内核中实现驱动程序并面临这个问题的经验。
我正在尝试在我的角色驱动程序中实现“poll()”。我已经调用了 poll_wait() 并传递了一个等待队列。
当从用户空间程序打开此驱动程序的设备文件并在此设备文件描述符(fd)上调用“轮询”系统调用时,即使没有数据要发送到用户空间,轮询系统调用也会立即退出。
它不等待甚至超时时间。
我无法弄清楚是什么导致了这个问题。
任何人都可以提出任何解决方案吗?
我在这里遇到一种情况,我需要针对不同的配置构建相同的内核。现在我试图在不进行 make clean 的情况下构建内核,但这给我带来了问题。有可能一个配置具有一些内置驱动程序,而其他配置可能具有与模块相同的驱动程序。就我而言,我想避免 make clean 以节省时间!编译一个新的内核需要很多时间,因为我之前编译过相同的内核,只更改了几个驱动程序/模块,我想知道除了清理整个内核之外的任何替代选项。
谢谢!
我基本上想知道两件事
\n\n我从 LKD Robert Love 中得到了以下摘录,任何人都可以更好地解释在给出 __GFP_HIGHMEM 标志时使用 alloc_pages() 的确切问题是什么。
\n\n第 240 页 第 12 章
\n\n\n\n您不能将 __GFP_HIGHMEM 指定为 __get_free_pages() 或 \n kmalloc()。因为它们都返回逻辑地址,而不是页结构,所以这些函数可能会分配当前未映射到内核 xe2x80x99s 虚拟地址空间中的内存,因此不会分配内存。有一个逻辑地址。只有 alloc_pages() 可以分配高内存。但是,大多数分配不会指定区域修饰符,因为 ZONE_NORMAL 就足够了。
\n
内核版本:3.13.0-32-generic
\n\n当我构建模块时出现错误
\n\n\nmake -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 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) 我需要安全地擦除嵌入式系统中的 MMC 卡。然而,我的ioctl(BLKSECDISCARD)回报EOPNOTSUPP,(也是如此BLKDISCARD)。
MMC驱动通过读取内核代码,通过设置使能DISCARD QUEUE_FLAG_DISCARD,kernel/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功能,但不确定我需要做什么,或者即使它可以在我的嵌入式系统上实现。能做到吗?
我是 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) 我有一个通过 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) 我有两个设备树节点,一个设置 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 引脚。
目前我已经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指针指向?
将第一个操作数从值0更改0x19016bc83000为第一个mov instruction movq $0, %rdx
将第一个操作数从 value0x7ffff7fc6000更改0x19016bc74000为第二个mov instruction movq $0x7ffff7fc6000, %rsi
将第一个操作数从 value0x19016bc83000更改0为第三个mov instruction movq $0x19016bc83000, %rcx
你知道我怎么能这样做吗?
使用objdump -D显示反汇编此代码段
0000000000001000 <sr_function>: …Run Code Online (Sandbox Code Playgroud)