問題タブ [kernel]
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.
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 理論の授業は軽度の... 欠陥があったようです。)
operating-system - カーネル開発で使用されるスタックサイズ
私はオペレーティングシステムを開発していて、カーネルをプログラミングするのではなく、カーネルを設計しています。このオペレーティングシステムはx86アーキテクチャを対象としており、私のターゲットは最新のコンピューターを対象としています。必要なRAMの推定数は256Mb以上です。
各スレッドのスタックをシステムで実行するのに適したサイズはどれくらいですか?最大長に達した場合にスタックを自動的に拡張できるようにシステムを設計する必要がありますか?
RAMのページが4kまたは4096バイトであることを正しく覚えていれば、それは私にはそれほど多くないように思えます。特に再帰を多く使用する場合は、一度に1000を超えるインテガーをRAMに入れたいと思う時期がはっきりとわかります。さて、本当の解決策は、プログラムがmalloc
独自のメモリリソースを使用して管理することでこれを実行することですが、実際には、これに関するユーザーの意見を知りたいと思います。
4kは、最新のコンピュータープログラムをスタックするのに十分な大きさですか?スタックはそれよりも大きくする必要がありますか?スタックは、あらゆるタイプのサイズに対応するために自動拡張する必要がありますか?私は、実用的な開発者の観点とセキュリティの観点の両方からこれに興味を持っています。
4kはスタックには大きすぎますか?通常のプログラム実行を考えると、特にC ++のクラスの観点からmalloc/new
、関数呼び出しでスローされるデータを最小限に抑えるために、優れたソースコードはクラスの作成時に必要なデータになりがちです。
私がまだ理解していないのは、プロセッサのキャッシュメモリのサイズです。理想的には、スタックは処理を高速化するためにキャッシュに存在すると思いますが、これを実現する必要があるかどうか、またはプロセッサが処理できるかどうかはわかりません。私はテスト目的で通常の退屈な古いRAMを使用することを計画していました。決められない。オプションは何ですか?
operating-system - GRUBがカーネルから自動的に起動できるようにする
オペレーティングシステム用のカーネルを開発しています。それを実行するために、GRUBを使用することにしました。現在、GRUBの、、、パッドファイルとカーネル自体にスクリプトを添付してstage1
、stage2
起動可能にしています。唯一の問題は、実行するときに、カーネルの場所とカーネルの大きさを手動でGRUBに通知してから、次のように起動する必要があることです。
KERNELSIZE
ブロック単位のカーネルのサイズです。これは最初は問題なく問題ありませんが、これらの値をバイナリで取得して、GRUBにカーネルを自動的に起動させることは可能ですか?それを達成する方法について何か提案はありますか?
keyboard - x86 アセンブリでの保護モードのキーボード アクセス
私が開発している非常に基本的なカーネルのキーボード入力に取り組んでおり、完全に立ち往生しています。私が知る必要がある情報を示すことができる情報をオンラインで見つけることができないようです。
私のカーネルは現在プロテクト モードで実行されているため、リアル モードにジャンプしてから戻らないとリアル モード キーボード ルーチンを使用できません。これは回避しようとしています。プロテクト モードからキーボードにアクセスできるようにしたい。誰もこれを行う方法を知っていますか? これまでに見つけた唯一のことは、in/out ポートを使用してコントローラーと直接通信する必要があることですが、それ以上は困惑しています。もちろん、これは頻繁に出てくるものではありません。通常、アセンブリ チュートリアルでは、オペレーティング システムが実行されていることを前提としています。
私は x86 アセンブリに非常に慣れていないので、保護モードから標準ハードウェアを操作するための優れたリソースを探しています。Assembly ソース コードを NASM でコンパイルし、DJGPP でコンパイルされた C ソース コードにリンクしています。助言がありますか?
kernel - 自分のモジュールを見つけるために modprobe を設定するにはどうすればよいですか?
起動時にカーネルモジュールをロードしようとしています。
を実行するinsmod /path/to/module.ko
と、正常に動作します。ただし、再起動するたびにこれを繰り返す必要があります。
を実行するmodprobe /path/to/module.ko
と、モジュールが見つかりません。modprobe が構成ファイルを使用することは知っていますが、/path/to/module.ko を /etc/modules に追加した後でもモジュールをロードできません。
適切な構成は何ですか?
windows - C(++) コンパイラの移行 - DJGPP を廃止してください
私はカーネルの作成に取り組んでおり、プロジェクトで一緒に働いている友人が何人かいます。しばらくプロジェクトをコンパイルするために DJGPP を使用してきましたが、この方法でコンパイルするとクロスプラットフォームの互換性の問題が発生し、プロジェクトのメインの Partnet を Windows XP でコンパイルできなくなりました。(DJGPP の GCC は、Windows XP では 127 を超える引数リストに問題がありますが、Vista では同じ引数リストに問題はありません。つまり、一度だけ、Vista は XP よりも何かでうまく機能します。oO)
とにかく、DJGPP でコンパイルするためにいくつかの汚いハックを試みるよりも、DJGPP を完全に捨てて、Windows 用の GCC の別のバージョンを使用することにしました。問題は、(私の知る限り) MinGW では、コードのアセンブリ部分に NASM 構文を使用できないことです。この時点ですべてを AT&T 構文に変換するのは少し面倒です。もちろん、プロジェクトのかなり初期の段階なので可能ですが、面倒です。
だから今、あなたは問題を知っています。私の質問は次のとおりです。Windows 用のどの GCC コンパイラ ディストリビューションを使用すると、このプロジェクトをそれ自体に最も簡単に移植できますか? 理想的には、NASM アセンブラー構文を実行でき、外部 dll に依存せず (これはカーネルであり、アクセスできません)、Windows 上の複数のバージョンで一貫して動作するものを探しています。これを行うための最良の方法についての推奨事項は何ですか?また、Windows用のGCCのどのバージョンをお勧めしますか?
プロジェクトを AT&T 構文に変換する必要がある場合は、それで問題ないことに注意してください。実際には NASM を使用してそのアセンブリ ビットをアセンブルしており、有効な .o ファイルが生成されますが、MinGW は何らかの理由でそれをリンクできません。インライン アセンブリ ビット (おそらく 5 行) は、GCC で必要な AT&T 構文になっていると思います。
ありがとう!
linux - 冗長 Linux カーネル システム コール
私は現在、さまざまなシステム コールにフックし、呼び出されたシステム コールに応じてログに書き込むプロジェクトに取り組んでいます。そのため、たとえば、ファイルのアクセス許可を変更するときは、古いアクセス許可と新しいアクセス許可を追跡するログ ファイルに小さなエントリを書き込みます。しかし、私が見るべき場所を正確に特定するのに苦労しています. 上記の例では、strace は、「chmod」コマンドがシステム コール sys_fchmodat() を使用していることを示しています。ただし、sys_chmod() と sys_fchmod() もあります。
カーネル開発者は自分たちが何をしているのかを知っていると確信していますが、私は疑問に思います: これらの (一見) 冗長なシステムコールのポイントは何ですか? また、どのシステムコールが何に使用されるかについての規則はありますか? (つまり、"at" システムコールか、それとも "f" で始まるシステムコールか?)
linux - リアルタイム Linux 拡張機能は時代遅れですか?
Ingo Molnar の新しいリアルタイムおよび低遅延パッチは、Linux 用の以前のリアルタイム拡張機能 (RTAI、Xenomai など) を廃止しますか?
memory-management - OS は通常、カーネル メモリとページ処理をどのように管理していますか?
私はカーネルの設計に取り組んでおり、ページングに関していくつか質問があります。
これまでのところ、私が持っている基本的な考え方は次のとおりです。各プログラムは、プログラムが呼び出すことができるカーネル関数用に予約したセクションを差し引いた、独自の (またはそう考える) 4G のメモリを取得します。そのため、OS は、プログラムが操作中に使用する必要があるページをメモリにロードする何らかの方法を見つける必要があります。
ここで、メモリとプロセッサ時間が無限にあると仮定すると、存在しない (またはスワップアウトされた) ページのページ フォールトを使用して、プログラムが書き込みまたは読み取りを行った任意のページをロード/割り当てることができたので、OSしかし、現実の世界では、このプロセスを最適化する必要があります。これにより、プログラムがこれまでに触れたすべてのメモリを常に消費することはありません。
だから私の質問は、OSは一般的にこれをどのように行うのですか? 私の最初の考えは、プログラムがページを設定/解放するために呼び出す関数を作成することです。これは、それ自体でメモリを管理できますが、プログラムは通常これを行いますか、それともコンパイラは自由に統治できると想定しますか? また、コンパイラは、かなり大きなメモリ セグメントを割り当てる必要がある状況をどのように処理しますか? Xページを順番に渡そうとする関数を提供する必要がありますか?
これは明らかに言語固有の質問ではありませんが、私は標準 C に部分的であり、C++ が得意なので、コード例をそれまたはアセンブリのいずれかにしたいと思います。(アセンブルは必要ありません。できるだけ多くの C コードで動作するようにし、最後のステップとして最適化するつもりです。)
同様に答えやすいもう 1 つのこと: プログラムが呼び出す必要があるカーネル関数を一般的にどのように処理しますか? プログラムが呼び出すことができるほとんどの基本的な関数/プロセス固有のメモリを含むメモリのセット領域(仮想空間の終わりに向かって考えていた)を持つだけで問題ありませんか? そこからの私の考えは、プログラムが何か重要なことをする必要があるときに、カーネル関数に非常に凝ったことをさせ、ページをスワップアウトすることです (プログラムが自分のスペースで機密性の高いカーネル関数を認識できないようにするため)。この時点でセキュリティに焦点を当てます。
だから私は、詳細よりも一般的なデザインのアイデアについてもっと心配していると思います. カーネルを GCC と完全に互換性のあるものにしたいと考えており、通常のプログラムが必要とするすべてのものを提供できるようにする必要があります。
アドバイスをありがとう。
assembly - IRQ マッピングの設定
カーネルをセットアップするために、いくつかのチュートリアルとリファレンスに従っています。チュートリアルで、まったく説明していないなじみのないコードに出くわしました。16 IRQs (0-15)
ISRの場所にマップすると言われているのはコードです32-47
:
のコードoutportb()
は次のとおりですが、私はすでにそれが何をしているのかを明確に把握しています:
これは保護モードの x86 アーキテクチャ上にあることに注意してください。このソース コードは正常に動作し、その機能は理解できますが、どのように機能するかはわかりません。誰かがここで何が起こっているのか説明してもらえますか?