x86/x86_64 CPU控制寄存器(Control Registers)

来源:互联网 发布:北京人在纽约 知乎 编辑:程序博客网 时间:2024/05/17 01:35

x86/x86_64CPU中提供了控制寄存器,来决定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/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");