問題タブ [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.
x86 - iret を使用したユーザーモードへの切り替え
ユーザー モード (特権レベル 3) でいくつかのコードを実行する小さな OS を作成しています。そのユーザー レベルのコードから、メッセージを出力する OS に割り込みを呼び出したいと思います。今のところ、割り込みハンドラーがどのように引数を受け取るかなどはあまり気にしません。コードが実行されたことを割り込みハンドラーが私 (ユーザー) に通知するようにしたいだけです。
私の質問は: ユーザー モードでコードを実行するにはどうすればよいですか? コード セグメントとデータ セグメント (両方ともユーザー モード権限を持つ) を使用してローカル記述子テーブルをセットアップする機能があります。私が理解していないのは、これらのセグメントをcs
、ss
、およびにロードする方法ですds
。LDT を正常にロードしましたが、実際の使用方法がわかりません。を使うべきだと聞いたことがありますiret
が、正確な方法がわかりません。
もう 1 つの質問は、割り込みハンドラーがどのように機能するかということです。ベクタ番号 0x40 の割り込みハンドラをインストールして、"hello, user mode!" と出力したいとします。割り込みハンドラーのセットアップ方法は知っていますが、ユーザー モードからカーネル割り込みハンドラーに入ったときにコンテキストがどのように切り替わるのか正確にはわかりません。cs
ルーチンは IDT エントリで指定されたコード セグメントから実行されるため、レジスタを変更する必要があることはわかっています。スタックセレクターもおそらく変更されることも理解していますが、これについては確信が持てません。
割り込みゲートが呼び出されたときにどのようなコンテキスト変更が行われるかを誰かに説明してもらえますか?
security - BIOSコードの変更/BIOSのフラッシュ
私はオペレーティングシステムの開発と低レベルのブートローダーの開発に多くの時間を費やしてきました。しかし、今は、低レベルの環境を離れず、セキュリティに関連することを行わずに、オペレーティングシステムから少し時間を取ってみたいと思っています。
そこで、起動前の認証スキームに従って、独自の標準パスワードユーティリティを構築することにしました。ソフトウェアを少なくとも少しポータブルにしたいので、できるだけ外部サポートを使用しないようにします。実行中のリアルモードOS内からセルフチェックとint19ブートストラップの間のどこかでBIOSに「フック」することができれば、私は最善だと思いました。
ただし、BIOSコードを変更する方法に関する情報を見つけることは不可能であることが判明しました。前述の方法を達成する方法については何も見つかりませんでした。BIOSをフラッシュする方法を説明しているページしか見つかりませんでした。
BIOSコードの読み取り/書き込み方法を知っている人はいますか?または、誰かがこれを説明するページへのリンクを提供できますか?
私は自分のデバイスをブリックすることが可能であるだけでなく、その可能性もあることを知っています。私はリスクを認識しており、それを喜んで受け入れます。
c++ - 自分の OS カーネルでの C++ の静的コンストラクター
私は C++ でカーネルを作成しようとしていますが、OS 開発の初心者です。現在、モニターに表示するように実装cout
していますが、いくつかの問題に直面しています。私が尋ねている質問がばかげていることは知っていますが、私はC ++の初心者でもあります。
write
システム関数を呼び出して画面に表示する OStream クラスを作成しました。その基本クラスは私の Video クラスです。このクラスは名前空間 std に含まれています。したがって、主な問題は、OStream のオブジェクトを作成するときに、そのコンストラクターを呼び出していないため、基本クラスのコンストラクターを呼び出していないため、ビデオメモリが初期化されていないため、画面に何も表示されないことです。
これが私のコードです:
OStream
上記のコードでは、OStream.cpp ファイル自体にクラスのオブジェクトを作成しています。しかし、メイン モジュールでオブジェクトを作成すると、そのコンストラクタが正常に呼び出されますが、動作しcout
ません。
つまり、オブジェクトを明示的に作成すると完全に機能しますが、オブジェクトを暗黙的に作成するにはどうすればよいでしょうか。
また、Interrupt.cpp モジュールでも同じことが起こっています。
ですから、この種の問題を解決するのを手伝ってください。私を助けてください。どんな助けでも大歓迎です。ありがとうございました。
c++ - カーネルで STLPort を使用するには?
C++ でカーネルを開発しています。しかし、私は書きたくありませんstdlib
; そのためにSTLport
http://www.stlport.org/をダウンロードしましたが、インストール方法と使用方法がわかりません。
カーネルの構築に Linux を使用しています。
カーネルで C++ 標準ライブラリを使用するにはどうすればよいですか?
また、STLport からすべてのライブラリを移植したくありません。選択したライブラリを除外するにはどうすればよいですか? などのようstd::string
に。std::vector
device-driver - ATA/IDE 割り込みを確認する適切な方法は何ですか?
私は現在、趣味の OS、具体的には ATA ドライバーに取り組んでいます。割り込みを伴う PIO データ入力コマンドで問題が発生しています。READ MULTIPLE コマンドを実行して、ブロックごとに割り込みを発生させながら、ブロックごとにドライブから複数のセクターを読み取ろうとしています。
4 ブロック (ブロックごとに 1 セクター) の読み取りを要求した場合。データ ブロックごとに 1 つずつ、合計 4 つの割り込みが発生すると予想しています。4 番目の割り込みを受信すると、すべてのデータを転送したことを識別し、それに応じてリクエスト構造を更新できます。ただし、VirtualBox では、最後のデータ ブロックが転送された後、さらに別の割り込みを受信したことがわかりました (STATUS = 0x50、READY、OVERLAPPED MODE SERVER REQ)。ステータス レジスタを読み取るだけでクリアできますが、仕様によると 5 番目の割り込みを受信する必要はないと思います。
では、ATA デバイスによって発行された割り込みを確認する適切な方法は何ですか?
この例では、READ MULTIPLE コマンドを発行すると、ISR は次のことを行います。
- CPU 割り込みを無効にし、nIEN を設定します
- DATA レジスタから 1 つのデータ ブロック (セクタではありません!) を読み取ります。
- すべてのデータが読み取られた場合は、STATUS レジスタを読み取って「余分な」割り込みをクリアします。
- nIEN をクリアして終了し、マスター PIC とスレーブ PIC の両方に EOI を送信します。
PIO データ入力コマンド プロトコルの ATA 仕様は、ステータス レジスタを読み取る必要があることを示していません。そのことから、割り込みを受け取ったら、プロトコルに従い、EOI を PIC に送信して終了するだけでよいと思いました。nIEN の設定/クリアに関しては、VirtualBox を扱う際に、これを行わないと、最初の割り込みを超えて割り込みを受け取らないことがわかりました。そのため、ISR に入るときに nIEN を設定し、出発する前にクリアします。効果はないと思いますが、その特定のレジスタの読み取り/書き込みに関連している必要があります。
assembly - IDT を構築するには GDT が必要ですか?
私は Atom-32bit ボード (AT&T アセンブリ) に取り組んでいますが、このボードにはまだソフトウェアがありません。
IDT をビルド/使用するには GDT をビルドする必要がありますか?
アイデアは、APIC タイマーで ISR を使用することです。
assembly - ブートローダーの第2ステージをロードし、起動します
最近、ブートローダーがどのように機能するかを把握しようとしています。ローダーをnasmアセンブラーで作成し、bochsとフロッピーイメージでテストしています。
ステージ1と2のコンパイル済みバイナリは、コピーによって1つのイメージに結合されます。この画像は私が望む通りです。512バイトのstage1コード(マジックナンバーが含まれており、問題なくロードされます)と2番目のセクターの512のstage2コード。
しかし、私の問題は、セクターをRAMにロードし、そこにジャンプすることだと思います。私のコードに何か問題がありますか?
Stage1.asm
stage2.asm
私は徹底的にグーグルで検索しましたが、セクターをラムにロードしてジャンプする方法を正確に説明しているものは何も見つかりませんでした。私のプログラムでは、2番目のセクターのマジックナンバーでさえ見つかりません。
それがアドレスのいくつかの誤算であるならば、素晴らしいでしょう。
更新:現在のソースコード、ロックアップのある行がマークされています。純粋なパラノイアから、4つのメインレジスタすべてを0に設定しました。
Update2:再び現在のバージョン。レジスタの設定からint13hの発行までの間に何も行われません。
c++ - DJGPPからMinGWへのカーネルプロジェクトの移植
MinGW&NASM(以前のDJGPP&NASM)でC++カーネルプロジェクトをコンパイルしようとしています。Cygwinも実際に試しましたが、以下の結果とまったく同じです。
- まず、に交換し
\DJGPP\bin
ました\MinGW\bin
。次のリンクエラーが発生しました:target coff-go32 not found.
- ターゲットを
elf32-i386
にスワップし、取得cannot perform PE operations on non PE output file 'build/kernel.elf'
しました。私の知る限り、「PE操作」を実行していないため、これは少し奇妙なエラーでした。 - ターゲットを再度変更し
pe-i386
、新しいエラーが発生しましたbuild/Common.o:Common.cc:(.text+0x2a): undefined reference to 'atexit'
MinGWがatexit
静的クラスの呼び出しを生成しているようです。DJGPPはしませんでした。カーネルは、シャットダウン中に独自のDTOR処理を行います。定義することでatexit
これが「解決」されることは承知していますが、それは現時点ではハックであり、長期的な解決策ではありません。むしろ、MinGWに既存のコードを(または最小限の)変更なしでコンパイルさせたいと思っています。
率直に言って、私はWindowsビルド環境にあまり詳しくないので、何をすべきかについてのヒントを使用できます。プロジェクト(上記の変更を除く)は、DJGPPで正常にコンパイルおよび起動されます。違いは、DJGGPとMinGWがコンパイル時のクラス宣言を処理する方法にあるようです。
編集:ついに故障し、Cygwin上にクロスコンパイラーを構築しました。すべてが現在機能しています。
linux-kernel - 起動時に割り当てられたメモリを取得する
起動時にメモリを割り当てる必要があります。仮想アドレスではなく、物理アドレスが必要です。また、DMA リージョンからは取得したくありません。それは私の目的ではありません。
alloc_bootmem()、alloc_bootmem_pages() を試しましたが、仮想アドレスが返されます。alloc_low_page() も調べました...期待どおりに機能しませんでした。
つまり、RAM にある種の予約領域が必要です..カーネルによってマップされる必要はありません..私は自分でその領域を管理しようとします。すべての起動で物理領域を同じにする必要があります。
また、 init/main.c : start_kernel() にメモリを割り当てようとしましたが、それも機能しませんでした。
どこで/何を探すべきかとして、今は行き詰まっています。
do_it_here_in_this_way を伝えるよりも、正しい方向へのポインターとして答えたいと思います。
ありがとう :)
android - Android OS 向けの開発
バグ修正やパッチの提供を開始できるように、Android OS 向けの開発方法を学びたいと思っています。Android 向けのアプリの開発には興味がありません。Linux や OS の開発経験はありませんが、ソフトウェア開発者として数年間働いています。私のような人が始めるのに適した場所はどこですか?
私はdeveloper.android.comに行きましたが、これはAndroidでアプリを開発するためだけのもののようです。source.android.com は、ソースを入手してビルド環境をセットアップする方法を学ぶ場所のようですが、システムの根幹がどのように機能するかについての情報があまりないか、またはソースコード自体。おそらく、他のディストリビューション向けの開発に関連するドキュメントを利用できると思いますが、Android での開発に特化したリソースはありますか? Android 向けの開発と他の主要なディストリビューション向けの開発との間に、調査を行う際に考慮すべき大きな違いはありますか?
特定のハードウェアに関して必要なその他の技術情報を入手するにはどうすればよいですか? フォーラムを閲覧すると、さまざまな電話に存在する特定のラジオまたは GPS ハードウェア モデルを知っているように見える人もいれば、あるモデルが別のモデルとどのように機能するかについてある程度の知識を持っている人もいます。簡単に調べましたが、「Samsung Fascinate Hardware」をグーグルで検索して、コンポーネントとそのドキュメントのリストを取得できるようには見えません。高度なデバイス プログラミングを行っている人は、この情報をどのように入手していますか?
ありがとう、
マイク