Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Miykael_xxm
RCore Tutorial Book V3
提交
5b61d5f7
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 搜索 >>
提交
5b61d5f7
编写于
3月 01, 2021
作者:
chyyuu1972
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
update ch0/4
上级
5a7a44fa
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
22 addition
and
13 deletion
+22
-13
source/chapter0/5setup-devel-env.rst
source/chapter0/5setup-devel-env.rst
+9
-0
source/chapter4/5kernel-app-spaces.rst
source/chapter4/5kernel-app-spaces.rst
+13
-13
未找到文件。
source/chapter0/5setup-devel-env.rst
浏览文件 @
5b61d5f7
...
@@ -132,6 +132,15 @@ Rust 开发环境配置
...
@@ -132,6 +132,15 @@ Rust 开发环境配置
.. warning::
.. warning::
目前用于操作系统实验开发的rustc编译器的版本不局限在1.46.0这样的数字上,你可以选择更新的rustc编译器。但注意只能用rustc的nightly版本。
目前用于操作系统实验开发的rustc编译器的版本不局限在1.46.0这样的数字上,你可以选择更新的rustc编译器。但注意只能用rustc的nightly版本。
可通过如下命令安装rustc的nightly版本,并把该版本设置为rustc的缺省版本。
.. code-block:: bash
rustup install nightly
rustup default nightly
我们最好把软件包管理器 cargo 所用的软件包镜像地址 crates.io 也换成中国科学技术大学的镜像服务器来加速三方库的下载。
我们最好把软件包管理器 cargo 所用的软件包镜像地址 crates.io 也换成中国科学技术大学的镜像服务器来加速三方库的下载。
我们打开(如果没有就新建) ``~/.cargo/config`` 文件,并把内容修改为:
我们打开(如果没有就新建) ``~/.cargo/config`` 文件,并把内容修改为:
...
...
source/chapter4/5kernel-app-spaces.rst
浏览文件 @
5b61d5f7
...
@@ -8,18 +8,18 @@
...
@@ -8,18 +8,18 @@
页表 ``PageTable`` 只能以页为单位帮助我们维护一个
地址空间的地址转换关系,它对于整个地址空间并没有一个全局的掌控
。本节
页表 ``PageTable`` 只能以页为单位帮助我们维护一个
虚拟内存到物理内存的地址转换关系,它本身对于计算机系统的整个虚拟/物理内存空间并没有一个全局的描述和掌控。操作系统通过不同页表的管理,来完成对不同应用和操作系统自身所在的虚拟内存,以及虚拟内存与物理内存映射关系的全面管理。这种管理是建立在地址空间的抽象上的
。本节
我们就在内核中
实现地址空间的抽象,并介绍内核和应用的
地址空间中各需要包含哪些内容。
我们就在内核中
通过基于页表的各种数据结构实现地址空间的抽象,并介绍内核和应用的虚拟和物理
地址空间中各需要包含哪些内容。
实现地址空间抽象
实现地址空间抽象
------------------------------------------
------------------------------------------
表示连续地址空间的逻辑段抽象
逻辑段:一段连续地址的虚拟内存
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
我们以逻辑段 ``M
emoryArea`` 为单位描述一个地址空间
。所谓逻辑段,就是指地址区间中的一段实际可用(即 MMU 通过查多级页表
我们以逻辑段 ``M
apArea`` 为单位描述一段连续地址的虚拟内存
。所谓逻辑段,就是指地址区间中的一段实际可用(即 MMU 通过查多级页表
可以正确完成地址转换)的地址连续的虚拟地址区间,该区间内包含的所有虚拟页面都以一种相同的方式映射到物理页帧。
可以正确完成地址转换)的地址连续的虚拟地址区间,该区间内包含的所有虚拟页面都以一种相同的方式映射到物理页帧
,具有可读/可写/可执行等属性
。
.. code-block:: rust
.. code-block:: rust
...
@@ -35,11 +35,11 @@
...
@@ -35,11 +35,11 @@
其中 ``VPNRange`` 描述一段虚拟页号的连续区间,表示该逻辑段在地址区间中的位置和长度。它是一个迭代器,可以使用 Rust
其中 ``VPNRange`` 描述一段虚拟页号的连续区间,表示该逻辑段在地址区间中的位置和长度。它是一个迭代器,可以使用 Rust
的语法糖 for-loop 进行迭代。有兴趣的读者可以参考 ``os/src/mm/address.rs`` 中它的实现。
的语法糖 for-loop 进行迭代。有兴趣的读者可以参考 ``os/src/mm/address.rs`` 中它的实现。
..
warning
::
..
note
::
**Rust 语法卡片:迭代器 Iterator**
**Rust 语法卡片:迭代器 Iterator**
之后有时间再补。
Rust编程的迭代器模式允许你对一个序列的项进行某些处理。迭代器(iterator)是负责遍历序列中的每一项和决定序列何时结束的控制逻辑。对于如何使用迭代器处理元素序列和如何实现 Iterator trait 来创建自定义迭代器的内容,可以参考 `Rust 程序设计语言-中文版第十三章第二节 <https://kaisery.github.io/trpl-zh-cn/ch13-02-iterators.html>`_
``MapType`` 描述该逻辑段内的所有虚拟页面映射到物理页帧的同一种方式,它是一个枚举类型,在内核当前的实现中支持两种方式:
``MapType`` 描述该逻辑段内的所有虚拟页面映射到物理页帧的同一种方式,它是一个枚举类型,在内核当前的实现中支持两种方式:
...
@@ -57,9 +57,9 @@
...
@@ -57,9 +57,9 @@
``Framed`` 则表示对于每个虚拟页面都需要映射到一个新分配的物理页帧。
``Framed`` 则表示对于每个虚拟页面都需要映射到一个新分配的物理页帧。
当逻辑段采用 ``MapType::Framed`` 方式映射到物理内存的时候, ``data_frames`` 是一个保存了该逻辑段内的每个虚拟页面
当逻辑段采用 ``MapType::Framed`` 方式映射到物理内存的时候, ``data_frames`` 是一个保存了该逻辑段内的每个虚拟页面
和它被映射到的物理页帧 ``FrameTracker`` 的一个键值对容器 ``BTreeMap`` 中,这些物理页帧被用来
实际存放
数据而不是
和它被映射到的物理页帧 ``FrameTracker`` 的一个键值对容器 ``BTreeMap`` 中,这些物理页帧被用来
存放实际内存
数据而不是
多级页表中的
节点。和之前的 ``PageTable`` 一样,这也用到了 RAII 的思想,将这些物理页帧的生命周期绑定到它所在的逻辑段
作为多级页表中的中间
节点。和之前的 ``PageTable`` 一样,这也用到了 RAII 的思想,将这些物理页帧的生命周期绑定到它所在的逻辑段
``MapArea`` 下,当逻辑段被回收之后这些之前分配的物理页帧也会同时被回收。
``MapArea`` 下,当逻辑段被回收之后这些之前分配的物理页帧也会
自动地
同时被回收。
``MapPermission`` 表示控制该逻辑段的访问方式,它是页表项标志位 ``PTEFlags`` 的一个子集,仅保留 U/R/W/X
``MapPermission`` 表示控制该逻辑段的访问方式,它是页表项标志位 ``PTEFlags`` 的一个子集,仅保留 U/R/W/X
四个标志位,因为其他的标志位仅与硬件的地址转换机制细节相关,这样的设计能避免引入错误的标志位。
四个标志位,因为其他的标志位仅与硬件的地址转换机制细节相关,这样的设计能避免引入错误的标志位。
...
@@ -79,10 +79,10 @@
...
@@ -79,10 +79,10 @@
表示一系列逻辑段的地址空间抽象
地址空间:一系列有关联的逻辑段
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
地址空间
则
使用 ``MemorySet`` 类型来表示:
地址空间
是一系列有关联的逻辑段,这种关联一般是指这些逻辑段属于一个运行的程序(目前把一个运行的程序称为任务,后续会称为进程)。用来表明正在运行的应用所在执行环境中的可访问内存空间,在这个内存空间中,包含了一系列的不一定连续的逻辑段。这样我们就有任务的地址空间,内核的地址空间等说法了。地址空间
使用 ``MemorySet`` 类型来表示:
.. code-block:: rust
.. code-block:: rust
...
@@ -94,7 +94,7 @@
...
@@ -94,7 +94,7 @@
}
}
它包含了该地址空间的多级页表 ``page_table`` 和一个逻辑段 ``MapArea`` 的向量 ``areas`` 。注意 ``PageTable`` 下
它包含了该地址空间的多级页表 ``page_table`` 和一个逻辑段 ``MapArea`` 的向量 ``areas`` 。注意 ``PageTable`` 下
挂着所有多级页表的节点
被放在的物理页帧,而每个 ``MapArea`` 下则挂着对应逻辑段的数据被内核实际放
在的物理页帧,这两部分
挂着所有多级页表的节点
所在的物理页帧,而每个 ``MapArea`` 下则挂着对应逻辑段中的数据所
在的物理页帧,这两部分
合在一起构成了一个地址空间所需的所有物理页帧。这同样是一种 RAII 风格,当一个地址空间 ``MemorySet`` 生命周期结束后,
合在一起构成了一个地址空间所需的所有物理页帧。这同样是一种 RAII 风格,当一个地址空间 ``MemorySet`` 生命周期结束后,
这些物理页帧都会被回收。
这些物理页帧都会被回收。
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录