x86/x86_64 CPU中提供了控制寄存器,来决定CPU的操作模式和当前执行任务的属性。这些寄存器在32位模式下是32bit,在64位模式中,控制寄存器扩展为64位。
CPU架构中共有CR0、CR1、CR2、CR3、CR4、CR8共6个控制寄存器,如下图。
各个控制寄存器的作用如下:
CR0:包含当前处理器运行的控制标志。
CR1:保留。
CR2:包含发生页面错误时的线性地址。
CR3:页面目录表(Page Directory Table)的物理地址。
CR4:包含处理器扩展功能的标志位。
CR8:提供对任务优先级寄存器(Task Priority Register)的读写(仅在64位模式下存在)。
对控制寄存器的读写是通过MOV CRn指令来实现
下面代码(注意:本源码是32位系统)可用来读取CRn控制寄存器的值。
#include <linux/module.h> #include <linux/proc_fs.h> static char modname[] = "cr4"; static int cr4; static int my_get_info( char *buf, char **start, off_t off, int count ) { int len = 0; asm(" movl %cr4, %ebx \n movl %ebx, cr4 "); len += sprintf( buf+len, "cr4=%08X ", cr4 ); len += sprintf( buf+len, "PSE=%X ", (cr4>>4)&1 ); len += sprintf( buf+len, "PAE=%X ", (cr4>>5)&1 ); len += sprintf( buf+len, "\n" ); return len; } int init_module( void ) { printk( "<1>\nInstalling \'%s\' module\n", modname ); create_proc_info_entry( modname, 0, NULL, my_get_info ); return 0; } void cleanup_module( void ) { remove_proc_entry( modname, NULL ); printk( "<1>Removing \'%s\' module\n", modname ); } MODULE_LICENSE("GPL");