記事ディレクトリ
序文
この一連のブログ投稿は、主に 408 専門内容大学院入試の第 2 段階での理解を深めるために使用されます。つまり、このシリーズを開始する前に、408 の基本を理解することが最善です。また、このブログ投稿シリーズはオペレーティング システムの学習シリーズですが、C 言語プログラミングとデータ構造の復習と応用も完了します。
このシリーズは、王島大学院入学試験を概要ナビゲーションとして組み合わせ、「30日間自作オペレーティングシステム」などの優れた書籍と組み合わせて、本の内容を段階的に強化し、アセンブリとC言語を使用して簡単な問題を完成させます。オペレーティングシステムの設計。このシリーズでは、ブロガー自身が学習過程の内容を常に記録しているため、シリーズ終了までに不正確な部分が多数あるかもしれませんが、ご容赦ください。
さらに、この記事では、Intel CPU、AMD に基づいて操作を完了する必要があります。
オペレーティング システムの基本的な概要
始める前に、基本的なオペレーティング システムの概念を紹介しましょう。まず、オペレーティング システムが何を提供するのかを明確にする必要があります。
まず、オペレーティング システムはいくつかの基本的な管理を提供します。
- メモリ管理
- 端末管理
- ファイル管理
- プロセッサ管理
同時に、オペレーティング システムにはいくつかの基本的な特性があることもわかっています。
- 同時実行性
- 非同期
- バーチャル
- 共有
私の記憶が正しければ、これは Wangdao PubMed の第 1 章の内容であるはずです。ここでは多くは言いませんが、この本の方が私より詳しく書いてあります。
そこで、ここでさらに追加したいと思います。
邪魔をして
オペレーティング システムは、一連のシステム コールで構成されるプログラム インターフェイスを提供しますが、同時にファイルの読み書きなどのシステム コールに対して、IO 操作を実行するために割り込みがトリガーされます。これが第 1 章のすべての内容ですが、この IO 操作はシステム レベル、カーネル レベルの呼び出しであるため、割り込みがトリガーされる理由は誰もが知っています。したがって、実際にはプロセスは正しいのですが、この部分の実現は実際には非常に重要な基盤です。後で実際にオペレーティング システムを実装する詳細を説明するときに、リアル モードと保護モデルについてよく参照します。しかし、ここでは中断についてはあまり気にしません。この中断は非常に重要なメカニズムの 1 つであることだけを説明したいと思います。
さらに、割り込みがハードウェア レベルでもサポートされていることにも言及する価値があります。Ring0、1、および 3 の場合、これは実際に CPU でサポートされています。私たちの保護モードでは、DRT を通じてこの部分の処理を実現します。
ハードウェアとの基本的な対話
同じ文ですが、この記事を読む前に、オペレーティング システムについて一般的な理解をしていただきたいと思いますが、ここでは王島大学院入学試験用のオペレーティング システムを本当にお勧めします。問題を磨くことに偏っていますが、いくつかの概念はこの一連のブログ投稿で説明されている内容を、ここでも再掲します。
コンピュータの構成原理を通じて、CPU には ALU、CU、演算および論理制御ユニットがあることがわかります。同時に、内部には多くのレジスタがあります。たとえば、一般的な 8 つのレジスタは次のとおりです。
AX: アキュムレーションレジスタ
BX: ベースレジスタ
CX: カウンティングレジスタ
DX: データレジスタ
SP: スタックニードルレジスタ
BP: ベーススタックレジスタ
SI: ソースアドレスレジスタ
DI: デスティネーションアドレスレジスタ
CS: ステータスレジスタ
(ここでのいくつかのレジスタは 2 バイトであり、これはリアル モードで使用されることに注意してください。リアル モードでは 16 ビット、プロテクト モードでは 32 ビットです)
もちろん、CPU には多くのレジスタがあります。同時に、ここには大まかに知っておく必要がある非常に重要な概念があります。コンピュータ構成の原理では、さまざまなデバイスのアドレスがあることがわかっています。さまざまなデバイスに対する操作は、実際にはこれらのアドレスの値を変更することによって行われ、レジスタを通じてアドレスにアクセスし、アドレスの値を操作することで、基本的なデバイスの制御が完了します。
もちろん、ここでは明確にする必要があります。ここでのプログラミング作業のほとんどは、CPU を制御することによって行われます。キーボードや画面など制御が必要な場合は、レジスタ内のデータを変更することで制御します。そのため、初期段階で実装する場合にはアセンブリとある程度やり取りをする必要があり、ハードウェアの基本的な制御は完了しています。もちろん、ここでの良いニュースは、ハードウェア メーカーが優れたインターフェイスを提供していること、またはインテルとハードウェア メーカーが良好な合意を結んでいることです。
ベースアドレス
先ほども述べたように、CPU による基本的なプログラム制御が完了すると同時に、デバイスのアドレスを見つけてレジスタ内の対応する値を操作することによってデバイスの制御が完了します (次に与えます) Hello World の出力例)
したがって、ここでは、概念を明確にします。つまり、コンピューターの本質は、実際には、異なる場所にあるデータに対して異なる操作を実行することです。私たちはさまざまな規制を通じてコンピューターにカラフルな世界を提示しているだけです。例えば、exeファイルはバイナリコードの羅列であり、jpg画像も同様ですが、その効果は全く異なります。
そこで、アドレスの重要性を明確にしたと同時に、デバイスと同じようなもので、デバイスにもアドレスがあり、先ほども述べたように、それを制御するにはレジスタを操作する必要があり、そのレジスタにはアドレスやデータが含まれています。したがって、デバイスを正常に呼び出すためには、いくつかのアドレスについても同意する必要があります。
たとえばこれ:
アドレスの概念
次にアドレスの概念があります。実際、私たちのオペレーティング システムで使用されるのは論理アドレスだけです。プログラムが実行されるとき、物理アドレスからデータを取得してメモリに置きます。これはオペレーティング システムにおいて非常に重要です。 1 点、つまり、アプリケーションに論理アドレス 0 から論理アドレス 100 までの CPU を独占していると思わせる必要があります。このように書かれたプログラムがあると仮定すると、実際には物理的に 0x6000 からである可能性があります。 0x6545 など。そのため、多くの試験問題にはアドレス変換の問題が含まれています。同時に、CPU が計算を実行するときは 2 進数を使用しますが、オペレーティング システムが表現するときは 16 進数を使用することも知っておく必要があります。16 進数の利点は、まずスペースを無駄にせずに 10 進数で大きな数を簡単に表現できることと、その後 16 進数を 2 進数に変換するのに非常に便利であることです。
また、私たちの側は実際には王島の大学院入試の内容とは異なるため、まず王島の大学院入試のオペレーティングシステムの本を読んで基本的な理解をする必要があることをここで再度強調します。実際には、最初にディスクから開始し、ディスクからプログラムを取得してからロードするなどの作業を行う必要があり、オペレーティング システムでプログラムを処理する必要があるまで、マルチプログラミングの設計を考慮する必要があります。 、同時実行、共有。頻繁にテストされる pv 操作、置換アルゴリズム、回転アルゴリズムなど。
プロセスを開始する
これが王島大学院入学試験の第 1 章の内容となるはずです。次に簡単に紹介していきます。
まず、起動時に BIOS を起動します。BIOS では、オペレーティング システムの Boot の下で mbr を見つけ、それを mbr を通じてローダー プログラムにロードし、次に、それをシステム カーネルにロードします。ローダ。mbr は私たちのガイドの 1 人です。パスを渡し、ガイドをし、その後の作業を完了します。次に疑問が生じます, なぜ最初に mbr->loader->keneral が必要なのでしょうか? 理由は非常に簡単です. BIOS で与えられたスペースはわずか 512 バイトであり、システムとカーネルを起動するには明らかに十分ではありません。
したがって、このプロセスを通じて起動操作を完了する必要があります。
彼らの一般的なプロセスは実際には次のようなものです。
このプロセスでは、CPU の実行をオペレーティング システムに転送します。
アプリケーションとオペレーティングシステムの関係
素晴らしいです。ついに、追加する必要があるこの 1 つの概念に到達しました。
私たちは、このような番組まで。
#include<stdio.h>
int main(){
printf("Hello world");
return 0;
}
実行可能ファイル .exe が最下層でプログラムされている場合、このコードを bin バイナリ ファイルに変換して実行できます。.exe ファイルは Windows システムで実行可能になります。
実際、オペレーティング システムが本質的に特別なソフトウェアであることはわかっています。そのため、作成したソフトウェアを起動時に BIOS に配置し、CPU の実行をプログラムに転送することができれば、次のようになります。それは、私たちのソフトウェアもオペレーティング システムと同じである可能性があるという意味でもありますか。実は、これを特殊な「オペレーティングシステム」と呼ぶことも可能です。しかし、実際には、先ほど述べたものではなく、オペレーティング システムを介してソフトウェアを起動することになります。今述べた方法であれば、オペレーティング システムは何の影響も与えないようです。
実際、プログラムの完全なプログラム (win) は次のようになります。
したがって、オペレーティング システムを実装したい場合は、対応するプログラム依存のインターフェイスを提供する必要があります。はい、オペレーティング システムの実行可能ファイルも定義する必要があります。これは実際にはブラウザと非常によく似ています。私たちのプログラムは実際には各 Web ページに相当します。Web ページ内のプログラムはブラウザに依存して効果を表示し、v8 エンジンを通じて分析を完了する必要があります。オペレーティング システムについても同様です。
さて、先ほどのプログラムに戻りましょう。
C言語で「Hello Word」を出力するのはとても簡単です。
実際、Python パッケージに相当する stdio.h を呼び出しました。これは出力関数と入出力を提供しますが、これにはシステム コールが必要であることがわかっているため、オペレーティング システム レベルで実装する必要があります。アプリケーション プログラムにはこの権限がないため、オペレーティング システムのみがこの権限を持っています。
そうすると、画面から文章を出力したい場合、それを最下層で実装するのは非常に面倒であり、同時に実装時にシステム実装、つまりprintf(などの関数を呼び出すことができません) ) ですが、アセンブリを通じて同様の関数を実装する必要があります。このコードは次のとおりです。
(はい、これは前に述べた出力内容です。xb800 が見つかりました。これはフラット パネル ディスプレイのアドレスです)
mov ax,0xb800 ;在bios当中将指针指向文本显示地方
mov es,ax
mov byte [es:0x00],'L' ;找到的文本显示的地址,然后写入内容
mov byte [es:0x01], 0x07 ;设置颜色
mov byte [es:0x02],'Y'
mov byte [es:0x03], 0x06
time 510 - ($-$$) db 0 ;填充剩下的空间,引导区是512
dw 0xaa55 ;以这个结尾才会别biso识别
ハローワールドの発売
とても良いです。Wang Dao と同じではないコンテンツを追加しました。もちろん、ここではスペースが限られているため、アセンブリ部分に対応するコードについてはここでは説明しないのが残念です。しかし、書籍「30日間の自作オペレーティングシステム」の対応するアセンブリの説明は非常に優れていると思います. この本ではaskアセンブリを使用していますが、実際にはnasmのカスタムバージョンであり、アセンブリとほぼ一致しています。
ここで、本に従うのではなく、同様のスキームを使用します。
まず最初に、最初のスタートアップ プログラムの作成を開始します。これが mbr です。
org 07c00h
mov ax,cs
mov ds,ax
mov es,ax
call DD
jmp $
DD:
mov ax,BOOTMSG
mov bp,ax
mov cx,16
mov ax,01301h
mov bx,000ch
mov dl,0
int 10h
ret
BOOTMSG: db "hello, OS World!"
times 510-($-$$) db 0
dw 0xaa55
次に、この時点でこのコードをコンパイルする必要があります。
その前に、nasm を自分で準備する必要があります。
この時点でコンパイルは完了です。その後、仮想ハードディスクも作成する必要があります。次に、仮想マシンで起動します。
その後、「最初のオペレーティング システム」をディスクに書き込みます。
次に、仮想マシンを作成できます。ここでは仮想ボックスを使用しています
次に、「開始」をクリックして最初の Hello OS World を完了します。
要約する
この記事は単なるブロガーのエッセイであり、後で十分に補足されますが、もちろん実際には大学院受験パーティーにとって、質問を書くことの方が重要であり、これは実務上のオマケです。さらに、ブロガーは読者とブロガーが同等のレベルであることをデフォルトとしています。