LoginSignup
6
5

More than 5 years have passed since last update.

RustでOSを作るときに便利そうな情報(まとめ中)

Last updated at Posted at 2018-08-07

はじめに

OSを自作するにあたって、C言語でできてたけどRustでどーやるの?系の情報を載せていきたい。
大本にしている情報が消えてしまうこともありそうなので
部分的に引用してくる。

構造体のメモリレイアウト系

Rustの構造体メモリレイアウト | ryocheck.blog
からコードを引用

要約すると

struct S{
    int32:i32,
    int16:i16,
    int8:i8,
    uint32:u32
}

この構造体があった時

  • デフォルト
    メモリ上ではパディングを入れつつ、最小限の大きさに構造体のメンバを詰めていって最適化する。
  • repr(C)
    メンバの順番はメモリ上でもそのままでパディングを入れていく(C言語から触るときそのまま触れて便利)
  • repr(packed)
    パディングを入れないでとにかく詰めていく(pragma pack(1)と同じ感じ)

特定のポインタを任意の型のスライスとして扱う

Function core::slice::from_raw_parts
メモリ管理機能を作るときに、そもそも管理してないメモリに対してmallocとかできないから自力で手動mallocする必要がある。
例えば、UEFIの場合はメモリマップをとって、任意の空き部分に管理領域(配列やリンクリストの構造体の集合)を割り当てるとかしたい。

要約

use core::slice;
struct Sample{
    hoge:u32,
    fuga:u16,
}
let ptr = 0x1234 as *const Sample; // 何型?
let amt = 10; // 個数
// Sample構造体の要素10個のスライスができる。
let slice = unsafe{ slice::from_raw_parts(ptr, amt) };

メモリ管理(ページメモリアロケータ・デアロケータ)

自分で作ってみたもの。詳細は↓
はりぼてOSのメモリアロケータのRust移植+改良版
GitHubはこちら

使い方は上記の記事に記載しているのでそちらを。

参考・引用元

Rustの構造体メモリレイアウト | ryocheck.blog
Function core::slice::from_raw_parts

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5