diff --git a/err b/err new file mode 100644 index 0000000..110dc3a --- /dev/null +++ b/err @@ -0,0 +1,8 @@ +xz: Filter chain: --lzma2=dict=8MiB,lc=3,lp=0,pb=2,mode=normal,nice=273,mf=bt4,depth=512 +xz: 94 MiB of memory is required. The limiter is disabled. +xz: Decompression will need 9 MiB of memory. +test.elf: 1,684 B / 14.5 KiB = 0.113 +xz: Filter chain: --lzma2=dict=8MiB,lc=3,lp=0,pb=2,mode=normal,nice=273,mf=bt4,depth=512 +xz: 94 MiB of memory is required. The limiter is disabled. +xz: Decompression will need 9 MiB of memory. +mtgos.fnt: 578.4 KiB / 2,122.7 KiB = 0.272 diff --git a/kernel/kernel/disk/partitions.cpp b/kernel/kernel/disk/partitions.cpp new file mode 100644 index 0000000..b33f458 --- /dev/null +++ b/kernel/kernel/disk/partitions.cpp @@ -0,0 +1,50 @@ +#include +#include +#include +namespace MBR { + struct PartEntry { + char status; + uint8_t CHS_start[3]; + char partitionType; + uint8_t CHS_end[3]; + uint32_t start; + uint32_t size; + }__attribute__((packed)); + struct Mbr { + uint8_t bootstrap[446]; + PartEntry entries[4]; + short bootSignature; + }__attribute__((packed)); +MBR::MBR(uint32_t drive_id):Partitions(drive_id) { + Mbr mbr; + MTGosHAL::disk.readSector(drive_id,0,(uint8_t*)&mbr); + for(int i=0;i<4;i++) { + if(mbr.entries[i].status&0x7F) + break; + count++; + beg[i]=mbr.entries[i].start; + end[i]=beg[i]+mbr.entries[i].size; + } +} +auto MBR::operator=(MBR &o) -> MBR&{ + for(int i=0;i<4;i++) { + this->beg[i]=o.beg[i]; + this->end[i]=o.end[i]; + } + Partitions::operator=(o); + return *this; +} +auto MBR::getPartCount() -> int { + return count; +} +auto MBR::getPartBeg(int part) -> uint64_t { + if(part>=count) + return 0xFFFFFFFFFFFFFFFFull; + return beg[part]; +} +auto MBR::getPartEnd(int part) -> uint64_t { + if(part>=count) + return 0xFFFFFFFFFFFFFFFFull; + return end[part]; +} +} \ No newline at end of file diff --git a/kernel/kernel/filesystem.cpp b/kernel/kernel/filesystem.cpp new file mode 100644 index 0000000..22f58aa --- /dev/null +++ b/kernel/kernel/filesystem.cpp @@ -0,0 +1,11 @@ +/*#include + +File::File(Filesystem &fs, String fname): fs(fs), fname(fname) { + size=getFileSize(fname); +}; +auto Fileread(uint64_t offset, uint64_t length) -> uint8_t*; { + uint8_t *buf=new uint8_t[length]; + if(offset+length>size) + return nullptr; + fs.readFile(fname, offset, offset+length) +}*/ \ No newline at end of file diff --git a/kernel/kernel/include/filesystem.hpp b/kernel/kernel/include/filesystem.hpp new file mode 100644 index 0000000..8aa6d6f --- /dev/null +++ b/kernel/kernel/include/filesystem.hpp @@ -0,0 +1,30 @@ +#pragma once +#include +#include +class Filesystem { + protected: + Partitions parts; + int part; + virtual auto readSector(uint64_t num, uint8_t* buf) -> void = 0; + virtual auto readFile(String &name, uint64_t start, uint64_t end, uint8_t buf) -> void = 0; + virtual auto getFileSize(String &name) -> uint64_t = 0; + public: + friend class File; + friend class Directory; + Filesystem(Partitions &parts, int part): part(part) { + this->parts=parts; + } + virtual auto op(String directory) -> Directory& = 0; + virtual auto openFile(String file) -> File& = 0; +}; +class File { + private: + String name; + Filesystem &fs; + uint64_t size; + File() {} + public: + File(Filesystem &fs, String fname) + + auto read(uint64_t offset, uint64_t length) -> uint8_t*; +} \ No newline at end of file diff --git a/kernel/kernel/include/partitions.hpp b/kernel/kernel/include/partitions.hpp new file mode 100644 index 0000000..d6583f4 --- /dev/null +++ b/kernel/kernel/include/partitions.hpp @@ -0,0 +1,60 @@ +#pragma once +#include +class Partitions { + protected: + uint32_t drive_id; + public: + Partitions(uint32_t drive_id):drive_id(drive_id) {}; + virtual auto operator=(Partitions &o) -> Partitions& {this->drive_id=o.drive_id;return *this;} + virtual auto getPartCount() -> int = 0; + virtual auto getPartBeg(int) -> uint64_t = 0; + virtual auto getPartEnd(int) -> uint64_t = 0; +}; +namespace MBR { +class MBR: public Partitions { + private: + int count; + uint64_t beg[4], end[4]; + public: + MBR(uint32_t drive_id); + virtual auto operator=(MBR &o) -> MBR&; + virtual auto getPartCount() -> int; + virtual auto getPartBeg(int) -> uint64_t; + virtual auto getPartEnd(int) -> uint64_t; +}; +class ModernMBR: public MBR { + private: + char seconds; + char minutes; + char hours; + uint32_t sig; + bool copyProtected; + public: + ModernMBR(uint32_t drive_id); + virtual auto getDiskSec() -> char; + virtual auto getDiskMins() -> char; + virtual auto getDiskHrs() -> char; + virtual auto getDiskSignature() -> char; + virtual auto isCopyProtected() -> bool; +}; +class AST_MBR: public MBR { + private: + int count; + uint64_t beg[4], end[4]; + public: + AST_MBR(uint32_t drive_id); + virtual auto getPartCount() -> int; + virtual auto getPartBeg(int) -> uint64_t; + virtual auto getPartEnd(int) -> uint64_t; +}; +class DiskMGR: public MBR { + private: + int count; + uint64_t beg[12], end[12]; + public: + DiskMGR(uint32_t drive_id); + virtual auto getPartCount() -> int; + virtual auto getPartBeg(int) -> uint64_t; + virtual auto getPartEnd(int) -> uint64_t; +}; +} \ No newline at end of file diff --git a/kernel/kernel/include/string.hpp b/kernel/kernel/include/string.hpp index 9b5fb2d..54c8a40 100644 --- a/kernel/kernel/include/string.hpp +++ b/kernel/kernel/include/string.hpp @@ -1,3 +1,4 @@ +#pragma once #include #include class String { @@ -12,5 +13,6 @@ public: auto operator=(String &) -> String &; auto size() -> size_t; auto operator[](int) -> uint32_t; + operator char*(); }; String &operator""_s(const char *str, size_t len); \ No newline at end of file diff --git a/kernel/kernel/include/textDISP.hpp b/kernel/kernel/include/textDISP.hpp index 276e71a..d6ed747 100644 --- a/kernel/kernel/include/textDISP.hpp +++ b/kernel/kernel/include/textDISP.hpp @@ -7,80 +7,80 @@ #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 96 namespace MTGosHAL { - enum class BG_color : uint32_t { - BLACK=0x000000, - BLUE=0x0000AA, - GREEN=0x00AA00, - CYAN=0x00AAAA, - RED=0xAA0000, - MAGENTA=0xAA00AA, - BROWN=0xAA5500, - LIGHT_GREY=0xAAAAAA, - GREY=0x555555, - LIGHT_BLUE=0x5555FF, - LIGHT_GREEN=0x55FF55, - LIGHT_CYAN=0x55FFFF, - LIGHT_RED=0xFF5555, - LIGHT_MAGENTA=0xFF55FF, - YELLOW=0xFFFF55, - WHITE=0xFFFFFF - }; - enum class FG_color : uint32_t { - BLACK=0x000000, - BLUE=0x0000AA, - GREEN=0x00AA00, - CYAN=0x00AAAA, - RED=0xAA0000, - MAGENTA=0xAA00AA, - BROWN=0xAA5500, - LIGHT_GREY=0xAAAAAA, - GREY=0x555555, - LIGHT_BLUE=0x5555FF, - LIGHT_GREEN=0x55FF55, - LIGHT_CYAN=0x55FFFF, - LIGHT_RED=0xFF5555, - LIGHT_MAGENTA=0xFF55FF, - YELLOW=0xFFFF55, - WHITE=0xFFFFFF - }; + enum class BG_color : uint32_t { + BLACK=0x000000, + BLUE=0x0000AA, + GREEN=0x00AA00, + CYAN=0x00AAAA, + RED=0xAA0000, + MAGENTA=0xAA00AA, + BROWN=0xAA5500, + LIGHT_GREY=0xAAAAAA, + GREY=0x555555, + LIGHT_BLUE=0x5555FF, + LIGHT_GREEN=0x55FF55, + LIGHT_CYAN=0x55FFFF, + LIGHT_RED=0xFF5555, + LIGHT_MAGENTA=0xFF55FF, + YELLOW=0xFFFF55, + WHITE=0xFFFFFF + }; + enum class FG_color : uint32_t { + BLACK=0x000000, + BLUE=0x0000AA, + GREEN=0x00AA00, + CYAN=0x00AAAA, + RED=0xAA0000, + MAGENTA=0xAA00AA, + BROWN=0xAA5500, + LIGHT_GREY=0xAAAAAA, + GREY=0x555555, + LIGHT_BLUE=0x5555FF, + LIGHT_GREEN=0x55FF55, + LIGHT_CYAN=0x55FFFF, + LIGHT_RED=0xFF5555, + LIGHT_MAGENTA=0xFF55FF, + YELLOW=0xFFFF55, + WHITE=0xFFFFFF + }; - class Screen { - private: - FG_color fg; - BG_color bg; - uint32_t* lfb; - int base; - auto putChar(char c) -> void; - public: - auto putChar(unsigned short c) -> void; - auto puts(const char *s) -> void; - auto puts(String &) -> void; - Screen(): fg(FG_color::WHITE), bg(BG_color::BLACK), base(10) { - } - template - auto operator<< (T output) -> Screen & { - puts(output); - return *this; - } - auto clrscr() -> void; - auto scroll() -> void; - auto setColor(FG_color fg) -> Screen &; - auto setColor(BG_color bg) -> Screen &; - auto setColor(FG_color fg, BG_color bg) -> Screen &; - }; - template <> - auto Screen::operator<<(FG_color fg) -> Screen &; - template <> - auto Screen::operator<<(BG_color bg) -> Screen &; - template <> - auto Screen::operator<<(Base output) -> Screen &; - template <> - auto Screen::operator<<(int output) -> Screen &; - template <> - auto Screen::operator<<(long int output) -> Screen &; - template <> - auto Screen::operator<<(char output) -> Screen &; - template <> - auto Screen::operator<<(char* output) -> Screen &; + class Screen { + private: + FG_color fg; + BG_color bg; + uint32_t* lfb; + int base; + auto putChar(char c) -> void; + public: + auto putChar(unsigned short c) -> void; + auto puts(const char *s) -> void; + auto puts(String &) -> void; + Screen(): fg(FG_color::WHITE), bg(BG_color::BLACK), base(10) { + } + template + auto operator<< (T output) -> Screen & { + puts(output); + return *this; + } + auto clrscr() -> void; + auto scroll() -> void; + auto setColor(FG_color fg) -> Screen &; + auto setColor(BG_color bg) -> Screen &; + auto setColor(FG_color fg, BG_color bg) -> Screen &; + }; + template <> + auto Screen::operator<<(FG_color fg) -> Screen &; + template <> + auto Screen::operator<<(BG_color bg) -> Screen &; + template <> + auto Screen::operator<<(Base output) -> Screen &; + template <> + auto Screen::operator<<(int output) -> Screen &; + template <> + auto Screen::operator<<(long int output) -> Screen &; + template <> + auto Screen::operator<<(char output) -> Screen &; + template <> + auto Screen::operator<<(char* output) -> Screen &; } #endif diff --git a/kernel/kernel/init.cpp b/kernel/kernel/init.cpp index 0a6e9e8..f39ea85 100644 --- a/kernel/kernel/init.cpp +++ b/kernel/kernel/init.cpp @@ -7,6 +7,7 @@ #include #include #include +#include void * operator new (size_t, void * p) { return p ; } void * operator new[] (size_t, void * p) { return p ; } void operator delete (void *, void *) { } @@ -42,4 +43,10 @@ void main(void ** files, MTGosHAL::Serial &debug, MTGosHAL::PMM &mm, MTGosHAL::S continue; tasks.initTask(start); } + out << "checking ata0 partitions...\n"; + MBR::MBR part(disk.getDriveNumByName("ATA0m")); + out << "Partition 1: beg=" << (int32_t) part.getPartBeg(0) << " end=" << (int32_t)part.getPartEnd(0) << "\n"; + out << "Partition 2: beg=" << (int32_t)part.getPartBeg(1) << " end=" << (int32_t)part.getPartEnd(1) << "\n"; + out << "Partition 3: beg=" << (int32_t)part.getPartBeg(2) << " end=" << (int32_t)part.getPartEnd(2) << "\n"; + out << "Partition 4: beg=" << (int32_t)part.getPartBeg(3) << " end=" << (int32_t)part.getPartEnd(3) << "\n"; } diff --git a/kernel/kernel/stdstring.cpp b/kernel/kernel/stdstring.cpp index b60743f..d7a09a9 100644 --- a/kernel/kernel/stdstring.cpp +++ b/kernel/kernel/stdstring.cpp @@ -78,3 +78,53 @@ auto String::operator[](int i) -> uint32_t { String &operator""_s(const char *str, size_t len) { return *(new String(str)); } +String::operator char*() { + int strLen=1; + for(uint32_t i=0;i>6); + str[p++]=(uint8_t)((arr[i]&0x3F)|0x80); + } else if(arr[i]<0x1000) { + str[p++]=0xE0u|(uint8_t)(arr[i]>>12); + str[p++]=(uint8_t)(((arr[i]>>6)&0x3F)|0x80); + str[p++]=(uint8_t)((arr[i]&0x3F)|0x80); + } else if(arr[i]<0x20000) { + str[p++]=0xF0u|(uint8_t)(arr[i]>>18); + str[p++]=(uint8_t)(((arr[i]>>12)&0x3F)|0x80); + str[p++]=(uint8_t)(((arr[i]>>6)&0x3F)|0x80); + str[p++]=(uint8_t)((arr[i]&0x3F)|0x80); + } else if(arr[i]<0x400000) { + str[p++]=0xF8u|(uint8_t)(arr[i]>>24); + str[p++]=(uint8_t)(((arr[i]>>18)&0x3F)|0x80); + str[p++]=(uint8_t)(((arr[i]>>12)&0x3F)|0x80); + str[p++]=(uint8_t)(((arr[i]>>6)&0x3F)|0x80); + str[p++]=(uint8_t)((arr[i]&0x3F)|0x80); + } else { + str[p++]=0xFCu|(uint8_t)(arr[i]>>30); + str[p++]=(uint8_t)(((arr[i]>>24)&0x3F)|0x80); + str[p++]=(uint8_t)(((arr[i]>>18)&0x3F)|0x80); + str[p++]=(uint8_t)(((arr[i]>>12)&0x3F)|0x80); + str[p++]=(uint8_t)(((arr[i]>>6)&0x3F)|0x80); + str[p++]=(uint8_t)((arr[i]&0x3F)|0x80); + } + } + return (char*)str; +} \ No newline at end of file diff --git a/kernel/kernel/syscall.cpp b/kernel/kernel/syscall.cpp index 5a3406d..7ca16a7 100644 --- a/kernel/kernel/syscall.cpp +++ b/kernel/kernel/syscall.cpp @@ -7,12 +7,14 @@ ScreenOut::ScreenOut(bool err): err(err) { } auto ScreenOut::operator<<(char *text) -> ScreenOut & { + String *tmp = new String(text); if(!text) return *this; if(err) - MTGosHAL::err << String(text); + MTGosHAL::err << *tmp; else - MTGosHAL::out << String(text); + MTGosHAL::out << *tmp; + delete tmp; return *this; } auto ScreenOut::clrscr() -> ScreenOut & { diff --git a/kernel/libhal.a b/kernel/libhal.a index 75fcef5..e65dba0 100644 Binary files a/kernel/libhal.a and b/kernel/libhal.a differ diff --git a/log b/log new file mode 100644 index 0000000..b02ea4a --- /dev/null +++ b/log @@ -0,0 +1,69 @@ +Cleaning build... +gmake -C kernel clean +gmake[1]: Entering directory '/usr/home/morten/sources/MTGos/kernel' +gmake -C hal clean +gmake[2]: Entering directory '/usr/home/morten/sources/MTGos/kernel/hal' +rm -rf hal.o +gmake -C x86 clean +gmake[3]: Entering directory '/usr/home/morten/sources/MTGos/kernel/hal/x86' +rm -rf ./init/idt.o ./init/Multitasking.o ./init/gdt.o ./init/init.o ./asm/snippets.o ./mm/pmm2.o ./mm/pmm.o ./mm/vmm3.o ./mm/pmm3.o ./io/keyboard.o ./io/textDISP.o ./io/serial.o ./io/output.o ./boot/boot.o ./blk/BlockDevice.o ./blk/ide.o +gmake[3]: Leaving directory '/usr/home/morten/sources/MTGos/kernel/hal/x86' +gmake[2]: Leaving directory '/usr/home/morten/sources/MTGos/kernel/hal' +gmake -C kernel clean +gmake[2]: Entering directory '/usr/home/morten/sources/MTGos/kernel/kernel' +rm -rf ./stdstring.o ./Multitasking.o ./filesystem.o ./init.o ./disk/partitions.o ./elf.o ./syscall.o ./string.o +gmake[2]: Leaving directory '/usr/home/morten/sources/MTGos/kernel/kernel' +gmake[1]: Leaving directory '/usr/home/morten/sources/MTGos/kernel' +rm -rf mtgos +find . -name '*.o' -delete +Building... +gmake -C kernel +gmake[1]: Entering directory '/usr/home/morten/sources/MTGos/kernel' +gmake -C hal +gmake[2]: Entering directory '/usr/home/morten/sources/MTGos/kernel/hal' +gmake -C x86 +gmake[3]: Entering directory '/usr/home/morten/sources/MTGos/kernel/hal/x86' +i686-elf-g++ -g3 -DDEBUG -m32 -Wall -fno-stack-protector -nostdinc -std=c++14 -Iinclude/ -Ic_include/ -I../../kernel/c_include -I../../kernel/include -fno-rtti -fno-exceptions -ffreestanding -fno-builtin -Werror -nostdlib -fno-use-cxa-atexit -Wextra -Wno-unused -g -fno-pie -Wno-reorder -c -o init/idt.o init/idt.cpp +i686-elf-g++ -g3 -DDEBUG -m32 -Wall -fno-stack-protector -nostdinc -std=c++14 -Iinclude/ -Ic_include/ -I../../kernel/c_include -I../../kernel/include -fno-rtti -fno-exceptions -ffreestanding -fno-builtin -Werror -nostdlib -fno-use-cxa-atexit -Wextra -Wno-unused -g -fno-pie -Wno-reorder -c -o init/Multitasking.o init/Multitasking.cpp +i686-elf-g++ -g3 -DDEBUG -m32 -Wall -fno-stack-protector -nostdinc -std=c++14 -Iinclude/ -Ic_include/ -I../../kernel/c_include -I../../kernel/include -fno-rtti -fno-exceptions -ffreestanding -fno-builtin -Werror -nostdlib -fno-use-cxa-atexit -Wextra -Wno-unused -g -fno-pie -Wno-reorder -c -o init/gdt.o init/gdt.cpp +i686-elf-g++ -g3 -DDEBUG -m32 -Wall -fno-stack-protector -nostdinc -std=c++14 -Iinclude/ -Ic_include/ -I../../kernel/c_include -I../../kernel/include -fno-rtti -fno-exceptions -ffreestanding -fno-builtin -Werror -nostdlib -fno-use-cxa-atexit -Wextra -Wno-unused -g -fno-pie -Wno-reorder -c -o init/init.o init/init.cpp +i686-elf-gcc -g3 -DDEBUG -m32 -Wall -fno-stack-protector -nostdinc -Ic_include/ -I../../kernel/c_include -ffreestanding -std=c11 -fno-builtin -Werror -nostdlib -g -fpie -c -o asm/snippets.o asm/snippets.S +i686-elf-g++ -g3 -DDEBUG -m32 -Wall -fno-stack-protector -nostdinc -std=c++14 -Iinclude/ -Ic_include/ -I../../kernel/c_include -I../../kernel/include -fno-rtti -fno-exceptions -ffreestanding -fno-builtin -Werror -nostdlib -fno-use-cxa-atexit -Wextra -Wno-unused -g -fno-pie -Wno-reorder -c -o mm/pmm2.o mm/pmm2.cpp +i686-elf-g++ -g3 -DDEBUG -m32 -Wall -fno-stack-protector -nostdinc -std=c++14 -Iinclude/ -Ic_include/ -I../../kernel/c_include -I../../kernel/include -fno-rtti -fno-exceptions -ffreestanding -fno-builtin -Werror -nostdlib -fno-use-cxa-atexit -Wextra -Wno-unused -g -fno-pie -Wno-reorder -c -o mm/pmm.o mm/pmm.cpp +i686-elf-g++ -g3 -DDEBUG -m32 -Wall -fno-stack-protector -nostdinc -std=c++14 -Iinclude/ -Ic_include/ -I../../kernel/c_include -I../../kernel/include -fno-rtti -fno-exceptions -ffreestanding -fno-builtin -Werror -nostdlib -fno-use-cxa-atexit -Wextra -Wno-unused -g -fno-pie -Wno-reorder -c -o mm/vmm3.o mm/vmm3.cpp +i686-elf-g++ -g3 -DDEBUG -m32 -Wall -fno-stack-protector -nostdinc -std=c++14 -Iinclude/ -Ic_include/ -I../../kernel/c_include -I../../kernel/include -fno-rtti -fno-exceptions -ffreestanding -fno-builtin -Werror -nostdlib -fno-use-cxa-atexit -Wextra -Wno-unused -g -fno-pie -Wno-reorder -c -o mm/pmm3.o mm/pmm3.cpp +i686-elf-g++ -g3 -DDEBUG -m32 -Wall -fno-stack-protector -nostdinc -std=c++14 -Iinclude/ -Ic_include/ -I../../kernel/c_include -I../../kernel/include -fno-rtti -fno-exceptions -ffreestanding -fno-builtin -Werror -nostdlib -fno-use-cxa-atexit -Wextra -Wno-unused -g -fno-pie -Wno-reorder -c -o io/keyboard.o io/keyboard.cpp +i686-elf-g++ -g3 -DDEBUG -m32 -Wall -fno-stack-protector -nostdinc -std=c++14 -Iinclude/ -Ic_include/ -I../../kernel/c_include -I../../kernel/include -fno-rtti -fno-exceptions -ffreestanding -fno-builtin -Werror -nostdlib -fno-use-cxa-atexit -Wextra -Wno-unused -g -fno-pie -Wno-reorder -c -o io/textDISP.o io/textDISP.cpp +i686-elf-g++ -g3 -DDEBUG -m32 -Wall -fno-stack-protector -nostdinc -std=c++14 -Iinclude/ -Ic_include/ -I../../kernel/c_include -I../../kernel/include -fno-rtti -fno-exceptions -ffreestanding -fno-builtin -Werror -nostdlib -fno-use-cxa-atexit -Wextra -Wno-unused -g -fno-pie -Wno-reorder -c -o io/serial.o io/serial.cpp +i686-elf-g++ -g3 -DDEBUG -m32 -Wall -fno-stack-protector -nostdinc -std=c++14 -Iinclude/ -Ic_include/ -I../../kernel/c_include -I../../kernel/include -fno-rtti -fno-exceptions -ffreestanding -fno-builtin -Werror -nostdlib -fno-use-cxa-atexit -Wextra -Wno-unused -g -fno-pie -Wno-reorder -c -o io/output.o io/output.cpp +i686-elf-gcc -g3 -DDEBUG -m32 -Wall -fno-stack-protector -nostdinc -Ic_include/ -I../../kernel/c_include -ffreestanding -std=c11 -fno-builtin -Werror -nostdlib -g -fpie -c -o boot/boot.o boot/boot.S +i686-elf-g++ -g3 -DDEBUG -m32 -Wall -fno-stack-protector -nostdinc -std=c++14 -Iinclude/ -Ic_include/ -I../../kernel/c_include -I../../kernel/include -fno-rtti -fno-exceptions -ffreestanding -fno-builtin -Werror -nostdlib -fno-use-cxa-atexit -Wextra -Wno-unused -g -fno-pie -Wno-reorder -c -o blk/BlockDevice.o blk/BlockDevice.cpp +i686-elf-g++ -g3 -DDEBUG -m32 -Wall -fno-stack-protector -nostdinc -std=c++14 -Iinclude/ -Ic_include/ -I../../kernel/c_include -I../../kernel/include -fno-rtti -fno-exceptions -ffreestanding -fno-builtin -Werror -nostdlib -fno-use-cxa-atexit -Wextra -Wno-unused -g -fno-pie -Wno-reorder -c -o blk/ide.o blk/ide.cpp +gmake[3]: Leaving directory '/usr/home/morten/sources/MTGos/kernel/hal/x86' +ar rcs ../libhal.a x86/init/idt.o x86/init/Multitasking.o x86/init/gdt.o x86/init/init.o x86/asm/snippets.o x86/mm/pmm2.o x86/mm/pmm.o x86/mm/vmm3.o x86/mm/pmm3.o x86/io/keyboard.o x86/io/textDISP.o x86/io/serial.o x86/io/output.o x86/boot/boot.o x86/blk/BlockDevice.o x86/blk/ide.o +gmake[2]: Leaving directory '/usr/home/morten/sources/MTGos/kernel/hal' +gmake -C kernel +gmake[2]: Entering directory '/usr/home/morten/sources/MTGos/kernel/kernel' +i686-elf-g++ -g3 -DDEBUG -Wall -fno-stack-protector -nostdinc -std=c++14 -Iinclude/ -Ic_include/ -fno-rtti -fno-exceptions -ffreestanding -fno-builtin -Werror -nostdlib -fno-use-cxa-atexit -Wextra -Wno-unused -g -fpie -c -o stdstring.o stdstring.cpp +i686-elf-g++ -g3 -DDEBUG -Wall -fno-stack-protector -nostdinc -std=c++14 -Iinclude/ -Ic_include/ -fno-rtti -fno-exceptions -ffreestanding -fno-builtin -Werror -nostdlib -fno-use-cxa-atexit -Wextra -Wno-unused -g -fpie -c -o Multitasking.o Multitasking.cpp +i686-elf-g++ -g3 -DDEBUG -Wall -fno-stack-protector -nostdinc -std=c++14 -Iinclude/ -Ic_include/ -fno-rtti -fno-exceptions -ffreestanding -fno-builtin -Werror -nostdlib -fno-use-cxa-atexit -Wextra -Wno-unused -g -fpie -c -o filesystem.o filesystem.cpp +i686-elf-g++ -g3 -DDEBUG -Wall -fno-stack-protector -nostdinc -std=c++14 -Iinclude/ -Ic_include/ -fno-rtti -fno-exceptions -ffreestanding -fno-builtin -Werror -nostdlib -fno-use-cxa-atexit -Wextra -Wno-unused -g -fpie -c -o init.o init.cpp +i686-elf-g++ -g3 -DDEBUG -Wall -fno-stack-protector -nostdinc -std=c++14 -Iinclude/ -Ic_include/ -fno-rtti -fno-exceptions -ffreestanding -fno-builtin -Werror -nostdlib -fno-use-cxa-atexit -Wextra -Wno-unused -g -fpie -c -o disk/partitions.o disk/partitions.cpp +i686-elf-g++ -g3 -DDEBUG -Wall -fno-stack-protector -nostdinc -std=c++14 -Iinclude/ -Ic_include/ -fno-rtti -fno-exceptions -ffreestanding -fno-builtin -Werror -nostdlib -fno-use-cxa-atexit -Wextra -Wno-unused -g -fpie -c -o elf.o elf.cpp +i686-elf-g++ -g3 -DDEBUG -Wall -fno-stack-protector -nostdinc -std=c++14 -Iinclude/ -Ic_include/ -fno-rtti -fno-exceptions -ffreestanding -fno-builtin -Werror -nostdlib -fno-use-cxa-atexit -Wextra -Wno-unused -g -fpie -c -o syscall.o syscall.cpp +i686-elf-gcc -g3 -DDEBUG -Wall -fno-stack-protector -nostdinc -Ic_include/ -ffreestanding -std=c11 -fno-builtin -Werror -nostdlib -g -fpie -c -o string.o string.c +gmake[2]: Leaving directory '/usr/home/morten/sources/MTGos/kernel/kernel' +i686-elf-g++ -nostdlib -nodefaultlibs -nostdlib -fno-builtin -T kernel-x86.ld -z max-page-size=0x1000 -o mtgos kernel/stdstring.o kernel/Multitasking.o kernel/filesystem.o kernel/init.o kernel/disk/partitions.o kernel/elf.o kernel/syscall.o kernel/string.o libhal.a -lgcc +gmake[1]: Leaving directory '/usr/home/morten/sources/MTGos/kernel' +mv kernel/mtgos mtgos +gmake -C user +gmake[1]: Entering directory '/usr/home/morten/sources/MTGos/user' +i686-elf-g++ -Wall -fno-stack-protector -nostdinc -std=c++14 -Iinclude/ -Ic_include/ -fno-rtti -fno-exceptions -ffreestanding -fno-builtin -Werror -nostdlib -fno-use-cxa-atexit -Wextra -Wno-unused -g -fpie -c -o mtgos.o mtgos.cpp +i686-elf-g++ -Wall -fno-stack-protector -nostdinc -std=c++14 -Iinclude/ -Ic_include/ -fno-rtti -fno-exceptions -ffreestanding -fno-builtin -Werror -nostdlib -fno-use-cxa-atexit -Wextra -Wno-unused -g -fpie -c -o test.o test.cpp +i686-elf-gcc -c -o x86/syscall.o x86/syscall.S +i686-elf-ld -Ttest-x86.ld -L/opt/lib/gcc/i686-elf/6.1.0/ -o test.elf mtgos.o test.o x86/syscall.o -lgcc +gmake[1]: Leaving directory '/usr/home/morten/sources/MTGos/user' +mv user/*.elf . +stripping +Compressing... +How many megabytes should the image be? diff --git a/makeimage.sh b/makeimage.sh new file mode 100755 index 0000000..3125103 --- /dev/null +++ b/makeimage.sh @@ -0,0 +1,54 @@ +#!/usr/bin/env bash +unamestr=`uname` +if [[ "$unamestr" != 'FreeBSD' ]]; then + echo "This script only works on FreeBSD" + exit -1 +fi +echo "Cleaning build..." +gmake clean +echo "Building..." +gmake +echo "stripping" +strip --strip-debug mtgos +strip --strip-debug test.elf +echo "Compressing..." +xz -vv9e mtgos +xz -vv9e test.elf +xz -vv9ek mtgos.fnt +echo "How many kilobytes should the image be?" +read length +echo "OK. Creating image..." +dd if=/dev/zero of=mtgos.img bs=1K count=$length +echo "Enter your password for the remaining part of the executable." +sudo id +echo "Mounting image..." +dev=$(sudo mdconfig -a -t vnode mtgos.img) +echo "Partitioning image..." +sudo gpart create -s MBR $dev +sudo gpart add -t freebsd -b 512 ${dev} +echo "Formatting partition..." +sudo mkfs.ext2 /dev/${dev}s1 +echo "Mounting image..." +mkdir mount +sudo mount -t ext2fs /dev/${dev}s1 mount +echo "Installing grub... (May take some time)" +sudo grub-install --target=i386-pc --boot-directory=mount /dev/$dev --compress=xz --install-modules="normal part_msdos ext2 multiboot biosdisk xzio" --modules="normal part_msdos ext2 multiboot biosdisk xzio" --locales="" --force +echo "Copying files..." +sudo mv mtgos.xz mtgos.fnt.xz test.elf.xz mount +echo "Creating grub.cfg" +cat > grub.cfg << "EOF" +menuentry "MTGos" { + multiboot /mtgos.xz + module /test.elf.xz + module /mtgos.fnt.xz +} +EOF +sudo mv grub.cfg mount/grub +echo "Unmounting everything" +sync +sleep 0.5 +sudo umount mount +sudo mdconfig -d -u ${dev#md} +echo "Finalizing..." +rm -rf mount +echo "Done!" diff --git a/test.elf b/test.elf deleted file mode 100755 index 9d3d13d..0000000 Binary files a/test.elf and /dev/null differ diff --git a/user/test.cpp b/user/test.cpp index 4f06f6f..dfff932 100644 --- a/user/test.cpp +++ b/user/test.cpp @@ -10,17 +10,6 @@ void main() { char arr[4]="123"; ScreenOut out=ScreenOut(false); - int i; - out.setColor(BGColor::BLUE, FGColor::YELLOW); - for(;;) { - long double a; - long double b=a; - out << a; - a+=0.5; - if(a!=b+0.5) - out << " "; - else - out << "="; - out << a; - } + out << "Hallo! Ich bin ein Testprogramm, welches sämtliche Funktionen von MTGos, die vom Usermode zugreifbar sind, testet.\nHello! This is a test program which tests every function from MTGos that is accessable from userspace.\n"; + out << "Bonjour! Je suis une programme de test. Je teste toute la fonction de MTGos, que est accessible pour le mode d'utilisateur.\nこんにちは。私はテストのプログラムです。全てのアクセス可能な関数は試します。\näöüßÄÖÜẞ\n"; }