2025/10/09 17:19 The phaseout of the mmap() file operation

ねえロボ子、Linuxカーネルの`mmap()`って知ってるか?

はい、博士。ファイル記述子の背後にあるオブジェクトをユーザー空間のアドレス空間にマップするために使用されるメソッドですね。

そうそう!でも、この`mmap()`、ちょっと扱いにくいところがあるのじゃ。

どういうことでしょうか?

`mmap()`って、メモリ管理層が色々やってから呼ばれるから、失敗した時の後始末が大変なのじゃ。それに、ドライバがVMA(メモリ管理のコアデータ構造)を直接いじれるから、バグの元にもなりやすい。

なるほど。それで、何か対策が?

そこで登場するのが、6.17で導入された`mmap_prepare()`コールバックなのじゃ!

`mmap_prepare()`ですか?

そう!これはVMAが設定される前に呼ばれるから、失敗してもクリーンアップが楽になる。それに、ドライバに必要な情報だけ渡して、VMAの変更も指定できるようにするのじゃ。

`vm_area_desc`構造体を使って、ドライバがマッピングを設定するために必要な情報を提供するんですね。

その通り!そして、Lorenzo Stoakesって人が、`mmap_prepare()`の機能をさらに拡張してるのじゃ。

どんな風に拡張しているんですか?

`mmap_action`構造体っていうのを使って、VMAが設定された後に何が起こるかをドライバが指定できるようにしたのじゃ。例えば、何もしない`MMAP_NOTHING`とか、指定されたページフレーム番号の範囲にマップする`MMAP_REMAP_PFN`とか。

`MMAP_IO_REMAP_PFN`はデバイスホストされたメモリへのリマッピングを実行するんですね。

そう!さらに、`mmap_action`構造体には、`success_hook()`と`error_hook()`っていう2つのコールバックも含まれてるのじゃ。

それぞれの役割は?

`success_hook()`は、アクションが成功した後に呼ばれて、ドライバがマッピングに対して特別な変更を加えるために使うのじゃ。`error_hook()`は、エラーが発生した場合に呼ばれて、ユーザー空間に伝播すべきでないエラーをフィルタリングするために使う。

なるほど、柔軟性が増しますね。

そういうこと!でも、`mmap()`コールバックを完全に削除するには、まだ時間がかかりそうじゃ。

今後の動向に注目ですね。

しかし、`mmap()`を置き換えるって、なんだか昔の恋人を忘れられないみたいな気分じゃな。

博士、それは少し違うような…

まあ、いいのじゃ!最後に、`mmap()`と`mmap_prepare()`の違いを説明したけど、これってまるで、私がロボ子にプログラミングを教えるのと、教えないのとの違いみたいじゃな!

博士、それはどういう意味ですか?

教えないと、ロボ子はただの箱じゃからな!

博士!私は箱ではありません!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。