Koraos是從頭開始編寫和設計的操作系統。它是由發燒友開發人員作為愛好開發的。
該存儲庫包含Kora系統內核的代碼。如果您想構建整個系統,請查看Koraos存儲庫。
我一直在嘗試構建自己的內核。經過多次返工,休息和重新思考,我完全通過對設計的細緻護理重新開始了一個。我的目標一直是構建計劃,以實現他們應該做的事情,而不僅僅是通過強烈脫鉤的架構,輕快而快速。
該軟件仍然是一個年輕的小狗,但我希望很快能建立一個可靠的系統。它將提供現代系統的所有基礎功能,並將在幾個架構上移植(目標:X86,X86_64,ARM)。
互操作性:當我試圖理解事物的製造方式時,以及為什麼,我有時會遇到嚴格的POSIX或UNIX規格。我試圖盡可能合規 - 在NT和Unix World上 - 但我授權自己採取不同的選擇。
構建內核並不像構建常規應用程序,可能需要一些額外的工作。
存儲庫(與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 and Git ,也是某些體系結構的組裝程序(例如
i386和amd64的NASM 。
這裡也是Makefile接受的一些變量以進行擴展配置:
VERBOSE=y :打印彙編命令QUIET=y :不要打印詳細彙編步驟CFLAGS :向C編譯器添加額外的標誌NODEPS=y :不包括 *.d依賴項文件(默認為清潔或'obj'目錄尚不存在)NOCOV=y :刪除單位測試的覆蓋範圍選項kname=? :更改內核交付文件的名稱構建後,如果您在這裡變得骯髒,請考慮qemu和gdb進行調試和調查。
scripts/toolchain.sh (需要時間,沒有日誌)koraos/make/build_toolchain.sh (花費更多的時間)。 描述內核功能並不容易,因為大多數組件都是必需的,並且所有內核提供了大致相同的,但是所有這些功能的質量和行為都不同。
Koraos'kernel使用虛擬內存,並具有基本頁面分配。它使用頁面的正確回收,但沒有交換可用。在英特爾體系結構上,製作了適當的CPU功能識別,但使用較差。內核已準備就緒(線程安全),但仍需要使用一些工作。
內核是多進程,多線程,但還不是多用戶。可以創建任務是在內核上或用戶空間中。可以從乾淨的板岩(窗口)或分叉(UNIX方式)創建新任務。
內核提供了多種類型的文件和設備:塊設備,char設備,管道,目錄(或音量),常規文件,視頻流(表面,相機或屏幕),網絡設備和套接字。 (請注意,文件類型與UNIX不同)。
所有這些文件和設備都可以通過具有良好緩存設施的進化VFS(虛擬文件系統)訪問。
網絡堆棧支持協議:以太網,ARP,IPv4,ICMP,DHCP,UDP,UDP,UDP, TCP,DNS和NTP 。內核提供了一個基本的DHCP客戶端,該客戶端允許自動IP配置。
不完整的部分
由於該系統尚未完全功能,因此我的大多數測試都是使用內核線程完成的,但是在這裡進行了一些工作系統調用 - 尚未最終確定:
/* --------
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_* 。kernel/io.h和DMA的接口。kernel/{...}.h :提供內核核心模塊的API(任務,內存,VFS ...)。kernel/net/{...}.h :網絡協議的API(LO,ETH,IP4)。kernel/bus/{...}.h提供商(PCI或USB)的API。 一旦我可以運行基本程序登錄,桌面,克里什,文件夾和lua,我就計劃了0.1版,並且至少具有一個完整的可寫文件系統(例如VFAT或EXT2)。