2016-01-24 10 views
5

Sono nuovo di C e Linux. Sto cercando di compilare il codice qui sotto, ma dà qualche errore fatale durante la compilazione. Qualsiasi aiuto su come risolvere ciò è apprezzato.Come si compila il codice del kernel in C?

ecco il codice 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)); 

} 

Sto cercando di compilarlo in questo modo:

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

ottengo questo errore:

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

Se si ottiene costruire errori, allora non è possibile ottenere gli errori di segmentazione. –

+0

oops intendevo come si costruisce il codice. scusa per la formulazione sbagliata. editeremo – Wanderer

+3

/lib/modules/'uname -r'/build/include <- Penso che tu abbia bisogno di ** backtick ** qui. Oppure usa $ (uname -r). 'uname -r' sarà solo quella stringa, non verrà eseguita alcuna sostituzione. – Ctx

risposta

5

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

Di solito il modo per compilare un modulo del kernel utilizzare il sistema di compilazione del kernel, ovvero utilizzare make anziché gcc direttamente. Devi creare un Makefile e specificare l'oggetto, che è la linea obj-m := measurecpu.o nel tuo caso. Dopo che nella stessa directory, eseguire il comando make, che produrrà il file oggetto del kernel 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 

Si noti che il modulo del kernel non è il programma spazio utente, in modo che non si può semplicemente eseguirlo. È necessario comunicare al kernel il modulo del kernel tramite insmod e verificare i risultati tramite dmesg.

+0

Grazie mille :) – Wanderer

Problemi correlati