我正在使用标准命令编译一个内核模块,其中包含大小为 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) 我最近一直在研究这个问题并且已经查看了各种文章和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一样,那么我可以看到名称冲突如何搞乱系统.这是什么原因?
我想不出任何其他原因,我想在盲目开始使用约定之前澄清这一点.
先感谢您
这样的标题听起来可能很愚蠢,但是我以前从未见过这样的东西,而且我真的不知道该如何描述它:
因此,我只是编写了第一个内核模块,并且使用了一个链表,该链表使用了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是 …
方法
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)
我应该如何进行?如何导入此符号或该怎么做?
粗略地说,我试图从内核空间发出 IOCTL 调用,而不去用户空间。(我在 SO 中找到的所有答案都建议通过用户空间)。
具体来说,我尝试/dev/random从内核空间(使用内核模块)填充熵池 ( ) [我知道这样做的危险;)]。从用户空间填充熵池是使用 IOCTL 完成的,例如rngaddentropy。有没有办法从内核空间做同样的事情?
我正在学习与用户级程序进行通信的内核模块,并且最初正在打开一个文件
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) 我只是想知道是否有一种方法可以从内核模块杀死用户空间程序。我知道kill命令不起作用,因为它是从用户空间到内核空间的系统调用。
我正在关注此链接(了解内核哎呀!)来调试内核模块
但该.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) 我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)
好像我缺少内核模块。
需要您的帮助来将标准内核模块添加到映像中(在哪里可以找到所有模块文件以及如何将其添加并加载到映像中)。
我有一个简单的内核模块,它创建了一个字符设备并且什么都不做。
我编写了这个测试字符设备的用户空间程序。
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)。