标签: kernel-module

从内核模块的结构中删除填充

我正在使用标准命令编译一个内核模块,其中包含大小为 34 的结构。

make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules
Run Code Online (Sandbox Code Playgroud)

将以sizeof(some_structure)36 而不是 34 的形式出现,即编译器正在填充结构。

如何删除此填充?

运行make V=1显示 gcc 编译器选项传递为

make -I../inc -C /lib/modules/2.6.29.4-167.fc11.i686.PAE/build M=/home/vishal/20100426_eth_vishal/organised_eth/src modules

make[1]: Entering directory `/usr/src/kernels/2.6.29.4-167.fc11.i686.PAE'
test -e include/linux/autoconf.h -a -e include/config/auto.conf || (  \
 echo;        \
 echo "  ERROR: Kernel configuration is invalid.";  \
 echo "         include/linux/autoconf.h or include/config/auto.conf are missing."; \
 echo "         Run 'make oldconfig && make prepare' on kernel src to fix it."; \
 echo;        \
 /bin/false)

mkdir -p /home/vishal/20100426_eth_vishal/organised_eth/src/.tmp_versions ; …
Run Code Online (Sandbox Code Playgroud)

gcc makefile packing kernel-module linux-kernel

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

为什么在LKM中使用静态函数是一种约定

我最近一直在研究这个问题并且已经查看了各种文章和stackoverflow帖子,但我似乎无法找到一个直接的答案.在创建内核模块时,我看到大多数代码如下所示:

#include <linux/init.h>
static int test_init(void) {return 0;}
static void test_exit(void) {;}
module_init(test_init);
module_exit(test_exit);
Run Code Online (Sandbox Code Playgroud)
  • 我发现的一个可能原因是,这样做会增加将恶意代码注入正在运行的模块的难度.

  • 另一个是命名空间不那么混乱,但这不仅仅是你正在链接和编译的内核模块的上下文中的问题吗?如果insmod实际上将代码链接到内核就像ld一样,那么我可以看到名称冲突如何搞乱系统.这是什么原因?

我想不出任何其他原因,我想在盲目开始使用约定之前澄清这一点.

先感谢您

c linux operating-system kernel kernel-module

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

linux内核宏如何用作函数?

这样的标题听起来可能很愚蠢,但是我以前从未见过这样的东西,而且我真的不知道该如何描述它:

因此,我只是编写了第一个内核模块,并且使用了一个链表,该链表使用了linux/list.h头文件。其中有一个宏:

400 /**
401  * list_for_each_entry  -       iterate over list of given type
402  * @pos:        the type * to use as a loop cursor.
403  * @head:       the head for your list.
404  * @member:     the name of the list_struct within the struct.
405  */
406 #define list_for_each_entry(pos, head, member)                          \
407         for (pos = list_entry((head)->next, typeof(*pos), member);      \
408              prefetch(pos->member.next), &pos->member != (head);        \
409              pos = list_entry(pos->member.next, typeof(*pos), member))
Run Code Online (Sandbox Code Playgroud)

而且,我用它是这样的(假设list_head是链表的头,并且list是 …

c linux macros kernel kernel-module

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

linux内核模块:内核方法未定义(kthread_create_on_cpu)

方法

struct task_struct *kthread_create_on_cpu(int(*threadfn)(void *data),
    void *data, unsigned int cpu,
    const char *namefmt)
Run Code Online (Sandbox Code Playgroud)

在 kthread.c 文件中定义并在 kthread.h 中原型化。但它没有出口。

在我的驱动程序中,我想在给定的 CPU 上启动一个 kthread,所以我这样做:

#include <linux/kthread.h>

int udpsrv_start_single( unsigned int cpu)
{
     DEBUG_PRINT_INFO( "[udpsrv] udpsrv_start: Initializing...\n");
     //(...)
     kthread->thread = kthread_create_on_cpu((void *)kthread_start_single, 
                                                      NULL, cpu, "mpsrv");
     //(...)
Run Code Online (Sandbox Code Playgroud)

我可以编译,但在解析 MODPOST 上的模块符号时出现链接错误:

1>    LD [M]  /tmp/VisualKernel/mpsrvlkm.o
1>    Building modules, stage 2.
1>    MODPOST 1 modules
1>EXEC : warning : "kthread_create_on_cpu"[/tmp/VisualKernel/mpsrvlkm.ko] undefined!
Run Code Online (Sandbox Code Playgroud)

我应该如何进行?如何导入此符号或该怎么做?

c linux driver kernel-module linux-kernel

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

来自内核空间的 IOCTL

粗略地说,我试图从内核空间发出 IOCTL 调用,而不去用户空间。(我在 SO 中找到的所有答案都建议通过用户空间)。

具体来说,我尝试/dev/random从内核空间(使用内核模块)填充熵池 ( ) [我知道这样做的危险;)]。从用户空间填充熵池是使用 IOCTL 完成的,例如rngaddentropy。有没有办法从内核空间做同样的事情?

random kernel ioctl kernel-module linux-kernel

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

C替换fputs()/ fgets()with open()

我正在学习与用户级程序进行通信的内核模块,并且最初正在打开一个文件

FILE *pFile = fopen(...)
Run Code Online (Sandbox Code Playgroud)

用它写信给它

char *str = malloc(10);
fputs(str, pFile);
Run Code Online (Sandbox Code Playgroud)

但是现在我需要使用功能#include <fcntl.h>来尝试一些异步通知,而我需要使用的示例

int pFile;
pFile = open("/dev/mymodule", O_RDWR);
Run Code Online (Sandbox Code Playgroud)

我认为我不能再使用,fputs()或者fgets()因为它需要一个FILE *ptr而我int现在已经有了.我想我应该使用write()read()不是.

这是怎么回事?

write(pFile, str,  sizeof(str));

char line[256];
    while (read(pFile, line, 256) != NULL) {
            printf("%s", line);
        }
Run Code Online (Sandbox Code Playgroud)

c fgets kernel-module fcntl

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

从内核模块杀死用户空间程序

我只是想知道是否有一种方法可以从内核模块杀死用户空间程序。我知道kill命令不起作用,因为它是从用户空间到内核空间的系统调用。

c kernel-module linux-kernel

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

如何调试linux内核模块?

我正在关注此链接(了解内核哎呀!)来调试内核模块

但该.init.text部分的内容全部为零.因此,我无法看到导致此崩溃的确切行.

我的/var/log/syslog输出是:

Aug  1 18:07:33 manik kernel: [  149.855117] BUG: unable to handle kernel paging request at 0000000000ef6850
Aug  1 18:07:33 manik kernel: [  149.855136] IP: [<ffffffffc07577b0>] register_scard+0x240/0x660 [scard]
Aug  1 18:07:33 manik kernel: [  149.855143] PGD 0
Aug  1 18:07:33 manik kernel: [  149.855146] Oops: 0000 [#1] SMP
Aug  1 18:07:33 manik kernel: [  149.855151] Modules linked in: scard(POE+) kmikohn(OE) fmon(OE) khcd(OE) kcid(OE) kspi(POE) kpwrfail(OE) snd_usb_audio input_leds joydev hid_multitouch snd_usbmidi_lib i2c_ocores intel_rapl …
Run Code Online (Sandbox Code Playgroud)

kernel-module linux-kernel

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

Yocto:向映像添加内核模块

iptables使用 . 将包添加到我的设备映像中CORE_IMAGE_EXTRA_INSTALL += "iptables"

我尝试在设备上运行它并收到以下错误消息:

modprobe: FATAL: Module ip_tables not found in directory /lib/modules/4.9.11-1.0.0+gc27010d
iptables v1.6.1: can't initialize iptables table `filter': Table does not exist (do you need to insmod?)
Perhaps iptables or your kernel needs to be upgraded.
Run Code Online (Sandbox Code Playgroud)

好像我缺少内核模块。

需要您的帮助来将标准内核模块添加到映像中(在哪里可以找到所有模块文件以及如何将其添加并加载到映像中)。

kernel-module yocto

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

防止删除繁忙的内核模块

我有一个简单的内核模块,它创建了一个字符设备并且什么都不做。

我编写了这个测试字符设备的用户空间程序。

int main()
{
    int fd;

    fd = open("/dev/ebbchar", O_RDWR);
    if (fd < 0)
        err(1, "open");

    sleep(10);

    ret = close(fd);
    if (ret < 0)
        err(1, "close");
}
Run Code Online (Sandbox Code Playgroud)

程序在 10 秒后退出。

但是如果同时我用 rmmod 或 modprobe 删除了模块,那么 10 秒后程序段错误或挂起,并且有一个内核 oops。

如何导致 rmmod 失败,或者是否有安全删除模块的方法?

我的模块可以在其 __exit 函数中关闭文件描述符吗?

我假设崩溃是由在字符文件操作中close()间接调用release回调的函数引起的,该release函数不再存在,因为模块已被删除。

可以在此处找到内核模块的源代码(搜索清单 2)。

linux kernel kernel-module

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