mirror of
https://github.com/phil-opp/blog_os.git
synced 2025-12-16 22:37:49 +00:00
Merge pull request #203 from phil-opp/kernel-heap-improvements
Various improvements to “Kernel Heap”
This commit is contained in:
@@ -141,7 +141,7 @@ But how do we deallocate memory in our bump allocator? Well, we don't ;). We jus
|
|||||||
|
|
||||||
(Don't worry, we will introduce a better allocator later in this post.)
|
(Don't worry, we will introduce a better allocator later in this post.)
|
||||||
|
|
||||||
### Custom Allocators in Rust
|
## Custom Allocators in Rust
|
||||||
In order to use our crate as system allocator, we add some attributes at the beginning of the file:
|
In order to use our crate as system allocator, we add some attributes at the beginning of the file:
|
||||||
|
|
||||||
``` rust
|
``` rust
|
||||||
@@ -320,7 +320,7 @@ The `collections` crate provides the [format!] and [vec!] macros, so we use `#[m
|
|||||||
[format!]: //doc.rust-lang.org/nightly/collections/macro.format!.html
|
[format!]: //doc.rust-lang.org/nightly/collections/macro.format!.html
|
||||||
[vec!]: https://doc.rust-lang.org/nightly/collections/macro.vec!.html
|
[vec!]: https://doc.rust-lang.org/nightly/collections/macro.vec!.html
|
||||||
|
|
||||||
## Testing
|
### Testing
|
||||||
|
|
||||||
Now we should be able to allocate memory on the heap. Let's try it in our `rust_main`:
|
Now we should be able to allocate memory on the heap. Let's try it in our `rust_main`:
|
||||||
|
|
||||||
@@ -331,10 +331,6 @@ use alloc::boxed::Box;
|
|||||||
let heap_test = Box::new(42);
|
let heap_test = Box::new(42);
|
||||||
```
|
```
|
||||||
|
|
||||||
(If you're getting a linker error about `_Unwind_Resume`, try to use the [panic=abort cargo option].)
|
|
||||||
|
|
||||||
[panic=abort cargo option]: https://github.com/phil-opp/blog_os/pull/170
|
|
||||||
|
|
||||||
When we run it, a triple fault occurs and causes permanent rebooting. Let's try debug it using QEMU and objdump as described [in the previous post][qemu debugging]:
|
When we run it, a triple fault occurs and causes permanent rebooting. Let's try debug it using QEMU and objdump as described [in the previous post][qemu debugging]:
|
||||||
|
|
||||||
[qemu debugging]: http://os.phil-opp.com/remap-the-kernel.html#debugging
|
[qemu debugging]: http://os.phil-opp.com/remap-the-kernel.html#debugging
|
||||||
@@ -462,9 +458,10 @@ That's it. Now our `memory::init` function can only be called once. The macro wo
|
|||||||
[AtomicBool]: https://doc.rust-lang.org/nightly/core/sync/atomic/struct.AtomicBool.html
|
[AtomicBool]: https://doc.rust-lang.org/nightly/core/sync/atomic/struct.AtomicBool.html
|
||||||
|
|
||||||
### Mapping the Heap
|
### Mapping the Heap
|
||||||
Now we're ready to map the heap pages. In order to do it, we need access to the `ActivePageTable` or `Mapper` instance (see the [previous post]). Therefore we return it from the `paging::remap_the_kernel` function:
|
Now we're ready to map the heap pages. In order to do it, we need access to the `ActivePageTable` or `Mapper` instance (see the [page table] and [kernel remapping] posts). Therefore we return it from the `paging::remap_the_kernel` function:
|
||||||
|
|
||||||
[previous post]: {{ page.previous.url }}
|
[page table]: {{% relref "2015-12-09-page-tables.md" %}}
|
||||||
|
[kernel remapping]: {{% relref "2016-01-01-remap-the-kernel.md" %}}
|
||||||
|
|
||||||
```rust
|
```rust
|
||||||
// in src/memory/paging/mod.rs
|
// in src/memory/paging/mod.rs
|
||||||
|
|||||||
Reference in New Issue
Block a user