MMUを使用しないプロセッサ用のマルチタスクオペレーティングシステムの作成


9

一部のARMプロセッサ用の趣味のオペレーティングシステムを書くことを考えています。ARM MPUを搭載した人気のあるシングルボードコンピューターはたくさんあるので、そのうちの1つを購入したかっただけです(より多くのオープンドキュメントがあるコンピューターを選択)。本当に十分なメモリを備えたボードでさえ、メモリ管理ユニットを備えたMPUを持っていないことに気づいたとき、私は驚きました。

私は常にi386 +プロセッサで作業しており、それ以外は何もしていないため(一部のMicrochip PICを除く)、私は混乱しており、書かれたOSと比較すると機能が制限されない機能するオペレーティングシステムを書くことができるかどうかわかりませんMMUを備えたMPU用。

MMUを「置換」または「シミュレーション」するためのいくつかの解決策を考えることができ、いくつか質問があります。

  • 16ビットモードと32ビットモードのIntelプロセッサでは、セグメントとセグメントセレクターを使用して、異なるタスクで異なるメモリブロックを使用する方法があります。これは、x86でタスクスイッチを実行するときに、セグメントレジスタの内容を変更することでメモリ空間を変更できることを意味します。ARMアーキテクチャで使用できるメモリセグメンテーションの一般的な概念はありますか?
  • 実行可能ファイルの代わりにリンクされたオブジェクトファイルをロードすることで、ページング構造を使用してメモリをマップした場合と同じ方法で、再配置(修正)または位置独立コードを使用してメモリの一部にタスクをポイントできます。これで十分でしょうか?
  • ARMプロセッサのメモリ保護ユニットについても読んだことがあります。これらは役に立ちますか?

MMUのないシステムでタスクを管理する「通常の」方法はありますか?

回答:


16

MMUを必要としないオペレーティングシステムを設計することは実際にはそれほど難しくありません。あなたがしなければならない必要があるいくつかの便利がありますが、克服できないものはありません。

  • 異なるタスクを異なるアドレスでロードする必要があるため、すべてのコード(カーネル、標準ライブラリ、およびベースランタイム環境の一部であるその他のコードを除く)は、位置に依存しないものとしてコンパイルする必要があります。これは、レジスタに格納された相対ジャンプとヒープアクセスのベースアドレスを意味します。x86-32の4つの汎用レジスターに慣れている場合、1つのレジスターをベースアドレスとして使用するとコストがかかるように思えるかもしれませんが、最新のアーキテクチャーにはそれ以上あり、8088でもそのためのセグメントレジスターがあります。
  • を実装できないため、Unixに似たアーキテクチャを修正する必要がありますfork。大丈夫です、ほとんどのオペレーティングシステムにはありませんfork。(あなたは持つことができますvfork。)
  • 対応するメモリを割り当てずに、大量の領域を事前に割り当てることはできません。これは、一度に1つ以上のページを割り当てても、スタックやヒープがその場で成長しないことを意味します。

MPUを使用している場合でも、マルチタスクオペレーティングシステムでは、通常どおりにタスクを互いに分離できます。MPUがない場合、メモリの分離は、タスクに任意のコードの実行を許可する場合にのみ協調的です。MPUなしでメモリを分離する1つの方法は、仮想マシンで検証済みのコードのみを使用するようにタスクを制限し、VMエンジンの一部としてソフトウェアでメモリ保護を実装することです。

uClinuxは、MMUのないプロセッサ(ARM Cortex-Mを含む)で実行されるLinuxカーネルに基づくプロジェクトです。マルチタスクに対するその制限は、本質的には、私が上で概説したものです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.