カーネル(および一般的なオペレーティングシステム)はCでどのように記述されていますか?

ミステリアスワッフル

私はあなたがCのようなものでOSを書くことにどのように着手したかを理解しようとしています。

私は常にCを使用してアプリケーションを作成しました。たとえば、mallocなどのコマンドを使用forkしてOSに要求します。OS自体(または特にカーネル)をプログラミングしているときにこれらのメソッドが存在しない場合、どのように記述しますか?

メモリやプロセス管理などをどのように実装しますか。具体的には、どの関数が使用可能で、何が公開されているため、アセンブラではなくCでこれを実行できますか。(メモリ/デバイス/割り込みと対話するために何を呼び出しますか?)

これは小さな質問ではないと思いますので、さらに読んでいただけると嬉しいですが、それぞれの質問に関連する要点をまとめていただければ、とても便利です!

前もって感謝します!

編集(8/3/20):

この関連する質問には、質問への回答に役立ついくつかの優れたリソースが添付されています。

オペレーティングシステムの開発を開始するためのリソースは何ですか?

a3f

どのようにメモリを実装しますか

独自のアロケータを作成することは、一般的なシステムプログラミングの演習です。「外部」から必要なのは、管理するメモリ領域だけです。ベアメタルをプログラミングしている場合は、RAMである領域を説明するメモリマップを利用できる可能性があります。これらはmallocで管理できます。

およびプロセス管理

最新のOSでのプロセスは、多くのことです。これらには通常、独自のページテーブル、コンテキスト(プロセスが一時停止されている間に保存するレジスタ)、およびその他のプロセス固有のデータ構造がいくつかあります。

Cで設定できるデータ構造ですが、それらの「アクティブ化」(ページテーブルの切り替え、コンテキストの保存/復元)は、通常、ポータブルCで可能なものを超えています。アセンブリルーチンまたはCコードでインターリーブされたインラインアセンブリがある場合。

など、具体的には、どの関数が使用可能で、何が公開されているので、アセンブラーではなくCでこれを実行できますか?

ホストされた独立したC実装があります。独自のOSを作成する場合、通常は独立したC環境内にあり、標準ライブラリが提供する関数を自由に使用することはできません。独自のコードに依存するか、アセンブリルーチンを作成するか、コンパイラ組み込み関数を使用します。

あなたは記憶と相互作用するために何と呼びますか

整数をポインタにキャストし、ポインタを操作できます。volatile書き込み順序で読み取り/書き込みを絶対に実行することをコンパイラーに指示できます。

デバイス

多くのデバイスはメモリマップされています。つまり、メモリの読み取り/書き込みを行っているかのように通信できます(簡略化されています。キャッシュを使用すると、これが少し難しくなります)。他のデバイスは、専用のI / Oポートを介してアドレス指定できます。これらには特別な命令が必要です。これは、コンパイラに組み込み関数があるか、アセンブリで実装する必要があります(Cから呼び出すことができます)。

割り込み?

上記のように。割り込みの有効化/無効化などの部分では、専用の命令が必要になる場合があります。割り込みハンドラの設定は、関数ポインタを正しいアドレスに書き込むだけの問題かもしれません。

さらに読むことを含む回答に満足していますが、各質問に関連する要点を要約することができれば、私にとって非常に便利です!

私の提案は、ARM Cortex-Mを入手して、それを試してみることです。コメントに記載されているosdevも非常に優れたリソースです。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

オペレーティングシステムのカーネルが通常CまたはC ++で記述されているのはなぜですか?

分類Dev

Jupyter Notebookのカーネルとは何ですか?実際のカーネル(オペレーティングシステムに関連)とどのように異なる/類似していますか?

分類Dev

ディスプレイのフロントパネルではなく、ソフトウェア/オペレーティングシステムによってディスプレイ出力を変更するにはどうすればよいですか?

分類Dev

ネストされた相対シンボリックリンクは、オペレーティングシステム間およびgitでどのように動作しますか?

分類Dev

一部のオペレーティングシステムのイベント処理がcではなくasmで記述されているのはなぜですか?

分類Dev

オペレーティングシステムはどのようにしてバッテリーレベルを知ることができますか?

分類Dev

オペレーティングシステムがインストールされていない場合、ハードウェアが64ビット対応であるとどのように判断しますか?

分類Dev

コンピュータをシャットダウンします。オペレーティングシステムはどのようにそれを実現しますか?(Cカーネル開発)

分類Dev

UbuntuをオペレーティングシステムとしてWindowsと一緒に戻すにはどうすればよいですか?

分類Dev

オペレーティングシステムは、ユーザースペースプログラムがカーネルスペースプログラムと相互作用することをどのように許可しますか?

分類Dev

一般的なオペレーティングシステムでは、スワッピングはデフォルトで有効になっていますか?

分類Dev

bash はさまざまなオペレーティング システムでどのように機能しますか?

分類Dev

Mactruecryptを最新のMacオペレーティングシステムで動作させるにはどうすればよいですか

分類Dev

Mactruecryptを最新のMacオペレーティングシステムで動作させるにはどうすればよいですか

分類Dev

ページビューのようなレポートを取得する方法、ユーザーがグーグルアナリティクスの特定のページに費やす時間はどれくらいですか?一般的なレポートではありません

分類Dev

Ubuntu16オペレーティングシステムにTeamViewerをインストールするにはどうすればよいですか

分類Dev

.debパッケージを構成して、32ビットオペレーティングシステムにのみインストールし、64ビットオペレーティングシステムにはインストールしないようにすることはできますか?

分類Dev

別のオペレーティングシステムのDockerイメージレイヤーを作成するにはどうすればよいですか?

分類Dev

SPARQLクエリを使用してグラフデータ内のさまざまなタイプのノードおよびエッジエンティティを一覧表示してカウントするにはどうすればよいですか?

分類Dev

プログラムでJavaのオペレーティングシステムを確認するにはどうすればよいですか?

分類Dev

一般的なプラグ可能なコレクションのフィルターを設計するにはどうすればよいですか?

分類Dev

オペレーティングシステムに「根付いていない」プログラムを呼び出すにはどうすればよいですか

分類Dev

Linuxカーネルの物理ページのコンテンツを表示およびフラッシュするにはどうすればよいですか?

分類Dev

オペレーティングシステムはどのようにプロセスを管理しますか

分類Dev

異なるオペレーティングシステムで\ n、\ r、\ r \ nを処理するにはどうすればよいですか?

分類Dev

1 Javaのカフカの消費者のためにどのように多くのオペレーティングシステムリソースを必要とされていますか?

分類Dev

ターミナルからインストールしようとすると、常に「オペレーティングシステムがpackagecloud.ioでサポートされていないか、このスクリプトのOS検出に失敗しました」というエラーが表示されます。

分類Dev

偽のRAIDはオペレーティングシステム(Linux)とどのように通信しますか?

分類Dev

オペレーティングシステムは、サポートされていないファイルシステムでフォーマットされたネットワークドライブにアクセスできますか?

Related 関連記事

  1. 1

    オペレーティングシステムのカーネルが通常CまたはC ++で記述されているのはなぜですか?

  2. 2

    Jupyter Notebookのカーネルとは何ですか?実際のカーネル(オペレーティングシステムに関連)とどのように異なる/類似していますか?

  3. 3

    ディスプレイのフロントパネルではなく、ソフトウェア/オペレーティングシステムによってディスプレイ出力を変更するにはどうすればよいですか?

  4. 4

    ネストされた相対シンボリックリンクは、オペレーティングシステム間およびgitでどのように動作しますか?

  5. 5

    一部のオペレーティングシステムのイベント処理がcではなくasmで記述されているのはなぜですか?

  6. 6

    オペレーティングシステムはどのようにしてバッテリーレベルを知ることができますか?

  7. 7

    オペレーティングシステムがインストールされていない場合、ハードウェアが64ビット対応であるとどのように判断しますか?

  8. 8

    コンピュータをシャットダウンします。オペレーティングシステムはどのようにそれを実現しますか?(Cカーネル開発)

  9. 9

    UbuntuをオペレーティングシステムとしてWindowsと一緒に戻すにはどうすればよいですか?

  10. 10

    オペレーティングシステムは、ユーザースペースプログラムがカーネルスペースプログラムと相互作用することをどのように許可しますか?

  11. 11

    一般的なオペレーティングシステムでは、スワッピングはデフォルトで有効になっていますか?

  12. 12

    bash はさまざまなオペレーティング システムでどのように機能しますか?

  13. 13

    Mactruecryptを最新のMacオペレーティングシステムで動作させるにはどうすればよいですか

  14. 14

    Mactruecryptを最新のMacオペレーティングシステムで動作させるにはどうすればよいですか

  15. 15

    ページビューのようなレポートを取得する方法、ユーザーがグーグルアナリティクスの特定のページに費やす時間はどれくらいですか?一般的なレポートではありません

  16. 16

    Ubuntu16オペレーティングシステムにTeamViewerをインストールするにはどうすればよいですか

  17. 17

    .debパッケージを構成して、32ビットオペレーティングシステムにのみインストールし、64ビットオペレーティングシステムにはインストールしないようにすることはできますか?

  18. 18

    別のオペレーティングシステムのDockerイメージレイヤーを作成するにはどうすればよいですか?

  19. 19

    SPARQLクエリを使用してグラフデータ内のさまざまなタイプのノードおよびエッジエンティティを一覧表示してカウントするにはどうすればよいですか?

  20. 20

    プログラムでJavaのオペレーティングシステムを確認するにはどうすればよいですか?

  21. 21

    一般的なプラグ可能なコレクションのフィルターを設計するにはどうすればよいですか?

  22. 22

    オペレーティングシステムに「根付いていない」プログラムを呼び出すにはどうすればよいですか

  23. 23

    Linuxカーネルの物理ページのコンテンツを表示およびフラッシュするにはどうすればよいですか?

  24. 24

    オペレーティングシステムはどのようにプロセスを管理しますか

  25. 25

    異なるオペレーティングシステムで\ n、\ r、\ r \ nを処理するにはどうすればよいですか?

  26. 26

    1 Javaのカフカの消費者のためにどのように多くのオペレーティングシステムリソースを必要とされていますか?

  27. 27

    ターミナルからインストールしようとすると、常に「オペレーティングシステムがpackagecloud.ioでサポートされていないか、このスクリプトのOS検出に失敗しました」というエラーが表示されます。

  28. 28

    偽のRAIDはオペレーティングシステム(Linux)とどのように通信しますか?

  29. 29

    オペレーティングシステムは、サポートされていないファイルシステムでフォーマットされたネットワークドライブにアクセスできますか?

ホットタグ

アーカイブ