massive memory problem averted: we were just being stupid like usual

This commit is contained in:
Jack Halford 2018-04-12 14:27:41 +02:00
parent d382b623a4
commit ae7c97a77d
12 changed files with 67 additions and 16 deletions

View file

@ -11,7 +11,6 @@ start:
push ebx
call check_multiboot
call set_up_page_tables
; load the new gdt
@ -36,6 +35,10 @@ set_up_page_tables:
mov eax, 0b10000011 ; huge + present + writable
mov [p2_table], eax ; map first entry
mov eax, 0b10000011 ; huge + present + writable
or eax, 0x400000 ; 4MB
mov [p2_table + 4], eax ; map second entry
mov eax, p2_table
mov cr3, eax
ret
@ -55,7 +58,7 @@ align 4096
p2_table:
resb 4096
stack_bottom:
resb 4096 * 4
resb 4096 * 3
stack_top:
section .gdt

View file

@ -53,5 +53,6 @@ pub fn init() {
// .expect("could not allocate double fault stack");
// println!("DF stack: {:#?}", double_fault_stack);
// flush!();
IDT.load();
}

View file

@ -69,6 +69,9 @@ pub extern "x86-interrupt" fn page_fault(
println!("Error code: {:?}", code);
println!("{:#?}", stack_frame);
flush!();
unsafe {
asm!("hlt");
}
}
exception!(x87_fpu, {});

View file

@ -43,12 +43,6 @@ SECTIONS {
. = ALIGN(4K);
}
.bss :
{
*(.bss .bss.*)
. = ALIGN(4K);
}
.gdt :
{
*(.gdt)
@ -66,4 +60,10 @@ SECTIONS {
*(.got.plt)
. = ALIGN(4K);
}
.bss :
{
*(.bss .bss.*)
. = ALIGN(4K);
}
}

View file

@ -17,6 +17,10 @@ pub unsafe extern "C" fn x86_rust_start(multiboot_info_addr: usize) {
// parse multiboot2 info
let boot_info = multiboot2::load(multiboot_info_addr);
// println!("{:?}", boot_info);
// flush!();
// asm!("hlt");
// ACPI must be intialized BEFORE paging is active
if let Some(rsdp) = boot_info.rsdp_v2_tag() {
acpi::load(rsdp).expect("ACPI failed");
@ -26,15 +30,28 @@ pub unsafe extern "C" fn x86_rust_start(multiboot_info_addr: usize) {
acpi::init().expect("ACPI failed");
}
// fill and load idt (exceptions + irqs)
idt::init();
// set up physical allocator
::memory::init(&boot_info);
// set up virtual mapping
// let memory_map_tag = boot_info.memory_map_tag().expect("Memory map tag required");
// println!("memory areas:");
// for area in memory_map_tag.memory_areas() {
// println!(
// " start: {:#x}, end: {:#x} length: {:#x}",
// area.start_address(),
// area.end_address(),
// area.size()
// );
// }
// flush!();
// asm!("hlt");
// set up virtual addressing (paging)
let mut active_table = paging::init(&boot_info);
// fill and load idt (exceptions + irqs)
idt::init();
// set up heap
::allocator::init(&mut active_table);

View file

@ -11,7 +11,7 @@ use super::table::RecTable;
pub const P2: *mut PageTable = 0xffff_f000 as *mut _;
pub struct Mapper {
p2: Unique<PageTable>,
pub p2: Unique<PageTable>,
}
impl Mapper {

View file

@ -101,6 +101,12 @@ impl InactivePageTable {
temporary_page: &mut TemporaryPage,
) -> InactivePageTable {
{
println!("mapping temp page:");
println!("frame: {:?}", frame);
flush!();
// unsafe {
// asm!("hlt");
// }
let table = temporary_page.map_table_frame(frame.clone(), active_table);
table.zero();

View file

@ -117,7 +117,7 @@ fn print_line(line: &[u8], address: usize) {
}
/// Print the kernel stack
fn print_stack() -> Result<(), &'static str> {
pub fn print_stack() -> Result<(), &'static str> {
let esp: usize;
let ebp: usize;
unsafe { asm!("" : "={esp}"(esp), "={ebp}"(ebp):::) };

View file

@ -81,7 +81,7 @@ pub extern "C" fn panic_fmt(fmt: core::fmt::Arguments, file: &'static str, line:
loop {}
}
pub const HEAP_START: usize = (1 << 22); //first entry of p2
pub const HEAP_START: usize = (2 << 22); //third entry of p2
pub const HEAP_SIZE: usize = 10 * 4096 * 8; //~ 100 KiB
#[global_allocator]

View file

@ -58,6 +58,12 @@ impl FrameAllocator for BumpFrameAllocator {
if count == 0 {
return None;
};
// println!("allocate {}", count);
// println!("kstart {:?}", self.kernel_start);
// println!("kend {:?}", self.kernel_end);
// println!("multiboot start {:?}", self.multiboot_start);
// println!("multiboot end {:?}", self.multiboot_end);
// flush!();
if let Some(area) = self.current_area {
let start_frame = PhysFrame {
number: self.next_free_frame.number,
@ -68,6 +74,7 @@ impl FrameAllocator for BumpFrameAllocator {
let current_area_last_frame =
PhysFrame::containing_address(PhysAddr::new(area.end_address() as u32));
if end_frame > current_area_last_frame {
// all frames are taken in this area
self.choose_next_area();

View file

@ -46,6 +46,20 @@ pub fn init(boot_info: &multiboot2::BootInformation) {
memory_map_tag.memory_areas(),
);
println!("memory areas from the f allocator:");
for area in memory_map_tag.memory_areas() {
println!(
" start: {:#x}, end: {:#x} length: {:#x}",
area.start_address(),
area.end_address(),
area.size()
);
}
flush!();
// unsafe {
// asm!("hlt");
// }
let frame_allocator = RecycleAllocator::new(bump_allocator);
// let stack_allocator = {

@ -1 +1 @@
Subproject commit b61535ecda89a6588a2c092dfa3bfbcc7f841575
Subproject commit ae98bfcd4f30217a4bfe944549d222bb07f81deb