mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 23:17:45 +00:00
Bootloader: Locate the kernel's data segment and clear it.
This was a constant source of stupid bugs and I kept postponing it because I wasn't in the mood to write assembly code. Until now! :^)
This commit is contained in:
parent
781f216676
commit
a1b63bb6d4
22 changed files with 54 additions and 83 deletions
|
@ -24,11 +24,6 @@ BochsVGADevice& BochsVGADevice::the()
|
|||
return *s_the;
|
||||
}
|
||||
|
||||
void BochsVGADevice::initialize_statics()
|
||||
{
|
||||
s_the = nullptr;
|
||||
}
|
||||
|
||||
BochsVGADevice::BochsVGADevice()
|
||||
{
|
||||
s_the = this;
|
||||
|
|
|
@ -10,7 +10,6 @@ class BochsVGADevice {
|
|||
AK_MAKE_ETERNAL
|
||||
public:
|
||||
static BochsVGADevice& the();
|
||||
static void initialize_statics();
|
||||
|
||||
BochsVGADevice();
|
||||
|
||||
|
|
|
@ -25,9 +25,13 @@ boot:
|
|||
mov ax, 0x2401
|
||||
int 0x15
|
||||
|
||||
mov bx, 0x1000
|
||||
; HACK: Load the ELF kernel at 0xf000. Assuming that the first
|
||||
; LOAD header has a file offset of 0x1000, this puts _start
|
||||
; at 0x10000 which we jump to later.
|
||||
; This is all quite rickety.
|
||||
mov bx, 0xf00
|
||||
mov es, bx
|
||||
xor bx, bx ; Load kernel @ 0x10000
|
||||
xor bx, bx
|
||||
|
||||
mov cx, word [cur_lba]
|
||||
.sector_loop:
|
||||
|
@ -65,6 +69,53 @@ boot:
|
|||
xor al, al
|
||||
out dx, al
|
||||
|
||||
; Let's look at the ELF header.
|
||||
mov bx, 0xf00
|
||||
mov fs, bx
|
||||
cmp [fs:0], dword 0x464c457f ; ELF magic: { 0x7f "ELF" }
|
||||
jne fug
|
||||
|
||||
cmp [fs:24], dword 0x10000 ; Entry should be 0x10000
|
||||
jne fug
|
||||
|
||||
mov ebx, dword [fs:28] ; EBX <- program header table
|
||||
mov ecx, dword [fs:44] ; ECX <- program header count
|
||||
|
||||
; Let's find the BSS and clear it.
|
||||
|
||||
parse_program_header:
|
||||
cmp [fs:ebx], dword 0x1 ; Is Load segment?
|
||||
jne .next
|
||||
|
||||
cmp [fs:ebx+24], dword 0x6 ; Is read+write but not execute?
|
||||
jne .next
|
||||
|
||||
mov edi, [fs:ebx+8] ; EDI <- p_vaddr
|
||||
add edi, [fs:ebx+16] ; skip over 'p_filesz' bytes (leave them intact)
|
||||
|
||||
push ecx
|
||||
|
||||
sub edi, [fs:ebx+16] ; skip over 'p_filesz' bytes (see above)
|
||||
|
||||
; Since we're in 16-bit real mode, create a segment address.
|
||||
mov eax, edi
|
||||
shr eax, 4
|
||||
mov es, ax
|
||||
and edi, 0xf
|
||||
|
||||
mov ecx, [fs:ebx+20] ; ECX <- p_memsz
|
||||
xor al, al
|
||||
rep stosb
|
||||
|
||||
pop ecx
|
||||
|
||||
.next:
|
||||
add ebx, 32
|
||||
loop parse_program_header
|
||||
|
||||
; Okay we're all set to go!
|
||||
|
||||
lets_go:
|
||||
lgdt [cs:test_gdt_ptr]
|
||||
|
||||
mov eax, cr0
|
||||
|
@ -182,7 +233,7 @@ convert_lba_to_chs:
|
|||
ret
|
||||
|
||||
cur_lba:
|
||||
dw 9
|
||||
dw 1
|
||||
sectors_per_track:
|
||||
dw 18
|
||||
heads:
|
||||
|
|
|
@ -23,13 +23,6 @@ HashTable<Inode*>& all_inodes()
|
|||
return *s_inode_set;
|
||||
}
|
||||
|
||||
void FS::initialize_globals()
|
||||
{
|
||||
s_lastFileSystemID = 0;
|
||||
s_fs_map = nullptr;
|
||||
s_inode_set = nullptr;
|
||||
}
|
||||
|
||||
FS::FS()
|
||||
: m_fsid(++s_lastFileSystemID)
|
||||
{
|
||||
|
|
|
@ -23,7 +23,6 @@ class VMObject;
|
|||
|
||||
class FS : public Retainable<FS> {
|
||||
public:
|
||||
static void initialize_globals();
|
||||
virtual ~FS();
|
||||
|
||||
unsigned fsid() const { return m_fsid; }
|
||||
|
|
|
@ -12,11 +12,6 @@ PTYMultiplexer& PTYMultiplexer::the()
|
|||
return *s_the;
|
||||
}
|
||||
|
||||
void PTYMultiplexer::initialize_statics()
|
||||
{
|
||||
s_the = nullptr;
|
||||
}
|
||||
|
||||
PTYMultiplexer::PTYMultiplexer()
|
||||
: CharacterDevice(5, 2)
|
||||
{
|
||||
|
|
|
@ -13,7 +13,6 @@ public:
|
|||
virtual ~PTYMultiplexer() override;
|
||||
|
||||
static PTYMultiplexer& the();
|
||||
static void initialize_statics();
|
||||
|
||||
// ^CharacterDevice
|
||||
virtual RetainPtr<FileDescriptor> open(int& error, int options) override;
|
||||
|
|
|
@ -12,11 +12,6 @@
|
|||
|
||||
void Process::initialize_gui_statics()
|
||||
{
|
||||
Font::initialize();
|
||||
WSMessageLoop::initialize();
|
||||
WSWindowManager::initialize();
|
||||
WSScreen::initialize();
|
||||
|
||||
new WSMessageLoop;
|
||||
}
|
||||
|
||||
|
|
|
@ -19,12 +19,6 @@ VFS& VFS::the()
|
|||
return *s_the;
|
||||
}
|
||||
|
||||
void VFS::initialize_globals()
|
||||
{
|
||||
s_the = nullptr;
|
||||
FS::initialize_globals();
|
||||
}
|
||||
|
||||
VFS::VFS()
|
||||
{
|
||||
#ifdef VFS_DEBUG
|
||||
|
|
|
@ -39,8 +39,6 @@ class VFS;
|
|||
class VFS {
|
||||
AK_MAKE_ETERNAL
|
||||
public:
|
||||
static void initialize_globals();
|
||||
|
||||
class Mount {
|
||||
public:
|
||||
Mount(InodeIdentifier host, RetainPtr<FS>&&);
|
||||
|
|
|
@ -151,8 +151,6 @@ void init()
|
|||
gdt_init();
|
||||
idt_init();
|
||||
|
||||
PTYMultiplexer::initialize_statics();
|
||||
VFS::initialize_globals();
|
||||
vfs = new VFS;
|
||||
|
||||
keyboard = new Keyboard;
|
||||
|
@ -169,10 +167,6 @@ void init()
|
|||
kprintf("Starting Serenity Operating System...\n");
|
||||
|
||||
MemoryManager::initialize();
|
||||
|
||||
StringImpl::initialize_globals();
|
||||
BochsVGADevice::initialize_statics();
|
||||
|
||||
PIT::initialize();
|
||||
|
||||
memset(&system, 0, sizeof(system));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue