独自の実行可能なOSを6か月間作成する

画像



背景



こんにちは 皆を歓迎します。今日は、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'.





, , -, .



— - , - - , , ( , ) — , , .



!



All Articles