损坏的 Linux 内核 <linux/...> 包含在 Ubuntu 20.04 上

问题描述 投票:0回答:1

我正在尝试在 Ubuntu 20.04 上的 VS Code 中编写内核模块

问题是我的包含内容似乎完全损坏了。

首先,我没有

<linux/uaccess.h>
<asm/uaccess.h>
标题。其次,我在我的文件顶部添加了许多包含内容,例如:

#include <linux/module.h>
#include <linux/kernel.h>

但是,没有找到像

printk()
这样的内核内容的定义。像
bool
NULL
这样的宏也没有在我的
linux/types.h
中定义。

我尝试过

sudo apt-get install linux-headers-generic

这是我的

linux/module.h

/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
#ifndef _LINUX_MODULE_H
#define _LINUX_MODULE_H

/* Flags for sys_finit_module: */
#define MODULE_INIT_IGNORE_MODVERSIONS  1
#define MODULE_INIT_IGNORE_VERMAGIC 2

#endif /* _LINUX_MODULE_H */

我的

linux/kernel.h

/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
#ifndef _LINUX_KERNEL_H
#define _LINUX_KERNEL_H

#include <linux/sysinfo.h>
#include <linux/const.h>

#endif /* _LINUX_KERNEL_H */

c linux linux-kernel kernel-module linux-kernel-headers
1个回答
0
投票

这些标头是内核空间标头,这意味着它们无法在用户空间标头中找到(

/usr/include/linux
)。在我的 Fedora 机器上,我是这样诊断的。

1.确保这些标头存在

我使用简单的

find /usr -name uaccess.h 2>/dev/null
来列出所有文件。结果可能如下所示:

/usr/src/kernels/6.6.4-200.fc39.x86_64/arch/x86/include/asm/uaccess.h
/usr/src/kernels/6.6.4-200.fc39.x86_64/include/asm-generic/uaccess.h
/usr/src/kernels/6.6.4-200.fc39.x86_64/include/linux/uaccess.h
/usr/src/kernels/6.6.6-200.fc39.x86_64/arch/x86/include/asm/uaccess.h
/usr/src/kernels/6.6.6-200.fc39.x86_64/include/asm-generic/uaccess.h
/usr/src/kernels/6.6.6-200.fc39.x86_64/include/linux/uaccess.h
/usr/src/kernels/6.6.7-200.fc39.x86_64/arch/x86/include/asm/uaccess.h
/usr/src/kernels/6.6.7-200.fc39.x86_64/include/asm-generic/uaccess.h
/usr/src/kernels/6.6.7-200.fc39.x86_64/include/linux/uaccess.h

2.如何使用这些内核头文件

使用这些标头的直观方法是在编译时将它们全部包含在内。但是,由于链接问题,这很容易出错。

(某种程度上)标准的方法是将其定义为模块。

源代码:

// printk-example.c

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/uaccess.h>

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("A simple kernel module with printk");

static int __init hello_init(void)
{
    printk(KERN_INFO "Hello, this is your kernel module!\n");
    return 0;
}

static void __exit hello_exit(void)
{
    printk(KERN_INFO "Goodbye, exiting your kernel module!\n");
}

module_init(hello_init);
module_exit(hello_exit);

生成文件:

obj-m += printk-example.o

all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

您可以在为您的机器运行内核模块时搜索其余内容。

我希望这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.