私はあなたがCのようなものでOSを書くことにどのように着手したかを理解しようとしています。
私は常にCを使用してアプリケーションを作成しました。たとえば、malloc
などのコマンドを使用fork
してOSに要求します。OS自体(または特にカーネル)をプログラミングしているときにこれらのメソッドが存在しない場合、どのように記述しますか?
メモリやプロセス管理などをどのように実装しますか。具体的には、どの関数が使用可能で、何が公開されているため、アセンブラではなくCでこれを実行できますか。(メモリ/デバイス/割り込みと対話するために何を呼び出しますか?)
これは小さな質問ではないと思いますので、さらに読んでいただけると嬉しいですが、それぞれの質問に関連する要点をまとめていただければ、とても便利です!
前もって感謝します!
編集(8/3/20):
この関連する質問には、質問への回答に役立ついくつかの優れたリソースが添付されています。
どのようにメモリを実装しますか
独自のアロケータを作成することは、一般的なシステムプログラミングの演習です。「外部」から必要なのは、管理するメモリ領域だけです。ベアメタルをプログラミングしている場合は、RAMである領域を説明するメモリマップを利用できる可能性があります。これらはmallocで管理できます。
およびプロセス管理
最新のOSでのプロセスは、多くのことです。これらには通常、独自のページテーブル、コンテキスト(プロセスが一時停止されている間に保存するレジスタ)、およびその他のプロセス固有のデータ構造がいくつかあります。
Cで設定できるデータ構造ですが、それらの「アクティブ化」(ページテーブルの切り替え、コンテキストの保存/復元)は、通常、ポータブルCで可能なものを超えています。アセンブリルーチンまたはCコードでインターリーブされたインラインアセンブリがある場合。
など、具体的には、どの関数が使用可能で、何が公開されているので、アセンブラーではなくCでこれを実行できますか?
ホストされた独立したC実装があります。独自のOSを作成する場合、通常は独立したC環境内にあり、標準ライブラリが提供する関数を自由に使用することはできません。独自のコードに依存するか、アセンブリルーチンを作成するか、コンパイラ組み込み関数を使用します。
あなたは記憶と相互作用するために何と呼びますか
整数をポインタにキャストし、ポインタを操作できます。volatile
書き込み順序で読み取り/書き込みを絶対に実行することをコンパイラーに指示できます。
デバイス
多くのデバイスはメモリマップされています。つまり、メモリの読み取り/書き込みを行っているかのように通信できます(簡略化されています。キャッシュを使用すると、これが少し難しくなります)。他のデバイスは、専用のI / Oポートを介してアドレス指定できます。これらには特別な命令が必要です。これは、コンパイラに組み込み関数があるか、アセンブリで実装する必要があります(Cから呼び出すことができます)。
割り込み?
上記のように。割り込みの有効化/無効化などの部分では、専用の命令が必要になる場合があります。割り込みハンドラの設定は、関数ポインタを正しいアドレスに書き込むだけの問題かもしれません。
さらに読むことを含む回答に満足していますが、各質問に関連する要点を要約することができれば、私にとって非常に便利です!
私の提案は、ARM Cortex-Mを入手して、それを試してみることです。コメントに記載されているosdevも非常に優れたリソースです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加