我正在开发一个linux内核驱动程序,需要访问kmalloc和kfree函数。在我的研究中,这些应该在Studio.h表头中可用,但是文件在我的文件系统中不存在。
我尝试使用此解决方案更新我的includes:https://askubuntu.com/questions/75709/how-do-i-install-kernel-header-files,但它表明我已经拥有所有相关文件。
我的系统是一个运行kernel 4.15.0的VMWare Ubuntu 16.04安装。
有什么想法吗?

最佳答案

下面是一个非常简单的演示模块,它调用kmallockfree
演示c:

#define pr_fmt(fmt) "demo: " fmt

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

MODULE_LICENSE("GPL");

static int __init demo_init(void) {
    void *buf;

    buf = kmalloc(1000, GFP_KERNEL);
    pr_info("kmalloc returned %p\n", buf);
    kfree(buf);
    return 0;
}

static void __exit demo_exit(void) {
}

module_init(demo_init);
module_exit(demo_exit);

生成文件:
ifneq ($(KERNELRELEASE),)
# KBuild part of Makefile

obj-m += demo.o

else
# Normal part of Makefile
#

# Kernel build directory specified by KDIR variable
# Default to running kernel's build directory if KDIR not set externally
KDIR ?= "/lib/modules/`uname -r`/build"

all:
    $(MAKE) -C "$(KDIR)" M=`pwd` modules

clean:
    $(MAKE) -C "$(KDIR)" M=`pwd` clean

endif

您可以运行make为当前运行的内核版本构建模块:
$ make

或者可以设置KDIR为任意内核版本构建模块(在以下示例中由${KERNELVER}定义):
$ make KDIR="/lib/modules/${KERNELVER}/build"

(如果未指定KDIR,则生成文件会将其设置为当前运行内核的生成路径:"/lib/modules/`uname -r`/build"
如果构建成功,那么您肯定已经安装了内核头文件!
要测试模块,请运行:
$ sudo /sbin/insmod demo.ko
$ sudo /sbin/rmmod demo
$ sudo dmesg

内核日志上应该有一条类似的消息,显示kmalloc()调用的返回值:
[TIMESTAMP] demo: kmalloc returned xxxxxxxxxxxxxxx

模块还调用kfree()来释放分配的块。

08-16 02:13