fix bug in maxva.
This commit is contained in:
parent
61c7c04123
commit
a71224877a
|
@ -236,7 +236,8 @@ C的内存布局
|
|||
|
||||
#define USTACK_BOTTOM (0x0)
|
||||
|
||||
其中前两项在上一节已经介绍过了。下面的MAXVA其实就是SV39中最大的虚拟地址(39位全为1)。va不可能大于MAXVA。大家可以看到,我们指定TRAMPOLINE和TRAPFRAME在va的最高位,这是为什么呢?大家可以自行思考一下,我们将在下面解释。
|
||||
其中前两项在上一节已经介绍过了。下面的MAXVA其实并不是SV39中最大的虚拟地址(39位全为1)。我们设置它为(1<<38)是因为VA的高位填充是根据39位来进行的。为了方便全部填充0,就不考虑大于(1<<38)的虚拟地址。
|
||||
在我们的框架之中,va不可能大于MAXVA。大家可以看到,我们指定TRAMPOLINE和TRAPFRAME在va的最高位,这是为什么呢?大家可以自行思考一下,我们将在下面解释。
|
||||
|
||||
.. note::
|
||||
|
||||
|
|
|
@ -32,7 +32,7 @@ tips:
|
|||
mmap 匿名映射
|
||||
++++++++++++++++++++++++++++++++++++++++++++
|
||||
|
||||
你有没有想过,当你在 C 语言中写下的 ``new int[100];`` 执行时可能会发生哪些事情?你可能已经发现,目前我们给用户程序的内存都是固定的并没有增长的能力,这些程序是不能执行 ``new`` 这类导致内存使用增加的操作。libc 中通过 `sbrk <https://linux.die.net/man/2/sbrk>`_ 系统调用增加进程可使用的堆空间,这也是本来的题目设计,但是一位热心的往年助教J学长表示:这一点也不酷!他推荐了另一个申请内存的系统调用。
|
||||
你有没有想过,当你在 C++ 语言中写下的 ``new int[100];`` 执行时可能会发生哪些事情?你可能已经发现,目前我们给用户程序的内存都是固定的并没有增长的能力,这些程序是不能执行 ``new`` 这类导致内存使用增加的操作。libc 中通过 `sbrk <https://linux.die.net/man/2/sbrk>`_ 系统调用增加进程可使用的堆空间,这也是本来的题目设计,但是一位热心的往年助教J学长表示:这一点也不酷!他推荐了另一个申请内存的系统调用。
|
||||
|
||||
`mmap <https://man7.org/linux/man-pages/man2/mmap.2.html>`_ 本身主要使用来在内存中映射文件的,这里我们简化它的功能,仅仅使用匿名映射。
|
||||
|
||||
|
@ -113,7 +113,7 @@ tips:
|
|||
为了防范侧信道攻击,我们的 os 使用了双页表。但是传统的设计一直是单页表的,也就是说,用户线程和对应的内核线程共用同一张页表,只不过内核对应的地址只允许在内核态访问。请结合课堂知识回答如下问题:(备注:这里的单/双的说法仅为自创的通俗说法,并无这个名词概念,详情见 `KPTI <https://en.wikipedia.org/wiki/Kernel_page-table_isolation>`_ )
|
||||
|
||||
- 如何更换页表?
|
||||
- 单页表情况下,如何控制用户态无法访问内核页面?(tips:看看上一题最后一问)
|
||||
- 单页表情况下,如何控制用户态无法访问内核页面?(tips:看看第一题最后一问)
|
||||
- 单页表有何优势?(回答合理即可)
|
||||
- 双页表实现下,何时需要更换页表?假设你写一个单页表操作系统,你会选择何时更换页表(回答合理即可)?
|
||||
|
||||
|
|
Loading…
Reference in New Issue