はじめに
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