私はカーネルの設計に取り組んでおり、ページングに関していくつか質問があります。
これまでのところ、私が持っている基本的な考え方は次のとおりです。各プログラムは、プログラムが呼び出すことができるカーネル関数用に予約したセクションを差し引いた、独自の (またはそう考える) 4G のメモリを取得します。そのため、OS は、プログラムが操作中に使用する必要があるページをメモリにロードする何らかの方法を見つける必要があります。
ここで、メモリとプロセッサ時間が無限にあると仮定すると、存在しない (またはスワップアウトされた) ページのページ フォールトを使用して、プログラムが書き込みまたは読み取りを行った任意のページをロード/割り当てることができたので、OSしかし、現実の世界では、このプロセスを最適化する必要があります。これにより、プログラムがこれまでに触れたすべてのメモリを常に消費することはありません。
だから私の質問は、OSは一般的にこれをどのように行うのですか? 私の最初の考えは、プログラムがページを設定/解放するために呼び出す関数を作成することです。これは、それ自体でメモリを管理できますが、プログラムは通常これを行いますか、それともコンパイラは自由に統治できると想定しますか? また、コンパイラは、かなり大きなメモリ セグメントを割り当てる必要がある状況をどのように処理しますか? Xページを順番に渡そうとする関数を提供する必要がありますか?
これは明らかに言語固有の質問ではありませんが、私は標準 C に部分的であり、C++ が得意なので、コード例をそれまたはアセンブリのいずれかにしたいと思います。(アセンブルは必要ありません。できるだけ多くの C コードで動作するようにし、最後のステップとして最適化するつもりです。)
同様に答えやすいもう 1 つのこと: プログラムが呼び出す必要があるカーネル関数を一般的にどのように処理しますか? プログラムが呼び出すことができるほとんどの基本的な関数/プロセス固有のメモリを含むメモリのセット領域(仮想空間の終わりに向かって考えていた)を持つだけで問題ありませんか? そこからの私の考えは、プログラムが何か重要なことをする必要があるときに、カーネル関数に非常に凝ったことをさせ、ページをスワップアウトすることです (プログラムが自分のスペースで機密性の高いカーネル関数を認識できないようにするため)。この時点でセキュリティに焦点を当てます。
だから私は、詳細よりも一般的なデザインのアイデアについてもっと心配していると思います. カーネルを GCC と完全に互換性のあるものにしたいと考えており、通常のプログラムが必要とするすべてのものを提供できるようにする必要があります。
アドバイスをありがとう。