c - 我们如何在 C 中编译内核代码?

标签 c linux gcc

我是 C 和 Linux 的新手。我正在尝试编译以下代码,但在编译时出现了一些 fatal error 。解决此问题的任何帮助表示赞赏。

这里是代码measurecpu.c:

#include <linux/module.h>      
#include <linux/kernel.h>      
#include <linux/init.h>         
#include <linux/hardirq.h>
#include <linux/preempt.h>
#include <linux/sched.h>
#include<stdio.h>

int main() {

uint64_t start, end;
int i=0;
asm volatile ("CPUID \ n \ t" "RDTSC \ n \ t" "mov %%edx, %0 \ n \ t" "mov %%eax, %1 \ n \ t": "=r" (cycles_high), "=r" (cycles_low)::  "%rax", "%rbx", "%rcx", "%rdx");

for(i=0; i<200000;i++) {}

asm volatile ("RDTSCP \ n \ t" "mov %%edx, %0 \ n \ t" "mov %%eax, %1 \ n \ t" "CPUID \ n \ t": "=r" (cycles_high1), "=r" (cycles_low1)::  "%rax", "%rbx", "%rcx", "%rdx");


start = ( ((uint64_t)cycles_high << 32) | cycles_low );
 end = ( ((uint64_t)cycles_high1 << 32) | cycles_low1 );
printk(KERN_INFO " \ n function execution time is %llu clock cycles",(end - start));

}

我正在尝试以这种方式编译它:

gcc -c -O2 -W -Wall -isystem /lib/modules/'uname -r'/build/include -D_KERNEL_ -DMODULE measurecpu.c

我收到这个错误:

measurecpu.c:1:32: fatal error: linux/module.h: No such file or directory
 #include <linux/module.h>      
                                ^
compilation terminated.

最佳答案

I am trying to compile it this way gcc -c -O2 -W -Wall -isystem /lib/modules/'uname -r'/build/include -D_KERNEL_ -DMODULE measurecpu.c

通常编译内核模块的方法是使用内核构建系统 - 即您直接使用 make 而不是 gcc。您需要创建一个 Makefile 并指定对象,在您的例子中是 obj-m := measurecpu.o 行。之后在同一目录中,发出 make 命令,这将生成内核目标文件 measurecpu.ko

# If KERNELRELEASE is defined, we've been invoked from the
# kernel build system and can use its language.
ifneq ($(KERNELRELEASE),)
    obj-m := measurecpu.o

# Otherwise we were called directly from the command
# line; invoke the kernel build system.
else
    KERNELDIR ?= /lib/modules/$(shell uname -r)/build
    PWD := $(shell pwd)

default:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules

clean:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules clean

endif

请注意,内核模块不是用户空间程序,因此您不能直接运行它。您需要通过 insmod 告知内核有关该内核模块的信息,并通过 dmesg 检查结果。

关于c - 我们如何在 C 中编译内核代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34980880/

相关文章:

c++ - 与 CAS 的原子交换(使用 gcc 同步内置函数)

c - 为什么(带符号的)强制转换有时只需要表示最小整数(32 位系统)?

closeir() 会导致现有列表的节点发生变化

Linux 项目 : bash script to archive and remove files

c - 将字符拆分为 C 中的单词

c++ - static_cast 转换构造函数 vs 转换运算符

c - 使用 C 编程语言对 XM1000 传感器设备进行编程 需要 if 语句

c - getch 和 putchar 没有返回就无法工作

linux - Bash 脚本 - 字符串比较似乎不起作用

android ndk : are -fPIC and -pie mututally exclusive?