ember_os 0.1.3

A simple OS kernel implemented in rust, which has referenced https://os.phil-opp.com/
Documentation
use crate::{
  local_log_ln,
  memory::{self, BootInfoFrameAllocator},
  println,
};
use bootloader::BootInfo;
use x86_64::{structures::paging::Translate, VirtAddr};

#[inline]
pub fn show_map_of_tables(boot_info: &'static BootInfo) {
  local_log_ln!("Generated |> map_of_tables");
  let phys_mem_offset = VirtAddr::new(boot_info.physical_memory_offset);
  let mapper = unsafe { memory::init(phys_mem_offset) };
  let addresses = [
    // the identity-mapped vga buffer page
    0xb8000,
    // some code page
    0x201008,
    // some stack page
    0x0100_0020_1a10,
    // virtual address mapped to physical address 0
    boot_info.physical_memory_offset,
  ];
  for &address in &addresses {
    let virt = VirtAddr::new(address);
    let phys = mapper.translate_addr(virt);
    println!("{:?} -> {:?}", virt, phys);
  }
  println!();
}

#[inline]
pub fn create_new_map_of_tables(boot_info: &'static BootInfo) {
  use x86_64::structures::paging::Page;

  let phys_mem_offset = VirtAddr::new(boot_info.physical_memory_offset);
  let mut mapper = unsafe { memory::init(phys_mem_offset) };
  let mut frame_allocator = unsafe { BootInfoFrameAllocator::init(&boot_info.memory_map) };

  // Map to unused page (vga_buffer)
  let page = Page::containing_address(VirtAddr::new(0));
  memory::create_example_mapping(page, &mut mapper, &mut frame_allocator);

  // put "New!" to `vga_buffer`
  let page_ptr: *mut u64 = page.start_address().as_mut_ptr();
  unsafe { page_ptr.offset(400).write_volatile(0x_f021_f077_f065_f04e) };
}