Skip to main content

Module usercopy

Module usercopy 

Source
Expand description

usercopy.rs - ユーザ空間メモリへの安全なアクセス層

EL0 (アプリケーション) から渡されたポインタをカーネル (EL1) が参照する際の 事前条件チェックを一元化するモジュール。システムコール実装は生ポインタを 直接 deref せず、必ずこのモジュールの関数を経由すること。

§検証する事前条件

  1. アドレス範囲: ユーザ空間として妥当な恒等マップ RAM 領域 (USER_RAM_START..USER_RAM_END) に完全に収まっていること。 カーネル領域 (低位アドレス) や MMIO 領域 (0x3C00_0000 以上) を指す ポインタは拒否する。
  2. オーバーフロー: ptr + len がラップアラウンドしないこと。
  3. アライメント: 型 T の自然アライメントを満たすこと (未満たしの参照作成は Rust では未定義動作)。
  4. 長さ上限: 呼び出し側が指定する上限を超えないこと。

これらのチェックにより、アプリケーションがどんな引数を渡しても カーネルがクラッシュ・メモリ破壊しないことを保証する。

Constants§

USER_RAM_END
ユーザ空間として許可する RAM 領域の上限 (MMIO 領域 0x3C00_0000 の手前まで)
USER_RAM_START
ユーザ空間として許可する RAM 領域の下限 (カーネルイメージ領域を除外)

Functions§

user_ptr_ok
Tcount 個読むためのポインタとして妥当か検査する (範囲 + アライメント + 要素数オーバーフロー)。
user_range_ok
[ptr, ptr+len_bytes) がユーザ RAM 領域内に完全に収まるか検査する。 len_bytes == 0 または範囲外・ラップアラウンドする場合は false
user_slice
ユーザ空間から型 T のスライスを借用する。 事前条件 (範囲・アライメント) を満たさない場合は None
user_str
ユーザ空間のバイト列を UTF-8 文字列として検証付きで借用する。 範囲外・非 UTF-8 の場合は Nonemax_len を超える長さは拒否する。 len == 0 はメモリを読まないため常に空文字列として許可する。
write_user
ユーザ空間へ型 T の値を 1 個書き込む。 事前条件を満たさない場合は false を返し、何も書き込まない。