2016-01-24 16 views
5

C ve Linux'ta yeniyim. Aşağıdaki kodu derlemeye çalışıyorum ama derlerken bazı önemli hatalar veriyor. Bunu düzeltmek için herhangi bir yardım takdir etti.Çekirdek kodunu C'de nasıl derleriz?

#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)); 

} 

ben bu şekilde derlemek çalışıyorum: Genellikle

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

o zaman bölme hatalarına alamayan yapı hatalarını alırsanız. –

+0

oops Yani kodu nasıl kurarız. yanlış ifadeler için üzgünüm. – Wanderer

+3

/lib/modules/'uname -r'/build/include <öğesini düzenleyecektir - bence burada ** backticks ** 'a ihtiyacınız var. Ya da $ (uname -r) kullanın. 'uname -r' sadece bu dize olacak, hiçbir ikame yapılmıyor. – Ctx

cevap

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

:

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

bu hatayı alıyorum İşte

kod measurecpu.c olduğunu Bir çekirdek modülünü derleme yolu Çekirdek oluşturma sistemini kullanmak için - gcc yerine make kullanın. Bir Makefile oluşturmalı ve bu durumda satır obj-m := measurecpu.o olan nesneyi belirtmeniz gerekir. sadece o çalışmaz böylece aynı dizinde Bundan sonra ise mesele çekirdek nesne dosyasını 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 

Not o çekirdek modülü verecektir make komutu, kullanıcı uzay programı değildir. Çekirdeğe insmod aracılığıyla çekirdek modülünü anlatmanız ve sonuçları dmesg aracılığıyla kontrol etmeniz gerekir.

+0

Çok teşekkürler :) – Wanderer

İlgili konular