問題タブ [osdev]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
4 に答える
3292 参照

operating-system - nasm で 32 ビットと 16 ビットのコードを混在させる

これはシステムに関する低レベルの質問です。

プロテクト モードからリアル モードに戻ろうとしているので、32 ビット コードと 16 ビット コードを混在させる必要があります。ちょっとした背景情報として、私のコードは GRUB の起動直後にこれを行っているので、できることとできないことを教えてくれる厄介なオペレーティング システムはありません。

とにかく、アセンブリで [BITS 32] と [BITS 16] を使用して、どのタイプの操作を使用する必要があるかを nasm に伝えますが、コードをテストすると、bochs を使用して、いくつかの操作で bochs が実行されていないコードのように見えます私が書いた。0x66アセンブラがエクストラと's に固執しているように見え、0x67bochs を混乱させます。

では、同じファイルに 32 ビットと 16 ビットのコードが混在している場合に、nasm でコードを正常にアセンブルするにはどうすればよいでしょうか? 何か裏技あるの?

0 投票する
12 に答える
5527 参照

linux - Linux や BSD カーネルの内部構造を理解するにはどうすればよいですか?

オペレーティング システムの内部についての知識を深めたいと考えています。プロセス管理、メモリ管理など。
Linux カーネルか BSD カーネルのどちらかを知ることで学習しようと考えていました。
学習目的に適したカーネルはどれですか?
始めるのに最適な場所は何ですか?
何か良い本を教えてください。

0 投票する
28 に答える
122873 参照

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

私が常にやりたかったことの 1 つは、独自のオペレーティング システムを開発することです (必ずしも Linux や Windows のように凝っているわけではありませんが、既に行った単純なブート ローダーよりは優れています)。

単純な「Hello World」OS を作成するためのリソースやガイドを見つけるのに苦労しています。

Linux や BSD を検討することを勧める人が多いことはわかっています。しかし、そのようなシステムのコード ベースは (おそらく) 非常に大きいため、どこから始めればよいかわかりません。

助言がありますか?

更新: Google からこの投稿にたどり着いた人が簡単に利用できるように、OS 開発リソースをいくつか紹介します。

その他のリソース:

「 MikeOSは、単純な OS がどのように機能するかを示すための学習ツールです。複雑なドライバーを必要としないように、BIOS アクセスに 16 ビット リアル モードを使用します」という素晴らしいリソースを見つけました。

2008 年 11 月 14 日更新

Freebyte's Guide to...Free and non-free Operating Systemsで、OSKit や ExOS ライブラリなどのキットにリンクしているリソースを見つけました。これらは、OS 開発を始めるのに非常に便利なようです。

2009 年 2 月 23 日更新

Ric Tokyoは、この質問でnanoosを推薦しました。Nanoos は C++ で書かれた OS です。

2009 年 3 月 9 日更新

Dinah は、意欲的な OS 開発者のスタック オーバーフローに関する有益な議論をいくつか提供してくれました。カスタム オペレーティング システムを作成する際の障害については、OS の開発中に遭遇する可能性のある落とし穴について説明しており、OS 開発はより一般的な議論です。

2009 年 7 月 9 日更新

LB は、OS 開発を学ぶ学生向けに設計された教育用 OS であるPintos Projectへのリンクを提供しました。

2009 年 7 月 27 日に更新 (まだ勢いがあります!)

私は、23 の講義を特徴とするバークレーのオンライン OS コースに出くわしました。

TomOSは、小さなメモリ マネージャーとマウス サポートを含むMikeOSのフォークです。MikeOS として、教育プロジェクトとして設計されています。NASM アセンブラで書かれています。

2009 年 8 月 4 日更新

スライドやその他の資料は、上記のバークレーのオンライン レクチャーに付随するものであることがわかりました。

2009 年 8 月 23 日更新

stackoverflow でosdev とタグ付けされたすべての質問

OS/161は、シミュレートされたハードウェア上で動作する c 言語で書かれたアカデミック OS です。この OS は Nachos に似ています。ありがとうノベロクラット!

tangurena は、組み込みシステム向けに設計された OS であるhttp://en.wikipedia.org/wiki/MicroC/OS-IIを推奨しています。コンパニオンブックもあります。

Robert Love によるLinux Kernel Developmentは、Anders によって提案されています。これは、「広く評価されている内部関係者による Linux カーネルの考察」です。

2009 年 9 月 18 日更新

完全に c# で記述された OS であるCosmosについて教えてくれた Tim S. Van Haren に感謝します。

tgiphil は、マネージド オペレーティング システム アライアンス (MOSA) フレームワーク、「共通中間言語に基づくマネージド オペレーティング システムの開発を促進するためのツール、仕様、およびソース コードのセット」について語っています。

2009 年 9 月 24 日更新

Steve は、Visual Studio を使用して Windows で開発するためのリソースをいくつか見つけました。BrokenThorn のガイドのセットアップと VS 2005またはOSDev の VS セクションを参照してください。

2012 年 9 月 5 日更新

kerneltrap.org は利用できなくなりました。Linux カーネル v0.01 は、kernel.orgから入手できます。

2012 年 12 月 21 日更新学期のプロジェクトとして設計され た基本的な OS 開発チュートリアル。基本的なコンポーネントを使用して OS を構築する方法について説明します。初心者にとって非常に良いスタートです。関連論文. ありがとうスルジャン!

2013 年 11 月 15 日更新

シンプルなオペレーティング システムをゼロから作成する. ありがとうジェームズ・ムーア!

2013 年 12 月 8 日更新

コンピューターのオペレーティング システム の作り方 ありがとう ddtoni!

2014 年 3 月 18 日更新

ToAruOS GUIも含めほぼゼロから構築したOS

2016 年 9 月 12 日更新

独自のおもちゃのオペレーティング システムを作成する

2016 年 12 月 10 日更新

単純なオペレーティング システムの作成 — スクラッチから(@Tyler C に感謝)

0 投票する
13 に答える
9007 参照

operating-system - x86 アーキテクチャ用のオペレーティング システムの開発

x86 アーキテクチャ用のオペレーティング システムを開発する予定です。

  • プログラミング言語にはどのようなオプションがありますか?
  • できれば Windows 環境で、どのような種類のコンパイラを利用できますか?
  • オペレーティング システムの開発についてさらに学ぶのに役立つ情報源はありますか?
  • 仮想マシンまたは物理ハードウェアでオペレーティング システムをテストする方が適切ですか?

助言がありますか?

0 投票する
7 に答える
5493 参照

operating-system - malloc/free 以外に、プログラムは OS が何かを提供する必要がありますか?

私が取り組んでいる OS 用のカーネル (実際には「コア」と呼んでいますが、基本的には同じです) の設計に取り組んでいます。マルチタスキングやメモリ管理などの基本的なことができなければ、OS 自体の詳細は関係ないので、まずはそこから取り組む必要があります。malloc ルーチンの設計について質問があります。

malloc() はカーネル自体の一部 (私はこれに傾倒しています) またはプログラムの一部になると考えていますが、C 標準ライブラリの独自の実装を作成する必要があります。というわけで、malloc を書きます。この点に関して、私の質問は実際にはかなり単純です。C (または C++) はそのヒープをどのように管理しますか?

私が理論の授業でいつも教えられてきたのは、ヒープは指定されたアドレスから始まり、多くの意味でスタックのように振る舞うメモリの断片であるということです。このようにして、グローバルスコープで宣言された変数が最初にあり、それぞれのスコープで宣言されると、より多くの変数がヒープに「プッシュ」され、スコープ外に出る変数は単にメモリ空間に残されることがわかります。ただし、そのスペースは空きとしてマークされているため、必要に応じてヒープをさらに拡張できます。

私が知る必要があるのは、C がこのように動的に拡大するヒープを実際にどのように処理するのかということです。コンパイルされた C プログラムは、malloc ルーチンへの独自の呼び出しを行い、独自のヒープを処理しますか? それとも、自動的に拡張するスペースを提供する必要がありますか? また、C プログラムはヒープの開始位置をどのように認識していますか?

ああ、同じ概念が他の言語にも当てはまることは知っていますが、私はその言語に最も慣れているので、例を C/C++ にしたいと思います。スタックなど他のことも気にしないようにしたいと思います。このようなことは自分で処理できると思います。

したがって、私の本当の質問は、malloc/free (ページ自体の取得と解放などを処理する) 以外に、プログラムは OS が他に何かを提供する必要があるのでしょうか?

ありがとう!

EDIT mallocルーチン自体の実際の動作よりも、Cがヒープに関連してmallocを使用する方法に興味があります。それが役立つ場合、私はこれを x86 で実行していますが、C はクロス コンパイラであるため、問題にはなりません。^_^

さらに編集:用語が混乱している可能性があることを理解しています。「ヒープ」は、プログラムがグローバル/ローカル変数などを格納する場所であると教えられました。私はアセンブリ プログラミングで「スタック」を扱うことに慣れていましたが、代わりにおそらくそれを意味していることに気付きました。私のちょっとした調査によると、「ヒープ」は、プログラムがそれ自体に割り当てた合計メモリ、または OS が提供したメモリのページの合計数 (および順序) を指すのによく使用されます。

それで、それを念頭に置いて、拡大し続けるスタックにどのように対処すればよいでしょうか? (私の C 理論の授業は軽度の... 欠陥があったようです。)

0 投票する
5 に答える
7548 参照

operating-system - カーネル開発で使用されるスタックサイズ

私はオペレーティングシステムを開発していて、カーネルをプログラミングするのではなく、カーネルを設計しています。このオペレーティングシステムはx86アーキテクチャを対象としており、私のターゲットは最新のコンピューターを対象としています。必要なRAMの推定数は256Mb以上です。

各スレッドのスタックをシステムで実行するのに適したサイズはどれくらいですか?最大長に達した場合にスタックを自動的に拡張できるようにシステムを設計する必要がありますか?

RAMのページが4kまたは4096バイトであることを正しく覚えていれば、それは私にはそれほど多くないように思えます。特に再帰を多く使用する場合は、一度に1000を超えるインテガーをRAMに入れたいと思う時期がはっきりとわかります。さて、本当の解決策は、プログラムがmalloc独自のメモリリソースを使用して管理することでこれを実行することですが、実際には、これに関するユーザーの意見を知りたいと思います。

4kは、最新のコンピュータープログラムをスタックするのに十分な大きさですか?スタックはそれよりも大きくする必要がありますか?スタックは、あらゆるタイプのサイズに対応するために自動拡張する必要がありますか?私は、実用的な開発者の観点とセキュリティの観点の両方からこれに興味を持っています。

4kはスタックには大きすぎますか?通常のプログラム実行を考えると、特にC ++のクラスの観点からmalloc/new、関数呼び出しでスローされるデータを最小限に抑えるために、優れたソースコードはクラスの作成時に必要なデータになりがちです。

私がまだ理解していないのは、プロセッサのキャッシュメモリのサイズです。理想的には、スタックは処理を高速化するためにキャッシュに存在すると思いますが、これを実現する必要があるかどうか、またはプロセッサが処理できるかどうかはわかりません。私はテスト目的で通常の退屈な古いRAMを使用することを計画していました。決められない。オプションは何ですか?

0 投票する
2 に答える
2053 参照

operating-system - GRUBがカーネルから自動的に起動できるようにする

オペレーティングシステム用のカーネルを開発しています。それを実行するために、GRUBを使用することにしました。現在、GRUBの、、、パッドファイルとカーネル自体にスクリプトを添付してstage1stage2起動可能にしています。唯一の問題は、実行するときに、カーネルの場所とカーネルの大きさを手動でGRUBに通知してから、次のように起動する必要があることです。

KERNELSIZEブロック単位のカーネルのサイズです。これは最初は問題なく問題ありませんが、これらの値をバイナリで取得して、GRUBにカーネルを自動的に起動させることは可能ですか?それを達成する方法について何か提案はありますか?

0 投票する
3 に答える
7619 参照

keyboard - x86 アセンブリでの保護モードのキーボード アクセス

私が開発している非常に基本的なカーネルのキーボード入力に取り組んでおり、完全に立ち往生しています。私が知る必要がある情報を示すことができる情報をオンラインで見つけることができないようです。

私のカーネルは現在プロテクト モードで実行されているため、リアル モードにジャンプしてから戻らないとリアル モード キーボード ルーチンを使用できません。これは回避しようとしています。プロテクト モードからキーボードにアクセスできるようにしたい。誰もこれを行う方法を知っていますか? これまでに見つけた唯一のことは、in/out ポートを使用してコントローラーと直接通信する必要があることですが、それ以上は困惑しています。もちろん、これは頻繁に出てくるものではありません。通常、アセンブリ チュートリアルでは、オペレーティング システムが実行されていることを前提としています。

私は x86 アセンブリに非常に慣れていないので、保護モードから標準ハードウェアを操作するための優れたリソースを探しています。Assembly ソース コードを NASM でコンパイルし、DJGPP でコンパイルされた C ソース コードにリンクしています。助言がありますか?

0 投票する
15 に答える
30682 参照

operating-system - オペレーティング システムを開発するためのリソース

私はオペレーティング システムを書くことを計画していますが、オペレーティング システムについてはあまり知りません。私が学ぶために読むべき良いリソースや本はありますか? あなたの推奨事項は何ですか?

0 投票する
2 に答える
2843 参照

memory-management - OS は通常、カーネル メモリとページ処理をどのように管理していますか?

私はカーネルの設計に取り組んでおり、ページングに関していくつか質問があります。

これまでのところ、私が持っている基本的な考え方は次のとおりです。各プログラムは、プログラムが呼び出すことができるカーネル関数用に予約したセクションを差し引いた、独自の (またはそう考える) 4G のメモリを取得します。そのため、OS は、プログラムが操作中に使用する必要があるページをメモリにロードする何らかの方法を見つける必要があります。

ここで、メモリとプロセッサ時間が無限にあると仮定すると、存在しない (またはスワップアウトされた) ページのページ フォールトを使用して、プログラムが書き込みまたは読み取りを行った任意のページをロード/割り当てることができたので、OSしかし、現実の世界では、このプロセスを最適化する必要があります。これにより、プログラムがこれまでに触れたすべてのメモリを常に消費することはありません。

だから私の質問は、OSは一般的にこれをどのように行うのですか? 私の最初の考えは、プログラムがページを設定/解放するために呼び出す関数を作成することです。これは、それ自体でメモリを管理できますが、プログラムは通常これを行いますか、それともコンパイラは自由に統治できると想定しますか? また、コンパイラは、かなり大きなメモリ セグメントを割り当てる必要がある状況をどのように処理しますか? Xページを順番に渡そうとする関数を提供する必要がありますか?

これは明らかに言語固有の質問ではありませんが、私は標準 C に部分的であり、C++ が得意なので、コード例をそれまたはアセンブリのいずれかにしたいと思います。(アセンブルは必要ありません。できるだけ多くの C コードで動作するようにし、最後のステップとして最適化するつもりです。)

同様に答えやすいもう 1 つのこと: プログラムが呼び出す必要があるカーネル関数を一般的にどのように処理しますか? プログラムが呼び出すことができるほとんどの基本的な関数/プロセス固有のメモリを含むメモリのセット領域(仮想空間の終わりに向かって考えていた)を持つだけで問題ありませんか? そこからの私の考えは、プログラムが何か重要なことをする必要があるときに、カーネル関数に非常に凝ったことをさせ、ページをスワップアウトすることです (プログラムが自分のスペースで機密性の高いカーネル関数を認識できないようにするため)。この時点でセキュリティに焦点を当てます。

だから私は、詳細よりも一般的なデザインのアイデアについてもっと心配していると思います. カーネルを GCC と完全に互換性のあるものにしたいと考えており、通常のプログラムが必要とするすべてのものを提供できるようにする必要があります。

アドバイスをありがとう。