AlwaysKing
AlwaysKing
大佬,64位的什么时候出啊?
> 前面我们提到过 .bss 段一般放置需要被初始化为零的数据。然而栈并不需要在使用前被初始化为零,因为在函数调用的时候我们会插入栈帧覆盖已有的数据。我们尝试将其放置到全局数据 .data 段中但最后未能成功,因此才决定将其放置到 .bss 段中。全局符号 sbss 和 ebss 分别指向 .bss 段除 .bss.stack 以外的起始和终止地址,我们在使用这部分数据之前需要将它们初始化为零,这个过程将在下一节进行。 我觉得这段内容有点问题, data是已经初始化的数据,所以是要在二进制文件中占用空间的,而bbs段因为都是未初始化的数据所以加载的时候由内核或者加载器将其初始化为0,本身在二进制文件中并不占用空间,基于栈内存的性质我觉得放置在bbs是更为合理的选择
> 我们为何将应用的 Trap 上下文放到应用地址空间的次高页面而不是内核地址空间中的内核栈中呢?原因在于,在保存 Trap 上下文到内核栈中之前,我们必须完成两项工作:1)必须先切换到内核地址空间,这就需要将内核地址空间的 token 写入 satp 寄存器;2)之后还需要保存应用的内核栈栈顶的位置,这样才能以它为基址保存 Trap 上下文。这两步需要用寄存器作为临时周转,然而我们无法在不破坏任何一个通用寄存器的情况下做到这一点。因为事实上我们需要用到内核的两条信息:内核地址空间的 token ,以及应用的内核栈栈顶的位置,RISC-V却只提供一个 sscratch 寄存器可用来进行周转。所以,我们不得不将 Trap 上下文保存在应用地址空间的一个虚拟页面中,而不是切换到内核地址空间去保存。 关于这点没记错的话window里面的做法是,所有进程的页表在内核地址那一段都是指向的同一份真实的内核地址空间的页表的,这样在trap进内核的时候是可以直接使用内核空间的地址的不需要发生satp寄存器的切换,这样即保证了连续性也减小了satp切换导致的tlb缓存刷新的性能问题