Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Miykael_xxm
RCore Tutorial Book V3
提交
13969ecf
R
RCore Tutorial Book V3
项目概览
Miykael_xxm
/
RCore Tutorial Book V3
与 Fork 源项目一致
Fork自
rcore-os / RCore Tutorial Book V3
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
RCore Tutorial Book V3
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
13969ecf
编写于
3月 13, 2021
作者:
chyyuu1972
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix: 0x80040000 --> 0x80400000
上级
1f1001b1
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
5 addition
and
5 deletion
+5
-5
source/chapter2/2application.rst
source/chapter2/2application.rst
+2
-2
source/chapter2/3batch-system.rst
source/chapter2/3batch-system.rst
+1
-1
source/chapter2/4trap-handling.rst
source/chapter2/4trap-handling.rst
+2
-2
未找到文件。
source/chapter2/2application.rst
浏览文件 @
13969ecf
...
...
@@ -91,8 +91,8 @@
在 ``user/.cargo/config`` 中,我们和第一章一样设置链接时使用链接脚本 ``user/src/linker.ld`` 。在其中我们做的重要的事情是:
- 将程序的起始物理地址调整为 ``0x80
04
0000`` ,三个应用程序都会被加载到这个物理地址上运行;
- 将 ``_start`` 所在的 ``.text.entry`` 放在整个程序的开头,也就是说批处理系统只要在加载之后跳转到 ``0x80
04
0000`` 就已经进入了
- 将程序的起始物理地址调整为 ``0x80
40
0000`` ,三个应用程序都会被加载到这个物理地址上运行;
- 将 ``_start`` 所在的 ``.text.entry`` 放在整个程序的开头,也就是说批处理系统只要在加载之后跳转到 ``0x80
40
0000`` 就已经进入了
用户库的入口点,并会在初始化之后跳转到应用程序主逻辑;
- 提供了最终生成可执行文件的 ``.bss`` 段的起始和终止地址,方便 ``clear_bss`` 函数使用。
...
...
source/chapter2/3batch-system.rst
浏览文件 @
13969ecf
...
...
@@ -190,7 +190,7 @@
app_dst.copy_from_slice(app_src);
}
这个方法负责将参数 ``app_id`` 对应的应用程序的二进制镜像加载到物理内存以 ``0x80
04
0000`` 开头的位置,这个位置是批处理操作系统和应用程序
这个方法负责将参数 ``app_id`` 对应的应用程序的二进制镜像加载到物理内存以 ``0x80
40
0000`` 开头的位置,这个位置是批处理操作系统和应用程序
之间约定的常数地址,回忆上一小节中,我们也调整应用程序的内存布局以同一个地址开头。第 8 行开始,我们首先将一块内存清空,然后找到待加载应用
二进制镜像的位置,并将它复制到正确的位置。它本质上是把数据从一块内存复制到另一块内存,从批处理操作系统的角度来看是将它数据段的一部分复制到了它
程序之外未知的地方。在这一点上也体现了冯诺依曼计算机的 ``代码即数据`` 的特征。
...
...
source/chapter2/4trap-handling.rst
浏览文件 @
13969ecf
...
...
@@ -528,7 +528,7 @@ Trap 在使用 Rust 实现的 ``trap_handler`` 函数中完成分发和处理:
S 特权级,而它希望能够切换到 U 特权级。在 RISC-V 架构中,唯一一种能够使得 CPU 特权级下降的方法就是通过 Trap 返回系列指令,比如
``sret`` 。事实上,在运行应用程序之前要完成如下这些工作:
- 跳转到应用程序入口点 ``0x80
04
0000``。
- 跳转到应用程序入口点 ``0x80
40
0000``。
- 将使用的栈切换到用户栈。
- 在 ``__alltraps`` 时我们要求 ``sscratch`` 指向内核栈,这个也需要在此时完成。
- 从 S 特权级切换到 U 特权级。
...
...
@@ -582,7 +582,7 @@ S 特权级,而它希望能够切换到 U 特权级。在 RISC-V 架构中,
panic!("Unreachable in batch::run_current_app!");
}
在高亮行所做的事情是在内核栈上压入一个 Trap 上下文,其 sepc 是应用程序入口地址 ``0x80
04
0000`` ,其 sp 寄存器指向用户栈,其 sstatus
在高亮行所做的事情是在内核栈上压入一个 Trap 上下文,其 sepc 是应用程序入口地址 ``0x80
40
0000`` ,其 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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录