提交 13969ecf 编写于 作者: chyyuu1972's avatar chyyuu1972

fix: 0x80040000 --> 0x80400000

上级 1f1001b1
......@@ -91,8 +91,8 @@
在 ``user/.cargo/config`` 中,我们和第一章一样设置链接时使用链接脚本 ``user/src/linker.ld`` 。在其中我们做的重要的事情是:
- 将程序的起始物理地址调整为 ``0x80040000`` ,三个应用程序都会被加载到这个物理地址上运行;
- 将 ``_start`` 所在的 ``.text.entry`` 放在整个程序的开头,也就是说批处理系统只要在加载之后跳转到 ``0x80040000`` 就已经进入了
- 将程序的起始物理地址调整为 ``0x80400000`` ,三个应用程序都会被加载到这个物理地址上运行;
- 将 ``_start`` 所在的 ``.text.entry`` 放在整个程序的开头,也就是说批处理系统只要在加载之后跳转到 ``0x80400000`` 就已经进入了
用户库的入口点,并会在初始化之后跳转到应用程序主逻辑;
- 提供了最终生成可执行文件的 ``.bss`` 段的起始和终止地址,方便 ``clear_bss`` 函数使用。
......
......@@ -190,7 +190,7 @@
app_dst.copy_from_slice(app_src);
}
这个方法负责将参数 ``app_id`` 对应的应用程序的二进制镜像加载到物理内存以 ``0x80040000`` 开头的位置,这个位置是批处理操作系统和应用程序
这个方法负责将参数 ``app_id`` 对应的应用程序的二进制镜像加载到物理内存以 ``0x80400000`` 开头的位置,这个位置是批处理操作系统和应用程序
之间约定的常数地址,回忆上一小节中,我们也调整应用程序的内存布局以同一个地址开头。第 8 行开始,我们首先将一块内存清空,然后找到待加载应用
二进制镜像的位置,并将它复制到正确的位置。它本质上是把数据从一块内存复制到另一块内存,从批处理操作系统的角度来看是将它数据段的一部分复制到了它
程序之外未知的地方。在这一点上也体现了冯诺依曼计算机的 ``代码即数据`` 的特征。
......
......@@ -528,7 +528,7 @@ Trap 在使用 Rust 实现的 ``trap_handler`` 函数中完成分发和处理:
S 特权级,而它希望能够切换到 U 特权级。在 RISC-V 架构中,唯一一种能够使得 CPU 特权级下降的方法就是通过 Trap 返回系列指令,比如
``sret`` 。事实上,在运行应用程序之前要完成如下这些工作:
- 跳转到应用程序入口点 ``0x80040000``。
- 跳转到应用程序入口点 ``0x80400000``。
- 将使用的栈切换到用户栈。
- 在 ``__alltraps`` 时我们要求 ``sscratch`` 指向内核栈,这个也需要在此时完成。
- 从 S 特权级切换到 U 特权级。
......@@ -582,7 +582,7 @@ S 特权级,而它希望能够切换到 U 特权级。在 RISC-V 架构中,
panic!("Unreachable in batch::run_current_app!");
}
在高亮行所做的事情是在内核栈上压入一个 Trap 上下文,其 sepc 是应用程序入口地址 ``0x80040000`` ,其 sp 寄存器指向用户栈,其 sstatus
在高亮行所做的事情是在内核栈上压入一个 Trap 上下文,其 sepc 是应用程序入口地址 ``0x80400000`` ,其 sp 寄存器指向用户栈,其 sstatus
的 ``SPP`` 字段被设置为 User 。``push_context`` 的返回值是内核栈压入 Trap 上下文之后的栈顶,它会被作为 ``__restore`` 的参数(
回看 :ref:`__restore 代码 <code-restore>` ,这时我们可以理解为何 ``__restore`` 的开头会做
:math:`\text{sp}\leftarrow\text{a}_0` )使得在 ``__restore`` 中 sp 仍然可以指向内核栈的栈顶。这之后,就和一次普通的
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册