Koraos เป็นระบบปฏิบัติการที่เขียนและออกแบบตั้งแต่เริ่มต้น มันได้รับการพัฒนาเป็นงานอดิเรกโดยนักพัฒนาที่ชื่นชอบ
ที่เก็บนี้มีรหัสสำหรับเคอร์เนลของระบบ KORA หากคุณต้องการสร้างระบบทั้งหมดให้ดูที่ที่เก็บ Koraos
ฉันพยายามสร้างเคอร์เนลของตัวเองเป็นระยะเวลาหนึ่ง หลังจากการทำซ้ำหลายครั้งหยุดพักและคิดทบทวนฉันรีสตาร์ททั้งหมดด้วยการดูแลอย่างพิถีพิถันสำหรับการออกแบบ วัตถุประสงค์ของฉันคือการสร้างโปรแกรมที่ทำในสิ่งที่พวกเขาควรจะทำและไม่มีอะไรเพิ่มเติมแสงและเร็วด้วยสถาปัตยกรรมที่แยกออกมาอย่างมาก
ซอฟต์แวร์นี้ยังคงเป็นลูกสุนัขตัวเล็ก แต่ฉันหวังว่าจะสร้างระบบที่เชื่อถือได้ในไม่ช้า มันจะให้คุณสมบัติพื้นฐานทั้งหมดของระบบที่ทันสมัยและจะพกพาในสถาปัตยกรรมหลายแห่ง (เป้าหมาย: x86, x86_64, แขน)
การทำงานร่วมกัน : เมื่อฉันพยายามเข้าใจว่าสิ่งต่าง ๆ เกิดขึ้นได้อย่างไรและทำไมบางครั้งฉันก็ออกไปข้างนอกตามข้อกำหนด 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. โปรดจำไว้ว่าสำหรับเคอร์เนล มันเกือบจะเป็นการเปรียบเทียบข้าม ข้อผิดพลาดที่พบบ่อย ที่สุดคือพยายามสร้างเคอร์เนล i386 บนโฮสต์ x86_64
โดยค่าเริ่มต้นจะใช้สภาพแวดล้อม อิสระ แต่ส่วนหัวของโฮสต์อาจทำให้เกิดปัญหาบางอย่าง
ในกรณีหรือข้อผิดพลาดมันต้องการใช้ 'cross-compilor'
หมายเหตุ : อย่าลืมติดตั้งแพ็คเกจทั้งหมดเช่น Binutils, GCC, Make และ Git แต่ยังรวมถึงแอสเซมเบลอร์สำหรับสถาปัตยกรรมบางอย่าง (เช่น NASM สำหรับ
i386และamd64สำหรับการตรวจสอบเพิ่ม Valgrind และ LCOV
ที่นี่บางตัว VariableZ ได้รับการยอมรับจาก Makefile สำหรับการกำหนดค่าขยาย:
VERBOSE=y : คำสั่งรวบรวมการพิมพ์QUIET=y : อย่าพิมพ์ขั้นตอนการรวบรวม verboseCFLAGS : เพิ่มธงพิเศษลงในคอมไพเลอร์ cNODEPS=y : ไม่รวมไฟล์การพึ่งพา *.d (ค่าเริ่มต้นสำหรับการทำความสะอาดหรือถ้ายังไม่มีไดเรกทอรี 'obj' ยังไม่มีอยู่)NOCOV=y : ลบตัวเลือกความครอบคลุมสำหรับการทดสอบหน่วยkname=? : เปลี่ยนชื่อไฟล์ส่งเคอร์เนล หลังจากการสร้างถ้าคุณมาที่นี่เพื่อให้สกปรกลองนึกถึง qemu และ gdb สำหรับการดีบักและการสอบสวน
scripts/toolchain.sh (ต้องใช้เวลาไม่มีบันทึก)koraos/make/build_toolchain.sh (ต้องใช้เวลามากขึ้น) ไม่ใช่เรื่องง่ายที่จะอธิบายคุณสมบัติเคอร์เนลเนื่องจากส่วนประกอบส่วนใหญ่จำเป็นและเมล็ดทั้งหมดให้ความเหมือนกัน แต่แตกต่างกันในคุณภาพและพฤติกรรมสำหรับคุณสมบัติทั้งหมดเหล่านั้น
Koraos'Kernel ใช้หน่วยความจำเสมือนจริงพร้อมการจัดสรรหน้าพื้นฐาน ใช้การรีไซเคิลหน้าเว็บที่เหมาะสม แต่ไม่มีการแลกเปลี่ยน ในสถาปัตยกรรม Intel จะมีการระบุคุณสมบัติ CPU ที่เหมาะสม แต่ยังใช้งานได้ไม่ดี เคอร์เนลนั้นพร้อมหลายคอร์ (แบบเธรดที่ปลอดภัย) แต่ยังต้องใช้งานบางอย่างที่จะใช้
เคอร์เนลเป็นหลายกระบวนการหลายเธรด แต่ยังไม่ได้ใช้ผู้ใช้หลายคน งานสามารถสร้างขึ้นได้ทั้งในเคอร์เนลหรือใน Userspace งานใหม่สามารถสร้างได้จาก Clean Slate (Window Way) หรือ Forked (UNIX Way)
เคอร์เนลมีไฟล์และอุปกรณ์หลายประเภท: อุปกรณ์บล็อก, อุปกรณ์ถ่าน, ท่อ, ไดเรกทอรี (หรือระดับเสียง), ไฟล์ปกติ, สตรีมวิดีโอ (พื้นผิว, กล้องหรือหน้าจอ), อุปกรณ์เครือข่ายและซ็อกเก็ต (โปรดทราบว่าประเภทไฟล์แตกต่างจาก UNIX)
ไฟล์และอุปกรณ์เหล่านั้นทั้งหมดสามารถเข้าถึงได้ผ่าน VFS ที่พัฒนาขึ้น (ระบบไฟล์เสมือนจริง) พร้อมสิ่งอำนวยความสะดวกการแคชที่ดี
สแต็กเครือข่ายรองรับโปรโตคอล: อีเธอร์เน็ต, ARP, IPv4, ICMP, DHCP, 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 & kCPUkernel/syscalls.h : รายการของ Syscall รูทีนเป็น sys_*kernel/io.h : อินเทอร์เฟซสำหรับ ioport, MMIO และ DMAkernel/{...}.h : ให้ API ของเคอร์เนลหลักโมดูล (งาน, หน่วยความจำ, VFS ... )kernel/net/{...}.h : API สำหรับโปรโตคอลเครือข่าย (LO, ETH, IP4)kernel/bus/{...}.h : API สำหรับผู้ให้บริการรถบัส (PCI หรือ USB) ฉันวางแผนในการส่งมอบเวอร์ชัน 0.1 เมื่อฉันสามารถเรียกใช้โปรแกรมพื้นฐาน การเข้าสู่ระบบเดสก์ท็อป, Krish, โฟลเดอร์และ Lua และมีระบบไฟล์ที่เขียนได้อย่างน้อยหนึ่งรายการ (เช่น VFAT หรือ Ext2)