update chapter2.md.

pull/1/head
ZimingYuan 4 years ago committed by Gitee
parent 89c6c98a2d
commit 4f13a9786e

@ -345,7 +345,7 @@ typedef struct {
} Elf64_Ehdr;
```
ELF文件头比较重要的几个结构体成员是e_entry、e_phoff、e_phnum、e_shoff、e_shnum。其中e_entry是可执行程序的入口地址即从内存的这个闻之开始执行在这里入口地址是虚拟地址也就是链接地址e_phoff和e_phnum可以用来找到所有的程序头表项e_phoff是程序头表的第一项相对于ELF文件的开始位置的偏移而e_phnum则是表项的个数同理e_ shoff和e_ shnum可以用来找到所有的节头表项。
ELF文件头比较重要的几个结构体成员是e_entry、e_phoff、e_phnum、e_shoff、e_shnum。其中e_entry是可执行程序的入口地址即从内存的这个位置开始执行在这里入口地址是虚拟地址也就是链接地址e_phoff和e_phnum可以用来找到所有的程序头表项e_phoff是程序头表的第一项相对于ELF文件的开始位置的偏移而e_phnum则是表项的个数同理e_ shoff和e_ shnum可以用来找到所有的节头表项。
以例1.1为例我们可以使用riscv64-unknown-elf-objdump工具查看该ELF文件。
@ -539,9 +539,9 @@ typedef struct {
221 }
```
在enter_supervisor_mode函数中将 mstatus的MPP域设置为1表示中断发生之前的模式是Superior将mstatus的MPIE域设置为0表示中段发生前MIE的值为0。随将机器模式的内核栈顶写入mscratch寄存器中设置mepc为rest_of_boot_loader的地址并将kernel_stack_top与0作为参数存入a0和a1。
在enter_supervisor_mode函数中将 mstatus的MPP域设置为1表示中断发生之前的模式是Supervisor将mstatus的MPIE域设置为0表示中段发生前MIE的值为0。随将机器模式的内核栈顶写入mscratch寄存器中设置mepc为rest_of_boot_loader的地址并将kernel_stack_top与0作为参数存入a0和a1。
最后执行mret指令该指令执行时程序从机器模式的异常返回将程序计数器pc设置为mepc即rest_of_boot_loader的地址将特权级设置为mstatus寄存器的MPP域即方才所设置的代表Superior的1MPP设置为0将mstatus寄存器的MIE域设置为MPIE即方才所设置的表示中断关闭的0MPIE设置为1。
最后执行mret指令该指令执行时程序从机器模式的异常返回将程序计数器pc设置为mepc即rest_of_boot_loader的地址将特权级设置为mstatus寄存器的MPP域即方才所设置的代表Supervisor的1MPP设置为0将mstatus寄存器的MIE域设置为MPIE即方才所设置的表示中断关闭的0MPIE设置为1。
于是当mret指令执行完毕程序将从rest_of_boot_loader继续执行。

Loading…
Cancel
Save