跳转至

第19课

约 477 个字 预计阅读时间 2 分钟

Note

复习了二十分钟

Linux Paging - RISC-V

SATP寄存器类似Intel的RC3寄存器

image-20230430124932324

Sv39

每个page的大小是\(2^{12}\)字节;

每个page table entry的大小是8字节,用9位去索引这8个字节,512个entry乘8(因为页框号PPN有44bit,所以4个字节不够了,需要8个字节),就是4KB,也就是页的大小。

页表项存的是下一级页表的物理地址;

image-20230430125024388

一个例子

  • VA: 0xffff ffc0 1357 9bdf

  • PA: 0x93779bdf

  • The physical address of page table is 0x8010 0000

SATP:

image-20230504082359771

第一级页表:

取出VA[38:30],为b’100 0000 00,所以真正的物理地址偏移量为b’1 0000 0000 x 8 bytes = 0x800。所以页表项的物理地址为 0x8010 0000 + 0x800 = 0x8010 0800。假设页表项的值为0x00000000 20040401,首先rwx全部为0,这是riscv的特殊设计,rwx同时为0,表示指向下一级物理页表而不是物理页

第二级页表:

取出[53:10] = 0x80101,再取出VPN[1],为bit[29:21],为b’0 1001 1010,所以第二个页表项为0x8010 1000 + 0x96x8 = 0x801014b0,假设页表项的值为0x00000000_20040801。

第三级页表:

Third-level page table address: 200408 >> 2 << 12 = 0x8010 2000。VPN[0] (bit 20 : bit 12) -> b’1 0111 1001 (0x179)。The page table entry address is 0x80102000 + 0x179x8 = 0x80102bc8。假设页表项的值为0x00000000_24dde40f。那么,V =1 RWX = 111,PPN = 0x24dde4 >> 2 = 0x93779,-> pa = PPN << 12 + page offset = 0x93779bdf

Linker and Loader

linker: from object files to executable file.

loader: from program to process.

image-20230504085418548

静态链接的优点是,兼容性好。但是加载时间长。动态链接的优点是,进程之间可以共享。

对于动态链接,自己定义的函数,链接时候还是有的,而libc里面的函数,就不会放到可执行文件中,而是直接进行跳转,跳转到内存的某个地方(libc函数被加载的内存地址)。

动态链接link阶段,对于系统库函数,link会去系统环境变量里面去寻找系统库函数的地址。

本文总阅读量