summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xCopyToFDD.sh26
-rwxr-xr-xCopyToHDD.sh34
-rw-r--r--Grub-menu-fdd.cfg27
-rw-r--r--Grub-menu-hdd.cfg22
-rw-r--r--Grub-menu.cfg29
-rw-r--r--Makefile29
-rw-r--r--README5
-rw-r--r--Source/Applications/Demos/GOL.cpp5
-rw-r--r--Source/Kernel/Core/Log.ns.cpp5
-rw-r--r--Source/Kernel/Core/kmain.wtf.cpp58
-rw-r--r--Source/Kernel/UserManager/Usr.ns.cpp26
-rw-r--r--Source/Kernel/VFS/File.class.cpp3
-rw-r--r--Source/Kernel/VFS/Part.ns.cpp27
-rw-r--r--Source/Kernel/VFS/Part.ns.h3
-rw-r--r--Source/Library/Common/BasicString.class.cpp1
-rw-r--r--Source/Library/Common/BasicString.class.h2
-rw-r--r--Source/Library/Common/String.class.cpp1
-rw-r--r--Source/Library/Common/String.class.h2
18 files changed, 245 insertions, 60 deletions
diff --git a/CopyToFDD.sh b/CopyToFDD.sh
new file mode 100755
index 0000000..5d6a28e
--- /dev/null
+++ b/CopyToFDD.sh
@@ -0,0 +1,26 @@
+#!/bin/sh
+
+# We assume Mount/ is the directory where the image is mounted, and Source/ is the directory with all the compiled files
+
+# Update GRUB's menu.cfg
+cp Grub-menu-fdd.cfg Mount/boot/menu.cfg
+
+# Create directories
+mkdir Mount/{System,Apps,Mount}
+mkdir Mount/System/{Applications,Logs,Configuration}
+
+# Copy system files
+cp Source/Kernel/Ressources/Configuration/* Mount/System/Configuration
+cp Source/Applications/PaperWork/PaperWork Mount/System/Applications/PaperWork.app
+cp Source/Applications/Shell/Shell Mount/Apps/Shell.app
+
+# Copy demo apps
+cp Source/Applications/Demos/GOL Mount/Apps/GOL.app
+cp Source/Applications/Demos/asmdemo Mount/Apps/ASM.dem
+
+# Copy kernel and ramfs
+cp Source/Kernel/Melon.ke Mount/System
+cp Init.rfs Mount/System
+
+#echo "*** Launching a BASH shell, if you want to do any maintenance ***"
+#bash || exit 0
diff --git a/CopyToHDD.sh b/CopyToHDD.sh
new file mode 100755
index 0000000..eb6f82c
--- /dev/null
+++ b/CopyToHDD.sh
@@ -0,0 +1,34 @@
+#!/bin/sh
+
+# We assume Mount/ is the directory where the image is mounted, and Source/ is the directory with all the compiled files
+
+# GRUB is already installed to image, just update config file if needed
+cp Grub-menu-hdd.cfg Mount/grub/menu.lst
+
+# Create directories
+mkdir Mount/System
+mkdir Mount/System/{Applications,Configuration,Logs,Keymaps}
+mkdir Mount/Applications
+mkdir Mount/Applications/{Demos,Shell}
+
+# Copy welcome text
+cp Source/Kernel/Ressources/Texts/Welcome.txt Mount
+
+# Copy kernel and initramfs
+cp Source/Kernel/Melon.ke Mount/System
+cp Init.rfs Mount/System
+
+# Copy system ressources
+cp Source/Kernel/Ressources/Configuration/* Mount/System/Configuration
+cp Source/Kernel/Ressources/Keymaps/*.mkm Mount/System/Keymaps
+cp Source/Applications/PaperWork/PaperWork Mount/System/Applications/PaperWork.app
+cp Source/Applications/Shell/Shell Mount/Applications/Shell/Shell.app
+cp Source/Applications/Shell/Help.txt Mount/Applications/Shell
+
+# Copy demo apps
+cp Source/Applications/Demos/GOL Mount/Applications/Demos/GOL.app
+cp Source/Applications/Demos/asmdemo Mount/Applications/Demos/ASMDemo.app
+cp Source/Applications/Demos/cxxdemo Mount/Applications/Demos/CPPDemo.app
+
+echo "*** Launching a BASH shell, if you want to do any maintenance ***"
+bash || exit 0
diff --git a/Grub-menu-fdd.cfg b/Grub-menu-fdd.cfg
new file mode 100644
index 0000000..578b58d
--- /dev/null
+++ b/Grub-menu-fdd.cfg
@@ -0,0 +1,27 @@
+default 2
+
+title The Melon Operating System
+root (fd0)
+kernel /System/Melon.ke
+module /System/Init.rfs
+
+title Melon without VESA
+root (fd0)
+kernel /System/Melon.ke vesa:disabled
+module /System/Init.rfs
+
+title Melon without init
+root (fd0)
+kernel /System/Melon.ke init:
+module /System/Init.rfs
+
+title Melon without init, root is floppy
+root (fd0)
+kernel /System/Melon.ke init: root:block.floppy:0:0 mount:/Mount:ramfs:0
+module /System/Init.rfs
+
+title Game of life simulator
+root (fd0)
+kernel /System/Melon.ke init:/Applications/Demos/GOL.app
+module /System/Init.rfs
+
diff --git a/Grub-menu-hdd.cfg b/Grub-menu-hdd.cfg
new file mode 100644
index 0000000..d5b8612
--- /dev/null
+++ b/Grub-menu-hdd.cfg
@@ -0,0 +1,22 @@
+default 2
+
+title The Melon Operating System
+root (hd0,0)
+kernel /System/Melon.ke
+module /System/Init.rfs
+
+title Melon without VESA
+root (hd0,0)
+kernel /System/Melon.ke vesa:disabled
+module /System/Init.rfs
+
+title Melon without init
+root (hd0,0)
+kernel /System/Melon.ke init:
+module /System/Init.rfs
+
+title Game of life simulator
+root (hd0,0)
+kernel /System/Melon.ke init:/Applications/Demos/GOL.app
+module /System/Init.rfs
+
diff --git a/Grub-menu.cfg b/Grub-menu.cfg
deleted file mode 100644
index 5fe0cf5..0000000
--- a/Grub-menu.cfg
+++ /dev/null
@@ -1,29 +0,0 @@
-default 2
-
-title The Melon Operating System
-root (fd0)
-kernel /Melon.ke
-module /Init.rfs
-
-title Melon without VESA
-root (fd0)
-kernel /Melon.ke vesa:disabled
-module /Init.rfs
-
-title Melon without init
-root (fd0)
-kernel /Melon.ke init:
-module /Init.rfs
-
-title Game of life simulator
-root (fd0)
-kernel /Melon.ke init:/Applications/Demos/GOL.app
-module /Init.rfs
-
-#kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
-#kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
-#ooooooooooooooooooooooooooooooooooooooooooooooooooo
-#---------------------------------------------------
-
-
-#@.@
diff --git a/Makefile b/Makefile
index 98a9dd5..1b7e9b4 100644
--- a/Makefile
+++ b/Makefile
@@ -21,6 +21,7 @@ RamFSFiles = :/System :/System/Applications :/System/Configuration :/System/Keym
Files = $(Kernel) $(RamFS)
Floppy = Melon.img
+HDD = HDD.img
all:
for p in $(Projects); do \
@@ -56,26 +57,32 @@ commit: mrproper
$(RamFS):
Source/Tools/MakeRamFS/MakeRamFS $(RamFS) $(RamFSFiles)
-floppy: $(Files)
+$(Floppy): $(Files)
mkdir Mount; exit 0
sudo mount $(Floppy) Mount -o loop
- sudo cp Grub-menu.cfg Mount/boot/menu.cfg
- for f in $(Files); do \
- sudo cp $$f Mount; \
- done
- sudo cp Source/Applications/Demos/GOL Mount/GOL.app
- sudo cp Source/Applications/Demos/asmdemo Mount/ASM.dem
+ sudo ./CopyToFDD.sh
sleep 0.4
sudo umount Mount
-bochs:
+$(HDD): $(Kernel)
+ mkdir Mount; exit 0
+ sudo losetup -o 32256 /dev/loop3 $(HDD)
+ sudo mount /dev/loop3 Mount
+ sudo ./CopyToHDD.sh
+ sudo umount /dev/loop3
+ sudo losetup -d /dev/loop3
+
+bochs: $(Floppy)
bochs -f Bochs.cfg
-qemu:
- qemu -fda $(Floppy) -m 16
+qemu: $(Floppy)
+ qemu -fda $(Floppy) -hda $(HDD) -boot a -m 16
+
+qemu-hdd: $(HDD)
+ qemu -fda $(Floppy) -hda $(HDD) -boot c -m 16
qemu_debug:
- qemu -fda $(Floppy) -m 16 -s -S & gdb Source/Kernel/Melon.ke -x Qemu-GDB-Debug-CMD
+ qemu -fda $(Floppy) -hda $(HDD) -boot a -m 16 -s -S & gdb Source/Kernel/Melon.ke -x Qemu-GDB-Debug-CMD
stats:
echo; echo " ** Statistics for project O3S ** "; \
diff --git a/README b/README
index df3d346..0d1a934 100644
--- a/README
+++ b/README
@@ -32,3 +32,8 @@ The options for the kernel command line are the following :
- init:<init_app> select the init application to run. empty string = go to kernel shell.
default is /System/Applications/PaperWork.app
+** About HDD.img **
+This file is not used yet, although it is attached to the qemu and bochs VMs.
+Its content can be updated with `make hdd`, the file copying happens in CopyToHDD.sh.
+For the moment, we use a boot floppy for loading the kernel as the floppy is the only thing the kernel can read for now,
+but we could as well use the GRUB that is installed on HDD.img.
diff --git a/Source/Applications/Demos/GOL.cpp b/Source/Applications/Demos/GOL.cpp
index 32eb30a..298c73a 100644
--- a/Source/Applications/Demos/GOL.cpp
+++ b/Source/Applications/Demos/GOL.cpp
@@ -1,6 +1,7 @@
#include <Binding/VirtualTerminal.class.h>
#include <Binding/Thread.class.h>
#include <String.class.h>
+#include <ByteArray.class.h>
#include <Rand.ns.h>
int main(Vector<String> args) {
@@ -22,7 +23,7 @@ int main(Vector<String> args) {
}
}
- char *tmp = new char[w * h + 1];
+ ByteArray tmp((w + 1) * (h + 1));
bool run = true;
while (run) {
@@ -37,7 +38,7 @@ int main(Vector<String> args) {
}
}
outvt.moveCursor(0, 0);
- outvt << String(tmp, w*h) << "Press Ctrl+h for help";
+ outvt << tmp.toString() << "Press Ctrl+h for help";
//Compute next generation
for (int y = 0; y < h; y++) {
diff --git a/Source/Kernel/Core/Log.ns.cpp b/Source/Kernel/Core/Log.ns.cpp
index 1727024..c8ccd80 100644
--- a/Source/Kernel/Core/Log.ns.cpp
+++ b/Source/Kernel/Core/Log.ns.cpp
@@ -1,4 +1,5 @@
#include "Log.ns.h"
+#include <FileSystems/RamFS/RamFS.class.h>
#include <VFS/VFS.ns.h>
namespace Log {
@@ -11,6 +12,10 @@ void init(u8int loglevel) {
if (VFS::find("/System/Logs") == 0) VFS::createDirectory("/System/Logs");
logs[KL_PANIC] = new TextFile("/System/Logs/Panic.log", FM_APPEND);
+ if (!logs[KL_PANIC]->valid()) { //FS maybee not read/write, mount a ramfs
+ RamFS::mount(1024*1024, (DirectoryNode*)VFS::find("/System/Logs"));
+ logs[KL_PANIC] = new TextFile("/System/Logs/Panic.log", FM_APPEND);
+ }
if (KL_CRITICAL <= loglevel) logs[KL_CRITICAL] = new TextFile("/System/Logs/Critical.log", FM_APPEND);
if (KL_ERROR <= loglevel) logs[KL_ERROR] = new TextFile("/System/Logs/Error.log", FM_APPEND);
if (KL_WARNING <= loglevel) logs[KL_WARNING] = new TextFile("/System/Logs/Warning.log", FM_APPEND);
diff --git a/Source/Kernel/Core/kmain.wtf.cpp b/Source/Kernel/Core/kmain.wtf.cpp
index bb77eeb..1d438ed 100644
--- a/Source/Kernel/Core/kmain.wtf.cpp
+++ b/Source/Kernel/Core/kmain.wtf.cpp
@@ -115,6 +115,43 @@ void selectVideoMode(SimpleVT& v) {
}
}
+bool mountFS(multiboot_info_t* mbd, String str) {
+ module_t *mods = (module_t*)mbd->mods_addr;
+ Vector<String> fs = str.split(":");
+ DirectoryNode* root;
+ if (fs[0] == "/") {
+ root = NULL;
+ } else {
+ FSNode* n = VFS::find(fs[0]);
+ if (n == NULL) {
+ *kvt << "Mountpoint does not exist : " << fs[0] << "\n";
+ return false;
+ }
+ if (n->type() != NT_DIRECTORY) {
+ *kvt << "Mountpoint is not a directory : " << fs[0] << "\n";
+ return false;
+ }
+ root = (DirectoryNode*)n;
+ }
+ if (fs[1] == "ramfs") {
+ if (fs[2].toInt() >= mbd->mods_count) {
+ *kvt << "Invalid module number for filesystem to mount on " << fs[0] << "\n";
+ return false;
+ }
+ RamFS::mount((u8int*)mods[fs[2].toInt()].mod_start, 1024 * 1024, root);
+ } else {
+ if (fs.size() < 5) fs.push("fat");
+ BlockDevice* d = Part::dev(fs[1], fs[2].toInt());
+ Partition* p = Part::part(d, fs[3].toInt());
+ if (fs[4] == "fat") {
+ FATFS::mount(p, root);
+ } else {
+ PANIC("Unknown filesystem type for root file system.");
+ }
+ }
+ return true;
+}
+
void kmain(multiboot_info_t* mbd, u32int magic) {
DEBUG("Entering kmain.");
@@ -167,13 +204,17 @@ void kmain(multiboot_info_t* mbd, u32int magic) {
//*************************************** PARSE COMMAND LINE
Vector<String> opts = kcmdline.split(" ");
- String keymap = "fr", init = "/System/Applications/PaperWork.app";
+ String keymap = "builtin", init = "/System/Applications/PaperWork.app";
+ String root = "ramfs:0";
+ Vector<String> mount;
bool enableVESA = true;
for (u32int i = 0; i < opts.size(); i++) {
Vector<String> opt = opts[i].split(":");
if (opt[0] == "vesa" && opt[1] != "enabled") enableVESA = false;
if (opt[0] == "keymap") keymap = opt[1];
if (opt[0] == "init") init = opt[1];
+ if (opt[0] == "root") root = opts[i].substr(5);
+ if (opt[0] == "mount") mount.push(opts[i].substr(6));
}
//*************************************** DEVICE SETUP
@@ -183,14 +224,23 @@ void kmain(multiboot_info_t* mbd, u32int magic) {
if (enableVESA) Dev::registerDevice(new VESADisplay());
FloppyController::detect();
- //*************************************** MOUNT ROOT FILESYSTEM
+ //*************************************** MOUNT FILESYSTEMS
- RamFS::mount((u8int*)mods[0].mod_start, 1024 * 1024, NULL);
+ { // mount root filesystem
+ if (!mountFS(mbd, String("/:") += root)) PANIC("Cannot mount root filesystem.");
+ }
DirectoryNode* cwd;
cwd = VFS::getRootNode();
Task::currProcess()->setCwd(cwd);
- FATFS::mount(Part::partitions[0], (DirectoryNode*)VFS::createDirectory("/Mount"));
+ // mount other filesystems
+ for (u32int i = 0; i < mount.size(); i++) {
+ mountFS(mbd, mount[i]);
+ }
+
+ //FATFS::mount(Part::partitions[0], (DirectoryNode*)VFS::createDirectory("/Mount"));
+
+ //*************************************** LOAD SYSTEM STUFF
if (keymap != "builtin") {
if (!Kbd::loadKeymap(keymap)) *kvt << "\nWARNING : Could not load keymap " << keymap << ", using built-in keymap instead.";
diff --git a/Source/Kernel/UserManager/Usr.ns.cpp b/Source/Kernel/UserManager/Usr.ns.cpp
index ecf9bae..66e159e 100644
--- a/Source/Kernel/UserManager/Usr.ns.cpp
+++ b/Source/Kernel/UserManager/Usr.ns.cpp
@@ -26,11 +26,13 @@ void load() {
if (VFS::find("/System/Configuration/Groups")) VFS::find("/System/Configuration/Groups")->setPermissions(0600);
if (VFS::find("/System/Configuration/Users")) VFS::find("/System/Configuration/Users")->setPermissions(0600);
TextFile groups("/System/Configuration/Groups", FM_READ);
- while (!groups.eof()) {
- String s = groups.readLine();
- Vector<String> data = s.split(":");
- if (data.size() == 2 and !(s[0] == WChar("#"))) {
- m_groups = m_groups->cons(Group(data[1], data[0].toInt()));
+ if (groups.valid()) {
+ while (!groups.eof()) {
+ String s = groups.readLine();
+ Vector<String> data = s.split(":");
+ if (data.size() == 2 and !(s[0] == WChar("#"))) {
+ m_groups = m_groups->cons(Group(data[1], data[0].toInt()));
+ }
}
}
if (m_groups == 0) {
@@ -39,12 +41,14 @@ void load() {
}
TextFile users("/System/Configuration/Users", FM_READ);
- while (!users.eof()) {
- String s = users.readLine();
- if (s == "" or s[0] == WChar("#")) continue;
- Vector<String> data = s.split(":");
- if (data.size() == 6) {
- m_users = m_users->cons(User(data[1], data[4], data[5], group(data[2].toInt()), data[3], data[0].toInt()));
+ if (users.valid()) {
+ while (!users.eof()) {
+ String s = users.readLine();
+ if (s == "" or s[0] == WChar("#")) continue;
+ Vector<String> data = s.split(":");
+ if (data.size() == 6) {
+ m_users = m_users->cons(User(data[1], data[4], data[5], group(data[2].toInt()), data[3], data[0].toInt()));
+ }
}
}
if (m_users == 0) {
diff --git a/Source/Kernel/VFS/File.class.cpp b/Source/Kernel/VFS/File.class.cpp
index c5ddcd6..84561a5 100644
--- a/Source/Kernel/VFS/File.class.cpp
+++ b/Source/Kernel/VFS/File.class.cpp
@@ -33,7 +33,7 @@ bool File::open(String filename, u8int mode, FSNode* start, bool vrfyperm) {
if (node == NULL){
if (mode == FM_READ) return false;
node = VFS::createFile(filename, start, vrfyperm);
- if (node == 0) return false;
+ if (node == NULL) return false;
}
if (node->type() != NT_FILE) return false;
@@ -137,6 +137,7 @@ bool File::seek(u64int count, u8int mode) {
}
bool File::eof() {
+ if (!m_valid) return false;
return m_position == m_file->getLength();
}
diff --git a/Source/Kernel/VFS/Part.ns.cpp b/Source/Kernel/VFS/Part.ns.cpp
index 6408dbd..7184f90 100644
--- a/Source/Kernel/VFS/Part.ns.cpp
+++ b/Source/Kernel/VFS/Part.ns.cpp
@@ -56,4 +56,31 @@ u32int getDeviceID(BlockDevice* dev) {
return (u32int) - 1;
}
+BlockDevice* dev(String _class, u32int idx) {
+ for (u32int i = 0; i < devices.size(); i++) {
+ String devclass = devices[i]->getClass();
+ if (devclass == _class or (devclass.size() > _class.size() and devclass.substr(0, _class.size()) == _class)) {
+ if (idx == 0) {
+ return devices[i];
+ } else {
+ idx--;
+ }
+ }
+ }
+ return NULL;
+}
+
+Partition* part(BlockDevice* dev, u32int idx) {
+ for (u32int i = 0; i < partitions.size(); i++) {
+ if (partitions[i]->getDevice() == dev) {
+ if (idx == 0) {
+ return partitions[i];
+ } else {
+ idx--;
+ }
+ }
+ }
+ return NULL;
+}
+
}
diff --git a/Source/Kernel/VFS/Part.ns.h b/Source/Kernel/VFS/Part.ns.h
index 40a0fb2..4373a2d 100644
--- a/Source/Kernel/VFS/Part.ns.h
+++ b/Source/Kernel/VFS/Part.ns.h
@@ -13,6 +13,9 @@ namespace Part {
void unregisterDevice(BlockDevice* dev);
u32int getDeviceID(BlockDevice* dev);
+
+ BlockDevice* dev(String _class, u32int idx);
+ Partition* part(BlockDevice* dev, u32int idx);
}
#endif
diff --git a/Source/Library/Common/BasicString.class.cpp b/Source/Library/Common/BasicString.class.cpp
index f3a6164..58fa926 100644
--- a/Source/Library/Common/BasicString.class.cpp
+++ b/Source/Library/Common/BasicString.class.cpp
@@ -175,6 +175,7 @@ Vector< BasicString<T> > BasicString<T>::split(T sep) const {
template <typename T>
BasicString<T> BasicString<T>::substr(s32int start, u32int size) {
if (start < 0) start = m_length - start;
+ if (size == 0) size = m_length - start;
BasicString<T> ret;
ret.m_string = new T[size + 1];
ret.m_length = size;
diff --git a/Source/Library/Common/BasicString.class.h b/Source/Library/Common/BasicString.class.h
index 21041e8..be74cf3 100644
--- a/Source/Library/Common/BasicString.class.h
+++ b/Source/Library/Common/BasicString.class.h
@@ -46,7 +46,7 @@ class BasicString {
bool contains(const T& chr) const;
Vector< BasicString<T> > split(T sep) const;
- BasicString<T> substr(s32int start, u32int size);
+ BasicString<T> substr(s32int start, u32int size = 0);
};
#include "BasicString.class.cpp"
diff --git a/Source/Library/Common/String.class.cpp b/Source/Library/Common/String.class.cpp
index a824eac..da2b93e 100644
--- a/Source/Library/Common/String.class.cpp
+++ b/Source/Library/Common/String.class.cpp
@@ -193,6 +193,7 @@ Vector<String> String::split(WChar c) const {
String String::substr(s32int start, u32int size) {
if (start < 0) start = m_length - start;
+ if (size == 0) size = m_length - start;
String ret;
ret.m_string = new WChar[size + 1];
ret.m_length = size;
diff --git a/Source/Library/Common/String.class.h b/Source/Library/Common/String.class.h
index 0d48ce6..473624b 100644
--- a/Source/Library/Common/String.class.h
+++ b/Source/Library/Common/String.class.h
@@ -43,7 +43,7 @@ class String : public BasicString<WChar> {
Vector<String> split(WChar c) const;
- String substr(s32int start, u32int size);
+ String substr(s32int start, u32int size = 0);
};
#endif