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

upate ch4/sec1

上级 070d8744
......@@ -8,8 +8,21 @@ Rust 中的动态内存分配
到目前为止,如果将我们的内核也看成一个应用,那么其中所有的变量都是被静态分配在内存中的,这样在对空闲内存的使用方面缺少灵活性。我们希望能在操作系统中提供动态申请和释放内存的能力,这样就可以加强操作系统对各种以内存为基础的资源分配与管理。
在应用程序的视角中,动态内存分配中的内存,其实就是操作系统管理的“堆 (Heap)”。但现在要实现操作系统,那么就需要操作系统自身能提供动态内存分配的能力。如果要实现动态内存分配的能力,需要操作系统需要有如下功能:
- 初始时能提供一块大内存空间作为初始的“堆”。在没有分页机制情况下,这块空间是物理内存空间,否则就是虚拟内存空间。
- 提供在堆上分配一块内存的函数接口。这样函数调用方就能够得到一块地址连续的空闲内存块进行读写。
- 提供释放内存的函数接口。能够回收内存,以备后续的内存分配请求。
- 提供空闲空间管理的连续内存分配算法。能够有效地管理空闲快,这样就能够动态地维护一系列空闲和已分配的内存块。
- (可选)提供建立在堆上的数据结构和操作。有了上述基本的内存分配与释放函数接口,就可以实现类似动态数组,动态字典等空间灵活可变的堆数据结构,提高编程的灵活性。
考虑到我们是用Rust来编程的,为了在接下来的一些操作系统的实现功能中进一步释放 Rust 语言的强表达能力来减轻我们的编码负担,本节我们尝试在内核中支持动态内存分配以可以使用各种需要动态内存支持的Rust功能,如Vec、HashMap等。
.. note::
静态与动态内存分配
----------------------------------------------
......@@ -165,12 +178,14 @@ RAII 的含义是说,将一个使用前必须获取的资源的生命周期绑
在内核中支持动态内存分配
--------------------------------------------------------
如果要在操作系统内核中支持动态内存分配,则需要实现在本节开始介绍的一系列功能:初始化堆、分配/释放内存块的函数接口、连续内存分配算法。相对于C语言而言,如果用Rust语言实现,它在 ``alloc`` crate中设定了一套简洁规范的接口,只要实现了这套接口,内核就可以很方便地支持动态内存分配了。
上边介绍的那些与堆相关的智能指针或容器都可以在 Rust 自带的 ``alloc`` crate 中找到。当我们使用 Rust 标准库
``std`` 的时候可以不用关心这个 crate ,因为标准库内已经已经实现了一套堆管理算法,并将 ``alloc`` 的内容包含在
``std`` 名字空间之下让开发者可以直接使用。然而我们的内核是在禁用了标准库(即 ``no_std`` )的裸机平台,核心库
``core`` 也并没有动态内存分配的功能,这个时候就要考虑利用 ``alloc`` 库了。
``alloc`` 库需要我们提供给它一个全局的动态内存分配器,它会利用该分配器来管理堆空间,从而它提供的数据结构可以正常
``alloc`` 库需要我们提供给它一个 ``全局的动态内存分配器`` ,它会利用该分配器来管理堆空间,从而使得它提供的堆数据结构可以正常
工作。具体而言,我们的动态内存分配器需要实现它提供的 ``GlobalAlloc`` Trait,这个 Trait 有两个必须实现的抽象接口:
.. code-block:: rust
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册