#### long mode

长模式是指把寄存器扩展为64位，添加了8个整数寄存器和8个SSE寄存器。线性地址扩展到64位，物理地址扩展到52位。从本质上讲，长模式是给CPU增加了一个新的模式。

长模式不支持硬件任务切换或虚拟8086模式。长模式下由CS决定代码运行状态：64位(真正的长模式)，32位或16位(兼容模式)。分页是强制使用的，由于性能原因分段已经被简化了。长模式下的分段是平直模型(a flat model)，除了两个寄存器：FS和GS。可以通过MSR寄存器里的FS.base和GS.base来设置这两个段寄存器的基址。



#### 寄存器

##### 通用寄存器

`rax, rbx, rcx, rdx, rsi, rdi, rsp, rbp, r8~r15`

##### 指针寄存器

`rip`

##### 段寄存器

`cs, ds, ss, es, fs, gs `

##### 标志寄存器

`rflags`

##### 控制寄存器

`cr0, cr2, cr3, cr4, cr8`

- cr4寄存器各个位的意义。

| 位   | 标签 | 描述                                                         |
| ---- | ---- | ------------------------------------------------------------ |
| ...  |      |                                                              |
| 4    | PSE  | Page Size Extension，1：允许每个页为4M，0：每个页只能是4K    |
| 5    | PAE  | Physical Address Extension，1：允许使用32位以上物理地址，0：只能使用32位物理地址 |
| ...  |      |                                                              |

- cr3寄存器各个位的意义。cr3是页目录基址寄存器，保存当前页目录的物理地址。

| 位    | 标签 | 描述             |
| ----- | ---- | ---------------- |
|       |      |                  |
|       |      |                  |
| 12-63 |      | PML4的物理基地址 |

- cr0寄存器控制协处理器和保护控制。

其它的cr寄存器(cr1, cr5-7, cr9-15)是保留的，访问会产生异常。

##### model-specific register(MSR)

###### MTRR寄存器

MTRR(Memory type range registers)是一组处理器附属功能控制寄存器，它为系统软件提供如何访问内存区域的控制。它使用一组MSRs(model-specific registers)。对内存区域的访问模式有uncached, write-through, write-combining, write-protect,和 write-back.在write-back模式下，先写到cache并将cache标记为dirty，这样cache的内容就会被写到内存。

- MTRRCAP是一个只读的MSR，编号0xfe，它的作用是获取其它MTRR的信息。其结构如下：

  | 位    | 名称 | 意义                                                   |
  | ----- | ---- | ------------------------------------------------------ |
  | 0 - 7 | VCNT | 可变范围寄存器的数量                                   |
  | 8     | FIX  | 1:支持固定范围寄存器，0:不支持固定范围寄存器           |
  | 10    | WC   | 1:支持write-combining内存，0:不支持write-combining内存 |
  | 其它  | 保留 |                                                        |

- DEF_TYPE，编号0x2ff

- Variable-range Register Pair，base和mask两个寄存器成对出现，编号从0x200开始。一共有8对这样的寄存器，可映射8个可变的内存区域。

- Fixed-range，由11个64位的寄存器组成，共映射了88个固定内存范围。

- APIC-BASE，编号0x1b。

###### IA32_EFER

Extended Feature Enable Register (EFER)，使能SYSCALL和SYSRET指令，用于长模式(long mode)的进入和返回。编号0xC0000080。

| 位    | 标签  | 描述                           |
| ----- | ----- | ------------------------------ |
| 0     | SCE   | 系统调用扩展                   |
| 1-7   | 0     | 保留                           |
| 8     | LME   | 长模式使能                     |
| 10    | LMA   | 长模式active                   |
| 11    | NXE   | 非执行使能                     |
| 12    | SVME  | Secure Virtual Machine Enable  |
| 13    | LMSLE | Long Mode Segment Limit Enable |
| 14    | FFXSR | Fast FXSAVE/FXRSTOR            |
| 15    | TCE   | Translation Cache Extension    |
| 16-63 | 0     | 保留                           |

###### FS.base, GS.base

FS的编号0xC0000100，GS的编号0xC0000101。

###### KernelGSBase

编号0xC0000102。

###### IA32_TSC_AUX

编号0xC0000103。是一个辅助的TSC寄存器，与IA32_TSC结合使用。

##### 调试寄存器

`DR0-DR3, DR6, DR7`

##### 测试寄存器

`TR3-TR5, TR6, TR7`

##### 保护模式寄存器

`GDTR, LDTR, TR, IDTR`

#### cpuid指令

可以从[osdev](https://wiki.osdev.org/CPUID)获取关于cpuid的详细信息。

用于获取处理器信息，其操作码为0x0fa2。从eax寄存器获得输入，将信息输出到从eax到edx的四个寄存器。

| eax(写入)  | eax                  | ebx            | ecx            | edx            |
| ---------- | -------------------- | -------------- | -------------- | -------------- |
| 0          | 最大的基本功能号     | 厂商信息       | 厂商信息       | 厂商信息       |
| 1          | 处理器签名           | Misc Info      | 属性标志       | 属性标志       |
| 2          | cache和TLB           | cache和TLB     | cache和TLB     | cache和TLB     |
| 3          | 保留                 | 保留           | 处理器序列号   | 处理器序列号   |
| 0x80000000 | 最大的扩展功能号     |                |                |                |
| 0x80000001 |                      |                | 扩展功能标志   | 扩展功能标志   |
| 0x80000002 | 处理器名和商标       | 处理器名和商标 | 处理器名和商标 | 处理器名和商标 |
| 0x80000003 | 处理器名和商标       | 处理器名和商标 | 处理器名和商标 | 处理器名和商标 |
| 0x80000004 | 处理器名和商标       | 处理器名和商标 | 处理器名和商标 | 处理器名和商标 |
| 0x80000005 |                      |                |                |                |
| 0x80000006 |                      |                | L2cache信息    |                |
| 0x80000007 |                      |                |                | 电源管理       |
| 0x80000008 | 物理和虚拟地址的位数 |                |                |                |

当向eax写入1，并执行cpuid指令，可以从eax中得到处理器签名，从edx和ecx得到的是cpu支持哪些功能。edx的第12位MTRR即Memory Type Range Registers。edx的第9位即APIC。

当向eax写入0x80000001，并执行cpuid指令，可以从edx和ecx得到扩展功能标志。edx的第29位即long mode。

#### rdmsr和wrmsr指令

rdmsr指令的作用是读取msr寄存器的内容。msr寄存器由ecx寄存器的值决定，读取的内容高32位放在edx寄存器中，低32位放在eax寄存器中。

wrmsr指令是把edx:eax的值写入到由ecx指定的msr寄存器中。