Citando Intel® 64 and IA-32 Architectures Software Developer Manuals 3-650 Vol. 2A en movimiento desde y hacia los registros de control:
Esta instrucción puede ser ejecutada sólo cuando el nivel de privilegio actual es 0.
Lo que significa que la instrucción sólo se puede ejecutar en modo kernel
Un módulo del núcleo mínimo, que registra el contenido de cr0, CR2 y CR3 podría ser algo como esto (ruta de código de 32 bits no probado):
/* hello.c */
#include <linux/module.h>
#include <linux/kernel.h>
int init_module(void)
{
#ifdef __x86_64__
u64 cr0, cr2, cr3;
__asm__ __volatile__ (
"mov %%cr0, %%rax\n\t"
"mov %%eax, %0\n\t"
"mov %%cr2, %%rax\n\t"
"mov %%eax, %1\n\t"
"mov %%cr3, %%rax\n\t"
"mov %%eax, %2\n\t"
: "=m" (cr0), "=m" (cr2), "=m" (cr3)
: /* no input */
: "%rax"
);
#elif defined(__i386__)
u32 cr0, cr2, cr3;
__asm__ __volatile__ (
"mov %%cr0, %%eax\n\t"
"mov %%eax, %0\n\t"
"mov %%cr2, %%eax\n\t"
"mov %%eax, %1\n\t"
"mov %%cr3, %%eax\n\t"
"mov %%eax, %2\n\t"
: "=m" (cr0), "=m" (cr2), "=m" (cr3)
: /* no input */
: "%eax"
);
#endif
printk(KERN_INFO "cr0 = 0x%8.8X\n", cr0);
printk(KERN_INFO "cr2 = 0x%8.8X\n", cr2);
printk(KERN_INFO "cr3 = 0x%8.8X\n", cr3);
return 0;
}
void cleanup_module(void)
{
}
# Makefile
obj-m += hello.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
test: all
sudo insmod ./hello.ko
sudo rmmod hello
dmesg | tail
¿Está usted en Linux? –
@CiroSantilli 视 iro iro 视 视 视 ¿Te das cuenta de que esta pregunta tiene 4 años? Chris no se ha visto desde 2011. –
@DavidWohlferd Sí. Tal vez algún día él regrese. No estoy esperando que él responda. Las preguntas sobre SO son útiles para siempre. A menudo respondo esos, y algunas veces tengo rep. :-) –