問題タブ [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.
dynamic - ランタイム ライブラリ ローダーの実装
Cライブラリさえ存在しない組み込みプロジェクトの1つのライブラリのように、dlopen()、dlsym()、dlclose()、dlerror()を書くことを考えていました(そのため、すでに独自のC / C ++を書いています)そのためのライブラリは、ここ www.libcaprice.com で見つけることができます)。しかし、私を悩ませているのは、この動的ライブラリ ローダーの実装です。http://www.sco.com/developers/devspecs/gabi41.pdfの論文を見てみましたが、再配置と GOT の初期化方法について頭を悩ませているようには見えません。
最初は、ライブラリを fopen() し、ELF ヘッダーを調べて、それが正しい動的ライブラリであることを検証し、dlsym() が使用されているときにいくつかのシンボルを検索するのは簡単だと考えました。これに関する問題は、ライブラリ自体、またはより具体的にはGOTを初期化する必要があることです。また、物事が特定の境界と配置内にあることを確認するために、いくつかの再配置を行う必要があります。
この機能のユーザー空間での実装をいくつか調べましたが、それらはかなり長く、複雑で、文書化されていないようです。したがって、私の質問は本当に次のとおりです。許可されたライセンス、MIT、またはパブリックドメインの下でライセンスされているdydlのスタンドアロンのオープンソース実装はありますか. そうでなければ、何もなく、自分で実装する必要がある場合、誰かが私がどこから始めればよいか正しい方向に向けることができますか?
Application V Binary Interface Specification をリンクしないでください。動的リンクとロードに関する部分は既に読みましたが、再配置の概念を理解できる方法で説明しているものはないようです。
osdev - メモリマップドI/Oアドレスはどこから来ますか?
私はいくつかの愛好家のOS開発をいじっていて、メモリマップドI/Oアドレスについて少し混乱しています。メモリマップドI/Oの概念全体を理解していますが、開発者がハードウェアを操作するためのアドレスを取得する方法を理解しようとしています。
アドレスはハードウェアベンダーによって指定されていますか、それともすべてのコンピューターの標準アドレスのようなものですか?たとえば、テキスト印刷用のVGAメモリはアドレス0xB8000から始まります。これはすべてのx86マシンの標準ですか?もしそうなら、誰がその基準を設定しましたか?たとえば、イーサネットカードと通信したい場合、通信に使用するアドレスまたはポートをどのように知ることができますか?
前もって感謝します。
debugging - Ubuntu 11.10 用のオペレーティング システム デバッガー
私は (Linux カーネルを構築するのではなく) オペレーティング システムの開発を行ってきましたが、最新の OS 用にデバッガーが必要になるところまで来ました。Bochs (Win 7 パーティションの下) を試しましたが、USB が認識されません (フォーマットされていないため、現在特定のセクターを読み取っています)。
Ubuntu 11.10 用のカスタム ビルド OS をデバッグできるデバッガーはありますか?
gcc - SSEレジスタのロード
OS開発クラスの宿題プロジェクトに取り組んでいます。1つのタスクは、割り込み時にSSEレジスタのコンテキストを保存することです。これで、コンテキストの保存と復元が簡単になりました(fxsave / fxsave)。しかし、私はテストに問題があります。同じサンプル日付をレジスタの1つに入れたいのですが、取得するのはエラー割り込み6だけです。コードは次のとおりです。
私は解決策をインターネットで検索しました。私が得たのは、それが効果的なアドレス空間と関係があるかもしれないということだけです。しかし、それが何であるかはわかりません。
cross-compiling - autotools: C コンパイラは実行可能ファイルを作成できません
OS X で x86_64-elf カーネルをビルドしています。ビルド システムは autotools です。OS X で x86_64-elf 用に gcc を正常にコンパイルしてクロスコンパイルしました。autotools から生成された構成スクリプトを実行すると、次のような問題が発生します。
だから私は config.log を見て、次のことを確認します。
これは完全に理にかなっています。関連するランタイムがないため、クロスコンパイラは実行可能ファイルを生成しません。しかし、コンパイラが実行可能ファイルを生成する必要はありませんし、望んでもいないので、ブートローダー用に適切にリンクします。これをチェックしないように autotools に指示するにはどうすればよいですか?
operating-system - 一般保護違反 (x86) で障害のあるアドレスを特定する
x86 で一般保護違反 (GP#13) の ISR を作成しようとしています。例外の原因となっている障害のあるアドレスを見つける方法について、インテルのドキュメントからはわかりません。ページ フォールト例外 (GP#14) の場合、cr2 レジスタがフォールト アドレスを保持していることを知っています。どんな助けでも大歓迎です。
operating-system - entry() は、エルフに設定したエントリ ポイントから別のアドレスに入る
最近OSについて勉強中です。そして、リアルモードをプロテクトモードに変更し、シンプルなカーネルをロードするシンプルなブートローダーを書きたいと思っています。
しかし、エントリーアドレスの問題がわかりません。
まず、ブートローダーを OS.img(qemu) の最初のセクターに配置し、次にカーネルを 2 番目のセクターから開始します。
カーネルの readelf の結果
は次のとおりです。エントリ ポイント アドレスは 0x800c です。
LMA と VMA は次のとおりです。
elf タイプのカーネルを読み取り、エントリ ポイント アドレスである entry() に入るブートローダの一部。
ただし、ブートローダーを逆アセンブルすると、entry() は次のように
なります
。 *0x800c ではなく、*0x8018 を呼び出します。
なぜこれが起こるのかわかりません。手伝っていただけませんか?
x86 - (カーネルの作成) 割り込み記述子テーブルを変更するにはどうすればよいですか?
低レベルのものを少しいじるために、小さなカーネルを書いています。現在、Virtual Box で起動し、画面にテキストを表示したり、メモリを割り当てたり、その他の非常に基本的なことを行うことができます。C++ と少しの asm で書かれています。
私が探求したかったことの 1 つは、マルチタスクの背後にあるメカニズムでした。私が理解しているように、それは次のようになります。
- カーネルは、割り込み記述子テーブルを初期化して、割り込みが定期的に (ミリ秒単位など) 発行されるようにし、カーネルで定義されたルーチンを呼び出します。
- ルーチンが呼び出されると、コード/データ セグメントとスタック ポインタを別のプログラムのコンテキスト (「コンテキスト スイッチ」) のセグメントに設定することができます。
ですから、コンセプトは単純に見えましたが、詳細はもっと複雑になることはわかっていました. オンラインでいくつかのものを見つけましたが、用語は大きく異なり、例は私が持っていないコンテキスト (Linux カーネル内など) からのもののようです。
ただし、記述子テーブルを設定する方法は次のようです。
- いくつかのデータを PIC (およびその他) に送信
outb
して初期化します。 - 必要なルーチンへの関数ポインターを使用して、メモリ内に割り込みテーブルを準備します。関数がシグナル ハンドラーになることができるように注意してください。
- でテーブルをロードします
lidt
。
ただし、これらのことを具体的に行うこと、またはこれが正しいかどうかについては、あまりわかりません。当惑したカーネルライターのためのリソースを持っている人はいますか?
assembly - CMPSB命令と混同
私はこのコードを見てきましたが、rep cmpsb行について混乱しています。
cmpsb cx 回繰り返すことは理解していますが、これは 2 つの文字列をどのように比較しますか? たとえば、"Hey\0" と "hey\0" を比較していて、このループで 4 つの文字列を比較していたとします。最初の文字が異なり、それに応じて EFlags レジスタが設定されます。ただし、cmpsb命令は繰り返され、次の文字は同じになります。cmpsbの仕組みを誤解しているかもしれませんが、このループは 2 つの文字列を正しく比較していないようです。このループは実際に機能しますか?
gcc - GCC クロス コンパイラ ツールチェーンのビルドに成功しました。環境変数を適切に設定するにはどうすればよいですか?
クロス コンパイル ツールチェーンの環境変数をセットアップする方法について、これが適切な場所であるかどうかはわかりません。ツールチェーンの目的は、OS を開発することです。Ubuntu 12.04 LTS を使用しています。問題は、ツールチェーンの環境変数をどのように設定するかです。クロス コンパイラ ツールチェーンのパスは次のとおりです。
GCC クロス コンパイラ ツールチェーンを使用できるようにしたいのですが、Ubuntu に付属の GCC ツールチェーンも引き続き使用できるようにしたいと考えています。よくわからない場合は、お気軽に質問してください。また、私が達成したいことについてさらに情報が必要な場合は、お気軽にお問い合わせください。