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


はじめに

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