Hızlı yanıt: kod örneği
Quoting from Intel® 64 and IA-32 Architectures Software Developer Manuals 3-650 Vol. 2A
on moving to and from control registers:This instruction can be executed only when the current privilege level is 0.Which means the instruction can only be executed in kernel mode. A minimal kernel module, that logs the contents of cr0, cr2 and cr3 could look something like this (32-bit code path untested):
/* 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){}
# Makefileobj-m += hello.oall: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modulesclean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) cleantest: all sudo insmod ./hello.ko sudo rmmod hello dmesg | tail