domingo, 1 de agosto de 2010

Compilacion de kernel x86_64

Compilando el kernel para 64 bits (se supone correctamente configurado con #make menuconfig)
Al compilar sale este error:
arch/i386/boot/boot.h: Assembler messages:
arch/i386/boot/boot.h:112: Error: bad register name `%dil'
make[1]: *** [arch/x86_64/boot/video.o] Error 1
make: *** [bzImage] Error 2

Lo que puedo entender es que quiere compilar archivos de i386 porque debe haber algun driver o modulo que no tiene version para 64 e intenta compilarlo para 32. Lo que se debe hacer es cambiar la linea 112 que dice ahi: de la siguiente manera:
asm volatile("movb %%fs:%1,%0" : "=r" (v) : "m" (*(u8 *)addr));
por:
asm volatile("movb %%fs:%1,%0" : "=q" (v) : "m" (*(u8 *)addr));

El tag r se refiere a un registro de proposito general, y como se ha configurado para 64, el %dil cumple con esto; sin embargo, en x86 este registro no existe. Solo se necesita un registro que pueda accesar al byte mas bajo, y esto se consigue colocando el tag q.
Una mejor explicacion se puede conseguir aqui.
Hay que recalcar que en esa pagina usa como ejemplo un int y un char, y para nuestro es equivalente ya que se esta usando un u8. (Para los que no saben que es un u8 busquen en google: "kernel data types").

Disculpen la redaccion mediocre, pero esto solo es con fines de archivo.

No hay comentarios:

Publicar un comentario