背景
こんにちは 皆を歓迎します。今日は、x86アーキテクチャ用の実行可能なOSを書いた私の経験についてお話ししたいと思います。
ある春の夜、私は素晴らしいアイデアを思いつきました-プログラムを実行し、デバイスを操作し、一般的に、あなたのニーズに応じてIntelのアーキテクチャのすべてのパワーを絞り込める独自のOSを作成してみてください:または何か他のもの。 私の目標は、あらゆる種類の過剰にCPU時間を浪費することなく、特定のタスクのパフォーマンスを最大化できるようなOSを作成することでした。 私は主にスポーツへの関心を追求し、システムプログラミングの経験を積み、どこでも使用されるデバイスのドライバーを作成しています。 この結果を決めるのはあなた次第です。すぐに、独自のLinuxディストリビューションの作成についてコメントを書く必要はないと言います。OSdevテーマに飛び込むために、「ゼロから」すべてを書くことに興味がありました。 ベンジャミンルントとOSDevフォーラム、そしてWikiに深く感謝します。 BenはEHCIの対処を助けてくれました。EHCIは間違いなく私のOSに多大な貢献をしました。USBデバイスはどこにでもあります! また、ELFファイル標準の使用を排除するのではなく、自分にとって都合の良い独自のアーキテクチャを作成するという課題に直面しました。 さて、ポイントに行きましょう。
UPD:すべての情報はtykグループにあります。また、ドックと画像を含む投稿もあります(古い、現在は安定バージョン用にドックを追加しています)
何をしますか?
OSはUSBフラッシュドライブ、マウス、キーボード、AHCIディスク、PCI IDEコントローラー、APICおよびACPIで動作し、プリエンプティブマルチタスクが実装され、プログラムが起動され、ファイルがストリーミングされ、SVGAドライバーは0x118 VBEモードで動作します。 DNS、DHCP、TCP、UPD、IPv4、HTTP、フルFAT32ドライバー、RTL8139(69)ドライバー、およびIntelギガビットイーサネットが機能します。
SVGAの実装とともにウィンドウシステムを使用すると、画面を完全に再描画して最大120 FPSを発行できます。 これがすべて実装され、一般的に機能する方法に移りましょう。
どのように機能しますか?
まず、FAT32を使用したカーネルでセカンダリブートローダーを読み取るブートローダーを作成しました。 2番目のブートローダーは保護モードに入り、カーネルにジャンプし、そこでIDTをロードして構成し、その後PCIデバイスを初期化し、カーネルを起動してCMDを起動します。
誰かが、SVGAでこのようなパフォーマンスをどのように達成したのでしょうか? 答えは簡単です。アセンブラー、アセンブラー、アセンブラーです。 メモリコピーを大幅に高速化するSSE命令がないわけではありません。 たとえば、以下はLFB(リニアフレームバッファー)のビデオバッファーをコピーするためのコードです。
.byte 0x60#Save registers in stack mov %2,%%ecx #Repeat count to ecx mov %0,%%edi #Video memory start to edi mov %1,%%esi #Video buffer start to esi ww1sse2: movaps (%%esi),%%xmm0 #Copy 16 bytes to xmm0 from buffer movaps %%xmm0,(%%edi) #Copy from xmm0 to video memory movaps 16(%%esi),%%xmm0 #16 again, but + 16 from current movaps %%xmm0,16(%%edi) #16 again, but + 16 from current movaps 32(%%esi),%%xmm0 #16 again, but + 32 from current movaps %%xmm0,32(%%edi) #16 again, but + 32 from current movaps 48(%%esi),%%xmm0 #16 again, but + 48 from current movaps %%xmm0,48(%%edi) #16 again, but + 48 from current add $64,%%edi #Add 64 bytes to edi add $64,%%esi #Add 64 bytes to esi dec%%ecx#Decrement count #test %%ecx,%%ecx #Compare ecx with zero jnz ww1sse2 #If not zero, repeat again .byte 0x61 #Restore registers from stack
, , , .
— «Watermark Allocator». , , , ..
-, .
MS-DOS: — . MBR , GPT .
— - , — .
, , — , , : , VIM.
, : , , return , - . , , - , .
: , , , , . — , , — — return'.
, , -, .
— - , - - , , ( , ) — , , .
!