Kernel: root partition is now passed from the commandline
This commit is contained in:
		
							parent
							
								
									c1dbafc101
								
							
						
					
					
						commit
						2995a36942
					
				
							
								
								
									
										19
									
								
								disk.sh
								
								
								
								
							
							
						
						
									
										19
									
								
								disk.sh
								
								
								
								
							|  | @ -30,14 +30,9 @@ sed -e 's/\s*\([-\+[:alnum:]]*\).*/\1/' << EOF | fdisk $DISK_NAME | |||
|   t     # set type | ||||
|   2     # ... of partition 2 | ||||
|   20    # Linux filesystem | ||||
|   x		# expert menu | ||||
|   n		# partition name | ||||
|   3		# ... of partition 3 | ||||
|   mount-test | ||||
|   n		# partition name | ||||
|   2		# ... of partition 2 | ||||
|   banan-root | ||||
|   r		# back to main menu | ||||
|   t     # set type | ||||
|   3     # ... of partition 3 | ||||
|   20    # Linux filesystem | ||||
|   w     # write changes | ||||
| EOF | ||||
| 
 | ||||
|  | @ -63,16 +58,16 @@ sudo grub-install --no-floppy --target=i386-pc --modules="normal ext2 multiboot" | |||
| 
 | ||||
| echo -e ' | ||||
| menuentry "banan-os" { | ||||
| 	multiboot /boot/banan-os.kernel | ||||
| 	multiboot /boot/banan-os.kernel root=/dev/hda1 | ||||
| } | ||||
| menuentry "banan-os (no serial)" { | ||||
| 	multiboot /boot/banan-os.kernel noserial | ||||
| 	multiboot /boot/banan-os.kernel root=/dev/hda1 noserial | ||||
| } | ||||
| menuentry "banan-os (no apic)" { | ||||
| 	multiboot /boot/banan-os.kernel noapic | ||||
| 	multiboot /boot/banan-os.kernel root=/dev/hda1 noapic | ||||
| } | ||||
| menuentry "banan-os (no apic, no serial)" { | ||||
| 	multiboot /boot/banan-os.kernel noapic noserial | ||||
| 	multiboot /boot/banan-os.kernel root=/dev/hda1 noapic noserial | ||||
| } | ||||
| ' | sudo tee ${MOUNT_DIR}/boot/grub/grub.cfg | ||||
| 
 | ||||
|  |  | |||
|  | @ -12,7 +12,7 @@ namespace Kernel | |||
| 	class VirtualFileSystem : public FileSystem | ||||
| 	{ | ||||
| 	public: | ||||
| 		static BAN::ErrorOr<void> initialize(); | ||||
| 		static BAN::ErrorOr<void> initialize(BAN::StringView); | ||||
| 		static VirtualFileSystem& get(); | ||||
| 		virtual ~VirtualFileSystem() {}; | ||||
| 
 | ||||
|  |  | |||
|  | @ -12,7 +12,7 @@ namespace Kernel | |||
| 
 | ||||
| 	static VirtualFileSystem* s_instance = nullptr; | ||||
| 
 | ||||
| 	BAN::ErrorOr<void> VirtualFileSystem::initialize() | ||||
| 	BAN::ErrorOr<void> VirtualFileSystem::initialize(BAN::StringView root) | ||||
| 	{ | ||||
| 		ASSERT(s_instance == nullptr); | ||||
| 		s_instance = new VirtualFileSystem(); | ||||
|  | @ -20,8 +20,13 @@ namespace Kernel | |||
| 			return BAN::Error::from_errno(ENOMEM); | ||||
| 		BAN::ScopeGuard guard([] { delete s_instance; s_instance = nullptr; } ); | ||||
| 
 | ||||
| 		auto partition_inode = TRY(DeviceManager::get().read_directory_inode("hda1")); | ||||
| 		if (root.size() < 5 || root.substring(0, 5) != "/dev/") | ||||
| 			return BAN::Error::from_c_string("root must be in /dev/"); | ||||
| 		root = root.substring(5); | ||||
| 
 | ||||
| 		auto partition_inode = TRY(DeviceManager::get().read_directory_inode(root)); | ||||
| 		s_instance->m_root_fs = TRY(Ext2FS::create(*(Partition*)partition_inode.ptr())); | ||||
| 
 | ||||
| 		TRY(s_instance->mount(&DeviceManager::get(), "/dev")); | ||||
| 
 | ||||
| 		guard.disable(); | ||||
|  | @ -76,7 +81,7 @@ namespace Kernel | |||
| 
 | ||||
| 		const auto path_parts = TRY(path.split('/')); | ||||
| 
 | ||||
| 		for (const auto& path_part : path_parts) | ||||
| 		for (auto path_part : path_parts) | ||||
| 		{ | ||||
| 			if (path_part.empty() || path_part == "."sv) | ||||
| 			{ | ||||
|  |  | |||
|  | @ -27,14 +27,13 @@ struct ParsedCommandLine | |||
| { | ||||
| 	bool force_pic		= false; | ||||
| 	bool disable_serial	= false; | ||||
| 	BAN::StringView root; | ||||
| }; | ||||
| 
 | ||||
| ParsedCommandLine ParseCommandLine() | ||||
| static bool should_disable_serial() | ||||
| { | ||||
| 	ParsedCommandLine result; | ||||
| 
 | ||||
| 	if (!(g_multiboot_info->flags & 0x02)) | ||||
| 		return result; | ||||
| 		return false; | ||||
| 
 | ||||
| 	const char* start = g_kernel_cmdline; | ||||
| 	const char* current = g_kernel_cmdline; | ||||
|  | @ -42,12 +41,8 @@ ParsedCommandLine ParseCommandLine() | |||
| 	{ | ||||
| 		if (!*current || *current == ' ' || *current == '\t') | ||||
| 		{ | ||||
| 			if (current - start == 6 && memcmp(start, "noapic", 6) == 0) | ||||
| 				result.force_pic = true; | ||||
| 
 | ||||
| 			if (current - start == 8 && memcmp(start, "noserial", 8) == 0) | ||||
| 				result.disable_serial = true; | ||||
| 
 | ||||
| 				return true; | ||||
| 			if (!*current) | ||||
| 				break; | ||||
| 			start = current + 1; | ||||
|  | @ -55,7 +50,28 @@ ParsedCommandLine ParseCommandLine() | |||
| 		current++; | ||||
| 	} | ||||
| 
 | ||||
| 	return result; | ||||
| 	return false; | ||||
| } | ||||
| 
 | ||||
| static ParsedCommandLine cmdline; | ||||
| 
 | ||||
| static void parse_command_line() | ||||
| { | ||||
| 	if (!(g_multiboot_info->flags & 0x02)) | ||||
| 		return; | ||||
| 
 | ||||
| 	BAN::StringView full_command_line(g_kernel_cmdline); | ||||
| 	auto arguments = MUST(full_command_line.split(' ')); | ||||
| 
 | ||||
| 	for (auto argument : arguments) | ||||
| 	{ | ||||
| 		if (argument == "noapic") | ||||
| 			cmdline.force_pic = true; | ||||
| 		else if (argument == "noserial") | ||||
| 			cmdline.disable_serial = true; | ||||
| 		else if (argument.size() > 5 && argument.substring(0, 5) == "root=") | ||||
| 			cmdline.root = argument.substring(5); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| struct Test | ||||
|  | @ -87,8 +103,7 @@ extern "C" uintptr_t g_userspace_end; | |||
| 
 | ||||
| extern void userspace_entry(); | ||||
| 
 | ||||
| void init2(void*); | ||||
| void device_updater(void*); | ||||
| static void init2(void*); | ||||
| 
 | ||||
| extern "C" void kernel_main() | ||||
| { | ||||
|  | @ -96,9 +111,7 @@ extern "C" void kernel_main() | |||
| 
 | ||||
| 	DISABLE_INTERRUPTS(); | ||||
| 
 | ||||
| 	auto cmdline = ParseCommandLine(); | ||||
| 
 | ||||
| 	if (!cmdline.disable_serial) | ||||
| 	if (!should_disable_serial()) | ||||
| 		Serial::initialize(); | ||||
| 	if (g_multiboot_magic != 0x2BADB002) | ||||
| 	{ | ||||
|  | @ -119,6 +132,9 @@ extern "C" void kernel_main() | |||
| 	MMU::intialize(); | ||||
| 	dprintln("MMU initialized"); | ||||
| 
 | ||||
| 	parse_command_line(); | ||||
| 	dprintln("command line parsed, root='{}'", cmdline.root); | ||||
| 
 | ||||
| 	PCI::initialize(); | ||||
| 	dprintln("PCI initialized"); | ||||
| 
 | ||||
|  | @ -189,16 +205,7 @@ extern "C" void kernel_main() | |||
| 	ASSERT(false); | ||||
| } | ||||
| 
 | ||||
| void device_updater(void*) | ||||
| { | ||||
| 	while (true) | ||||
| 	{ | ||||
| 		Kernel::DeviceManager::get().update(); | ||||
| 		PIT::sleep(1); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void init2(void* tty1_ptr) | ||||
| static void init2(void* tty1_ptr) | ||||
| { | ||||
| 	using namespace Kernel; | ||||
| 	using namespace Kernel::Input; | ||||
|  | @ -207,7 +214,7 @@ void init2(void* tty1_ptr) | |||
| 
 | ||||
| 	DeviceManager::initialize(); | ||||
| 
 | ||||
| 	MUST(VirtualFileSystem::initialize()); | ||||
| 	MUST(VirtualFileSystem::initialize(cmdline.root)); | ||||
| 
 | ||||
| 	if (auto res = PS2Controller::initialize(); res.is_error()) | ||||
| 		dprintln("{}", res.error()); | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue