Expand description
usercopy.rs - ユーザ空間メモリへの安全なアクセス層
EL0 (アプリケーション) から渡されたポインタをカーネル (EL1) が参照する際の 事前条件チェックを一元化するモジュール。システムコール実装は生ポインタを 直接 deref せず、必ずこのモジュールの関数を経由すること。
§検証する事前条件
- アドレス範囲: ユーザ空間として妥当な恒等マップ RAM 領域
(
USER_RAM_START..USER_RAM_END) に完全に収まっていること。 カーネル領域 (低位アドレス) や MMIO 領域 (0x3C00_0000 以上) を指す ポインタは拒否する。 - オーバーフロー:
ptr + lenがラップアラウンドしないこと。 - アライメント: 型
Tの自然アライメントを満たすこと (未満たしの参照作成は Rust では未定義動作)。 - 長さ上限: 呼び出し側が指定する上限を超えないこと。
これらのチェックにより、アプリケーションがどんな引数を渡しても カーネルがクラッシュ・メモリ破壊しないことを保証する。
Constants§
- USER_
RAM_ END - ユーザ空間として許可する RAM 領域の上限 (MMIO 領域 0x3C00_0000 の手前まで)
- USER_
RAM_ START - ユーザ空間として許可する RAM 領域の下限 (カーネルイメージ領域を除外)
Functions§
- user_
ptr_ ok - 型
Tをcount個読むためのポインタとして妥当か検査する (範囲 + アライメント + 要素数オーバーフロー)。 - user_
range_ ok [ptr, ptr+len_bytes)がユーザ RAM 領域内に完全に収まるか検査する。len_bytes == 0または範囲外・ラップアラウンドする場合はfalse。- user_
slice - ユーザ空間から型
Tのスライスを借用する。 事前条件 (範囲・アライメント) を満たさない場合はNone。 - user_
str - ユーザ空間のバイト列を UTF-8 文字列として検証付きで借用する。
範囲外・非 UTF-8 の場合は
None。max_lenを超える長さは拒否する。len == 0はメモリを読まないため常に空文字列として許可する。 - write_
user - ユーザ空間へ型
Tの値を 1 個書き込む。 事前条件を満たさない場合はfalseを返し、何も書き込まない。