Koraosは、ゼロから書かれ、設計されたオペレーティングシステムです。それは、愛好家の開発者によって趣味として開発されました。
このリポジトリには、Koraシステムのカーネルのコードが含まれています。システム全体を構築したい場合は、Koraosリポジトリをご覧ください。
私はしばらくの間、自分のカーネルを構築しようとしてきました。何度もやり直し、休憩を取り、再考した後、デザインに細心の注意を払って完全に再起動します。私の目的は、強く切り離されたアーキテクチャを使用して、彼らがすべきこととそれ以上の速いことをすることになっていることだけを行うプログラムを構築することでした。
このソフトウェアはまだ若い子犬ですが、すぐに信頼できるシステムを構築したいと思っています。最新のシステムのすべての基本機能を提供し、いくつかのアーキテクチャ(目標:X86、X86_64、ARM)でポータブルになります。
相互運用性:物事がどのように作られているか、そしてその理由を理解しようとすると、厳格なPOSIXまたはUNIX仕様の外に出ることがあります。私は、NTとUNIXの両方の世界で、できるだけ準拠しようとしていますが、さまざまな選択をすることを許可しています。
カーネルの構築は、通常のアプリケーションを構築するようなものではありません。追加の作業が必要になる場合があります。
リポジトリ(Koraの他の人と同様)には、標準のMakefileに近いものが含まれています。 configureスクリプトは利用可能ですが、別のディレクトリからのみビルドし、必須ではありません。このスクリプトは、ビルドオプションの検索と持続にのみ使用されます。
ここにメインコマンドのリスト:
make # Build the kernel for the host architecture
make check # Build and run unit-tests
make coverage # Run tests and coppute coverage
make install # Build and update the kernel (not yet)
make install-headers # Copy and erase kernelheaders to $(prefix)/include
# For cross-compile using 'i386-kora-gcc' compiler
make target=i386-pc-kora CROSS=i386-kora- CC=gcc
# Simpler using configure
/path/to/sources/configure --target=i386
make # No need to set target or cross.カーネルの場合、それはほとんど常に相互コンパイルであることを忘れないでください。最も一般的な落とし穴は、 x86_64ホストにi386カーネルを構築しようとすることです。
デフォルトでは、自立型環境を使用しますが、ホストヘッダーはいくつかの問題を引き起こす可能性があります。
ケースまたはエラーでは、「クロスコンパイル」を使用することが好まれます。
注: Binutils、GCC、Make、Gitなど、すべてのパッケージをインストールしてください。一部のアーキテクチャ用のアセンブラー(
i386やamd64のNASMなど。チェックについては、 ValgrindとLCOVも追加してください。
ここでは、拡張構成のためにMakefileによって受け入れられたいくつかのVarieasez:
VERBOSE=y :編集コマンドを印刷しますQUIET=y :冗長コンパイルステップを印刷しないでくださいCFLAGS :Cコンパイラに追加フラグを追加しますNODEPS=y :despanciesファイルを含めないでください(クリーンのデフォルトまたは「obj」ディレクトリがまだ存在しない場合)NOCOV=y :ユニットテストのカバレッジオプションを削除しますkname=? :カーネル配信ファイルの名前を変更しますビルド後、あなたが汚れている場合は、デバッグと調査のためにqemuとgdbについて考えてください。
scripts/toolchain.shをご覧ください(時間がかかり、ログなし)koraos/make/build_toolchain.shを見てください(さらに時間がかかります)。 ほとんどのコンポーネントが必要であり、すべてのカーネルがほぼ同じで提供されるため、カーネルの機能を説明するのは簡単ではありませんが、これらすべての機能の品質と動作は異なります。
Koraos'kernelは、基本的なページ割り当てで仮想メモリを使用しています。ページの適切なリサイクルを使用しますが、スワップは使用できません。 Intelアーキテクチャでは、適切なCPU機能の識別が作成されますが、使用が不十分です。カーネルはマルチコアの準備ができています(スレッドセーフ)が、それでもいくつかの作業を使用する必要があります。
カーネルはマルチプロセス、マルチスレッドですが、まだマルチユーザーではありません。タスクは、カーネルまたはユーザースペースのいずれかにするように作成できます。 Clean Slate(Window Way)またはFroked(Unix Way)から新しいタスクを作成できます。
カーネルは、デバイス、チャルデバイス、パイプ、ディレクトリ(またはボリューム)、通常のファイル、ビデオストリーム(表面、カメラまたは画面)、ネットワークデバイス、ソケットなど、多数のファイルとデバイスを提供します。 (ファイルタイプはUNIXとは異なることに注意してください)。
これらすべてのファイルとデバイスは、優れたキャッシング機能を備えた進化したVFS(仮想ファイルシステム)を介してアクセスできます。
ネットワークスタックはプロトコルをサポートしています:イーサネット、ARP、IPv4、ICMP、DHCP、UDP、 TCP、DNSおよびNTP 。カーネルは、自動IP構成を可能にする基本的なDHCPクライアントを提供しました。
不完全セクション
システムは完全に機能していないため、私のテストのほとんどはカーネルスレッドを使用して行われますが、ここではいくつかの作業システムが呼び出されます。まだ何も確定していません。
/* --------
Tasks, Process & Sessions
--------- */
long sys_stop ( unsigned tid , int status );
long sys_sleep ( long timeout );
/* --------
Input & Output
--------- */
long sys_read ( int fd , char * buf , int len );
long sys_write ( int fd , const char * buf , int len );
long sys_open ( int fd , const char * path , int flags );
long sys_close ( int fd );
/* --------
File system
--------- */
int sys_pipe ( int * fds );
int sys_window ( int width , int height , unsigned features , unsigned evmask );
/* --------
Network
--------- */
int sys_socket ( int protocol , const char * address , int port );
/* --------
Memory
--------- */
void * sys_mmap ( void * address , size_t length , int fd , off_t off , unsigned flags );
long sys_munmap ( void * address , size_t length );
long sys_mprotect ( void * address , size_t length , unsigned flags );
/* --------
Signals
--------- */
/* --------
System
--------- */
long sys_ginfo ( unsigned info , void * buf , int len );
long sys_sinfo ( unsigned info , const void * buf , int len );
long sys_log ( const char * msg );ターゲットビット現在のファイルではありません
kernel/types.h :基本タイプを参照し、不透明な構造を宣言します。kernel/utils.h :割り当て、文字列、時間などの基本的なランタイムを提供します。kernel/core.h :コア構造kSYS & kCPUへのアクセスを提供します。kernel/syscalls.h sys_*のsyscallルーチンのリスト。kernel/io.h :Ioport、mmio、dmaのインターフェイス。kernel/{...}.h :カーネルコアモジュール(タスク、メモリ、VFS ...)のAPIを提供します。kernel/net/{...}.h :ネットワークプロトコルのAPI(LO、ETH、IP4)。kernel/bus/{...}.h :バスプロバイダーのAPI(PCIまたはUSB)。 Basicsプログラムのログオン、デスクトップ、クリッシュ、フォルダー、LUAを実行して、少なくとも1つのフル機能のwriteableファイルシステム(VFATやExt2など)を実行できたら、バージョン0.1の配信を計画しました。