Reputation: 317
I am new to C and Linux. I am trying to compile the below code but it gives some fatal error while compiling. Any help on fixing this appreciated.
Here is the code 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));
}
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
I get this error:
measurecpu.c:1:32: fatal error: linux/module.h: No such file or directory
#include <linux/module.h>
^
compilation terminated.
Upvotes: 5
Views: 2314
Reputation:
As the error message clearly says, the compiler couldn't find the header file module.h
in the folder linux
.
Refer to this post: error compiling: linux/module.h: No such file or directory
Upvotes: 1
Reputation: 17668
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
Usually the way to compile a kernel module is to use the kernel build system - ie you use make
instead of gcc
directly. You need to create a Makefile
and specify the object, which is the line obj-m := measurecpu.o
in your case. After that in the same directory, issue the make
command, which will yield the kernel object file 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
Note that kernel module is not user space program, so you cannot just run it. You will need to tell the kernel about that kernel module via insmod
, and check the results via dmesg
.
Upvotes: 5