|
|
@ -123,7 +123,7 @@ RISC-V汇编指令的格式与8086汇编是截然不同的。以最基础的加
|
|
|
|
|
|
|
|
|
|
|
|
`asm(“statements”);`
|
|
|
|
`asm(“statements”);`
|
|
|
|
|
|
|
|
|
|
|
|
该语句中“asm”也可以由“__asm__”来代替。在“asm”后面有时也会加上“__volatile__”表示编译器不要对括弧内的汇编代码进行任何优化,保持指令的原样。“asm”后面括号里面的便是汇编指令。例如:
|
|
|
|
该语句中“asm”也可以由“\_\_asm\_\_”来代替。在“asm”后面有时也会加上“\_\_volatile\_\_”表示编译器不要对括弧内的汇编代码进行任何优化,保持指令的原样。“asm”后面括号里面的便是汇编指令。例如:
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
```
|
|
|
|
asm(“li x17,81”); //将立即数81存入x17寄存器
|
|
|
|
asm(“li x17,81”); //将立即数81存入x17寄存器
|
|
|
@ -609,7 +609,7 @@ csrw medeleg, 1<<0 | 1<< 3 | 1<<8 | 1<<12 | 1<<13 | 1<<15
|
|
|
|
|
|
|
|
|
|
|
|
图1.6 Sv39中逻辑地址的结构
|
|
|
|
图1.6 Sv39中逻辑地址的结构
|
|
|
|
|
|
|
|
|
|
|
|
从图1.6中,我们看到逻辑地址在切分后,从左到右依次的分布是:12位的page offset(即页内偏移)、9位的一级虚页号VPN[0](Virtual Page Number)、9位的二级虚页号VPN[1](Virtual Page Number)、9位的三级虚页号VPN[0](Virtual Page Number)。其中的一级虚页号又常被称为页表(Page Table,简写为PT)编号,而二级和三级虚页号又常分别被称为页目录(Page Directory,简写为PD)和根目录编号。
|
|
|
|
从图1.6中,我们看到逻辑地址在切分后,从右到左依次的分布是:12位的page offset(即页内偏移)、9位的一级虚页号VPN[0](Virtual Page Number)、9位的二级虚页号VPN[1](Virtual Page Number)、9位的三级虚页号VPN[2](Virtual Page Number)。其中的一级虚页号又常被称为页表(Page Table,简写为PT)编号,而二级和三级虚页号又常分别被称为页目录(Page Directory,简写为PD)和根目录编号。
|
|
|
|
|
|
|
|
|
|
|
|
页内偏移为12位,这很容易理解:因为我们的基础页的大小是4KB的,其地址长度就是12位。但是,为什么我们的VPN都是9位的呢?这是因为我们的页表(或者页目录)是需要保存在内存(物理)页面中的,而4KB大小的基础页能够保存的页表项(Page Table Entry,简称为PTE)或页目录项(Page Directory Entry,简称为PDE)的个数是512(=2^9)个!为了讲清楚这个问题,我们需要进一步观察图1.7中PTE或PDE的格式。
|
|
|
|
页内偏移为12位,这很容易理解:因为我们的基础页的大小是4KB的,其地址长度就是12位。但是,为什么我们的VPN都是9位的呢?这是因为我们的页表(或者页目录)是需要保存在内存(物理)页面中的,而4KB大小的基础页能够保存的页表项(Page Table Entry,简称为PTE)或页目录项(Page Directory Entry,简称为PDE)的个数是512(=2^9)个!为了讲清楚这个问题,我们需要进一步观察图1.7中PTE或PDE的格式。
|
|
|
|
|
|
|
|
|
|
|
|