This commit is contained in:
Philipp Oppermann
2015-08-22 12:51:48 +02:00
parent 812396d473
commit 2655ac093c
4 changed files with 27 additions and 8 deletions

View File

@@ -32,7 +32,7 @@ clean:
@rm -rf build @rm -rf build
run: $(iso) run: $(iso)
@qemu-system-x86_64 -hda $(iso) @qemu-system-x86_64 -s -hda $(iso)
iso: $(iso) iso: $(iso)

View File

@@ -48,6 +48,11 @@ setup_page_tables:
; map first P3 entry to a huge page that starts at address 0 ; map first P3 entry to a huge page that starts at address 0
mov dword [p3_table], 0b10000011 ; present + writable + huge mov dword [p3_table], 0b10000011 ; present + writable + huge
; recursive map P4
mov eax, p4_table
or eax, 0b11 ; present + writable
mov [p4_table + 511 * 8], eax
ret ret
enable_paging: enable_paging:
@@ -133,7 +138,9 @@ p4_table:
p3_table: p3_table:
resb 4096 resb 4096
stack_bottom: stack_bottom:
resb 64 ; TODO a >= 80 byte stack is enough. Theoretically we could use the memory
; of the p3 table as a hack (it won't override the important first entry)
resb 4096
stack_top: stack_top:
section .rodata section .rodata

View File

@@ -27,6 +27,15 @@ SECTIONS {
.text : .text :
{ {
*(.text) *(.text .text.*)
} }
.rodata : {
*(.rodata .rodata.*)
}
.data.rel.ro : {
*(.data.rel.ro.local*) *(.data.rel.ro .data.rel.ro.*)
}
} }

View File

@@ -12,8 +12,8 @@
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
#![feature(no_std, lang_items)] #![feature(no_std, lang_items, asm)]
#![feature(core_str_ext, const_fn)] #![feature(core_str_ext, const_fn, range_inclusive)]
#![no_std] #![no_std]
extern crate rlibc; extern crate rlibc;
@@ -26,15 +26,18 @@ use core::fmt::Write;
#[macro_use] #[macro_use]
mod vga_buffer; mod vga_buffer;
mod memory;
#[no_mangle] #[no_mangle]
pub extern fn rust_main(multiboot_address: usize) { pub extern fn rust_main(multiboot_address: usize) {
// ATTENTION: we have a very small stack and no guard page // ATTENTION: we have a very small stack and no guard page
use vga_buffer::{Writer, Color}; use vga_buffer::{Writer, Color};
let multiboot = unsafe{multiboot2::load(multiboot_address)};
vga_buffer::clear_screen(); vga_buffer::clear_screen();
let multiboot = unsafe{multiboot2::load(multiboot_address)};
memory::init(multiboot);
let mut writer = Writer::new(Color::Blue, Color::LightGreen); let mut writer = Writer::new(Color::Blue, Color::LightGreen);
writer.write_byte(b'H'); writer.write_byte(b'H');
let _ = writer.write_str("ello! "); let _ = writer.write_str("ello! ");