made kernel the system entrypoint.
This commit is contained in:
parent
eae4891071
commit
7652bbf402
6
Cargo.lock
generated
6
Cargo.lock
generated
|
@ -580,14 +580,18 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "kernel"
|
name = "kernel"
|
||||||
version = "0.1.2"
|
version = "0.2.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"crossbeam-queue",
|
"crossbeam-queue",
|
||||||
|
"limine",
|
||||||
"linked_list_allocator",
|
"linked_list_allocator",
|
||||||
"log",
|
"log",
|
||||||
"slab",
|
"slab",
|
||||||
"spin 0.9.4",
|
"spin 0.9.4",
|
||||||
|
"tracing",
|
||||||
|
"uart_16550",
|
||||||
"versioning",
|
"versioning",
|
||||||
|
"x86_64",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
"pre-link-args": {
|
"pre-link-args": {
|
||||||
"ld.lld": [
|
"ld.lld": [
|
||||||
"--gc-sections",
|
"--gc-sections",
|
||||||
"--script=ableos/src/arch/x86_64/kernel.ld"
|
"--script=kernel/lds/x86_64.ld"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,2 +1,9 @@
|
||||||
|
[unstable]
|
||||||
|
build-std = ["core", "compiler_builtins", "alloc"]
|
||||||
|
build-std-features = ["compiler-builtins-mem"]
|
||||||
|
|
||||||
[build]
|
[build]
|
||||||
target = "./json_targets/x86_64-ableos.json"
|
target = "./targets/x86_64-ableos.json"
|
||||||
|
|
||||||
|
[target.'cfg(target_arch = "x86_64")']
|
||||||
|
rustflags = ["-C", "target-feature=+rdrand"]
|
|
@ -1,18 +1,22 @@
|
||||||
[package]
|
[package]
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
name = "kernel"
|
name = "kernel"
|
||||||
version = "0.1.2"
|
version = "0.2.0"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
linked_list_allocator = "0.9"
|
linked_list_allocator = "0.9"
|
||||||
log = "0.4.14"
|
log = "0.4.14"
|
||||||
slab = { version = "0.4", default-features = false }
|
slab = { version = "0.4", default-features = false }
|
||||||
spin = "0.9"
|
spin = "0.9"
|
||||||
|
versioning = { git = "https://git.ablecorp.us/able/aos_userland" }
|
||||||
|
tracing = { version = "0.1.37", default-features = false, features = ["attributes"] }
|
||||||
|
|
||||||
[dependencies.crossbeam-queue]
|
[dependencies.crossbeam-queue]
|
||||||
version = "0.3"
|
version = "0.3"
|
||||||
default-features = false
|
default-features = false
|
||||||
features = ["alloc"]
|
features = ["alloc"]
|
||||||
|
|
||||||
[dependencies.versioning]
|
[target.'cfg(target_arch = "x86_64")'.dependencies]
|
||||||
git = "https://git.ablecorp.us/able/aos_userland"
|
limine = "0.1"
|
||||||
|
uart_16550 = "0.2"
|
||||||
|
x86_64 = "0.14"
|
||||||
|
|
|
@ -2,8 +2,7 @@
|
||||||
OUTPUT_FORMAT(elf64-x86-64)
|
OUTPUT_FORMAT(elf64-x86-64)
|
||||||
OUTPUT_ARCH(i386:x86-64)
|
OUTPUT_ARCH(i386:x86-64)
|
||||||
|
|
||||||
/* We want the symbol `x86_64_start` to be our entry point */
|
ENTRY(_kernel_start)
|
||||||
ENTRY(x86_64_start)
|
|
||||||
|
|
||||||
/* Define the program headers we want so the bootloader gives us the right */
|
/* Define the program headers we want so the bootloader gives us the right */
|
||||||
/* MMU permissions */
|
/* MMU permissions */
|
|
@ -1,6 +1,5 @@
|
||||||
//! Memory allocator
|
//! Memory allocator
|
||||||
|
|
||||||
use linked_list_allocator::LockedHeap;
|
|
||||||
use log::trace;
|
use log::trace;
|
||||||
|
|
||||||
///
|
///
|
||||||
|
@ -15,10 +14,6 @@ pub const HEAP_BASE: usize = 100;
|
||||||
///
|
///
|
||||||
pub const HEAP_SIZE: usize = HEAP_BASE * HEAP_MULTIPLIER;
|
pub const HEAP_SIZE: usize = HEAP_BASE * HEAP_MULTIPLIER;
|
||||||
|
|
||||||
/// Global allocator
|
|
||||||
#[global_allocator]
|
|
||||||
pub static ALLOCATOR: LockedHeap = LockedHeap::empty();
|
|
||||||
|
|
||||||
#[alloc_error_handler]
|
#[alloc_error_handler]
|
||||||
fn alloc_error_handler(layout: alloc::alloc::Layout) -> ! {
|
fn alloc_error_handler(layout: alloc::alloc::Layout) -> ! {
|
||||||
trace!("allocation error: {:?}", layout);
|
trace!("allocation error: {:?}", layout);
|
||||||
|
|
|
@ -5,7 +5,7 @@ macro_rules! arch_cond {
|
||||||
#[cfg(target_arch = $str)]
|
#[cfg(target_arch = $str)]
|
||||||
pub mod $arch;
|
pub mod $arch;
|
||||||
#[cfg(target_arch = $str)]
|
#[cfg(target_arch = $str)]
|
||||||
pub use $arch::*;
|
pub use ::$arch::*;
|
||||||
)*};
|
)*};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
48
kernel/src/arch/x86_64/allocator.rs
Normal file
48
kernel/src/arch/x86_64/allocator.rs
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
use linked_list_allocator::LockedHeap;
|
||||||
|
use x86_64::{
|
||||||
|
structures::paging::{
|
||||||
|
mapper::MapToError, FrameAllocator, Mapper, Page, PageTableFlags, Size4KiB,
|
||||||
|
},
|
||||||
|
VirtAddr,
|
||||||
|
};
|
||||||
|
|
||||||
|
use crate::allocator::{HEAP_SIZE, HEAP_START};
|
||||||
|
|
||||||
|
#[global_allocator]
|
||||||
|
static ALLOCATOR: LockedHeap = LockedHeap::empty();
|
||||||
|
|
||||||
|
pub unsafe fn init_alloc() -> Result<(), MapToError<Size4KiB>> {
|
||||||
|
let page_range = {
|
||||||
|
let heap_start = VirtAddr::new(HEAP_START as u64);
|
||||||
|
let heap_end = heap_start + HEAP_SIZE - 1u64;
|
||||||
|
let heap_start_page = Page::containing_address(heap_start);
|
||||||
|
let heap_end_page = Page::containing_address(heap_end);
|
||||||
|
Page::range_inclusive(heap_start_page, heap_end_page)
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut frame_allocator = super::memory::FRAME_ALLOC
|
||||||
|
.get()
|
||||||
|
.expect("frame allocator is not initialised")
|
||||||
|
.lock();
|
||||||
|
|
||||||
|
let mut mapper = super::memory::PAGE_TABLE
|
||||||
|
.get()
|
||||||
|
.expect("page table is not initialised")
|
||||||
|
.lock();
|
||||||
|
|
||||||
|
for page in page_range {
|
||||||
|
let frame = frame_allocator
|
||||||
|
.allocate_frame()
|
||||||
|
.ok_or(MapToError::FrameAllocationFailed)?;
|
||||||
|
let flags = PageTableFlags::PRESENT | PageTableFlags::WRITABLE;
|
||||||
|
mapper
|
||||||
|
.map_to(page, frame, flags, &mut *frame_allocator)?
|
||||||
|
.flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
ALLOCATOR
|
||||||
|
.lock()
|
||||||
|
.init(crate::allocator::HEAP_START, crate::allocator::HEAP_SIZE);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
64
kernel/src/arch/x86_64/memory.rs
Normal file
64
kernel/src/arch/x86_64/memory.rs
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
use limine::{LimineMemmapEntry, LimineMemoryMapEntryType};
|
||||||
|
use spin::{Mutex, Once};
|
||||||
|
use x86_64::{
|
||||||
|
structures::paging::{FrameAllocator, FrameDeallocator, OffsetPageTable, PhysFrame, Size4KiB},
|
||||||
|
PhysAddr, VirtAddr,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub static PAGE_TABLE: Once<Mutex<OffsetPageTable>> = Once::new();
|
||||||
|
pub static FRAME_ALLOC: Once<Mutex<FrameAlloc>> = Once::new();
|
||||||
|
|
||||||
|
/// Initialise page table
|
||||||
|
pub unsafe fn init_pt(phys_base: VirtAddr) {
|
||||||
|
PAGE_TABLE.call_once(|| {
|
||||||
|
Mutex::new(OffsetPageTable::new(
|
||||||
|
&mut *((phys_base
|
||||||
|
+ x86_64::registers::control::Cr3::read()
|
||||||
|
.0
|
||||||
|
.start_address()
|
||||||
|
.as_u64())
|
||||||
|
.as_mut_ptr()),
|
||||||
|
phys_base,
|
||||||
|
))
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Initialise page frame allocator
|
||||||
|
pub unsafe fn init_falloc(mmap: &'static [LimineMemmapEntry]) {
|
||||||
|
FRAME_ALLOC.call_once(|| Mutex::new(FrameAlloc::new(mmap)));
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct FrameAlloc {
|
||||||
|
mmap: &'static [LimineMemmapEntry],
|
||||||
|
next: usize,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FrameAlloc {
|
||||||
|
pub unsafe fn new(mmap: &'static [LimineMemmapEntry]) -> Self {
|
||||||
|
Self { mmap, next: 0 }
|
||||||
|
}
|
||||||
|
|
||||||
|
fn usable_frames(&self) -> impl Iterator<Item = PhysFrame> {
|
||||||
|
self.mmap
|
||||||
|
.iter()
|
||||||
|
.filter(|e| e.typ == LimineMemoryMapEntryType::Usable)
|
||||||
|
.map(|e| e.base..e.base + e.len)
|
||||||
|
.flat_map(|r| r.step_by(4096))
|
||||||
|
.map(PhysAddr::new)
|
||||||
|
.map(PhysFrame::containing_address)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe impl FrameAllocator<Size4KiB> for FrameAlloc {
|
||||||
|
fn allocate_frame(&mut self) -> Option<PhysFrame<Size4KiB>> {
|
||||||
|
let f = self.usable_frames().nth(self.next);
|
||||||
|
self.next += 1;
|
||||||
|
f
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FrameDeallocator<Size4KiB> for FrameAlloc {
|
||||||
|
unsafe fn deallocate_frame(&mut self, frame: PhysFrame<Size4KiB>) {
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
}
|
|
@ -1 +1,39 @@
|
||||||
//!
|
use limine::{LimineHhdmRequest, LimineMmapRequest};
|
||||||
|
use x86_64::VirtAddr;
|
||||||
|
|
||||||
|
mod allocator;
|
||||||
|
mod memory;
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
unsafe extern "C" fn _kernel_start() -> ! {
|
||||||
|
static HDHM_REQ: LimineHhdmRequest = LimineHhdmRequest::new(0);
|
||||||
|
static MMAP_REQ: LimineMmapRequest = LimineMmapRequest::new(0);
|
||||||
|
|
||||||
|
memory::init_pt(VirtAddr::new(
|
||||||
|
HDHM_REQ
|
||||||
|
.get_response()
|
||||||
|
.get()
|
||||||
|
.expect("tried to get physical memory mapping offset from Limine")
|
||||||
|
.offset,
|
||||||
|
));
|
||||||
|
|
||||||
|
memory::init_falloc(
|
||||||
|
MMAP_REQ
|
||||||
|
.get_response()
|
||||||
|
.get()
|
||||||
|
.and_then(limine::LimineMemmapResponse::mmap)
|
||||||
|
.expect("tried to get memory map from Limine"),
|
||||||
|
);
|
||||||
|
|
||||||
|
allocator::init_alloc().expect("tried to initialise allocator");
|
||||||
|
|
||||||
|
unsafe {
|
||||||
|
use uart_16550::SerialPort;
|
||||||
|
use core::fmt::Write;
|
||||||
|
let mut sp = SerialPort::new(0x3F8);
|
||||||
|
sp.init();
|
||||||
|
sp.write_str("Hello from AbleOS x86_64 entrypoint!");
|
||||||
|
}
|
||||||
|
|
||||||
|
crate::kmain::kmain()
|
||||||
|
}
|
||||||
|
|
5
kernel/src/kmain.rs
Normal file
5
kernel/src/kmain.rs
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
//! AbleOS Kernel Entrypoint
|
||||||
|
|
||||||
|
pub fn kmain() -> ! {
|
||||||
|
loop {}
|
||||||
|
}
|
|
@ -2,12 +2,12 @@
|
||||||
|
|
||||||
#![feature(alloc_error_handler, prelude_import)]
|
#![feature(alloc_error_handler, prelude_import)]
|
||||||
#![no_std]
|
#![no_std]
|
||||||
#![deny(missing_docs)]
|
|
||||||
|
|
||||||
extern crate alloc;
|
extern crate alloc;
|
||||||
|
|
||||||
pub mod allocator;
|
pub mod allocator;
|
||||||
pub mod arch;
|
pub mod arch;
|
||||||
|
pub mod kmain;
|
||||||
pub mod task;
|
pub mod task;
|
||||||
|
|
||||||
use versioning::Version;
|
use versioning::Version;
|
||||||
|
@ -15,6 +15,11 @@ use versioning::Version;
|
||||||
/// Kernel's version
|
/// Kernel's version
|
||||||
pub const KERNEL_VERSION: Version = Version {
|
pub const KERNEL_VERSION: Version = Version {
|
||||||
major: 0,
|
major: 0,
|
||||||
minor: 1,
|
minor: 2,
|
||||||
patch: 2,
|
patch: 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#[panic_handler]
|
||||||
|
fn panic(info: &core::panic::PanicInfo) -> ! {
|
||||||
|
loop {}
|
||||||
|
}
|
||||||
|
|
4
kernel/src/main.rs
Normal file
4
kernel/src/main.rs
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
#![no_std]
|
||||||
|
#![no_main]
|
||||||
|
|
||||||
|
extern crate kernel;
|
22
kernel/targets/x86_64-ableos.json
Normal file
22
kernel/targets/x86_64-ableos.json
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
{
|
||||||
|
"llvm-target": "x86_64-unknown-none",
|
||||||
|
"data-layout": "e-m:e-i64:64-f80:128-n8:16:32:64-S128",
|
||||||
|
"arch": "x86_64",
|
||||||
|
"target-endian": "little",
|
||||||
|
"target-pointer-width": "64",
|
||||||
|
"target-c-int-width": "32",
|
||||||
|
"os": "none",
|
||||||
|
"executables": true,
|
||||||
|
"linker-flavor": "ld.lld",
|
||||||
|
"linker": "rust-lld",
|
||||||
|
"panic-strategy": "abort",
|
||||||
|
"disable-redzone": true,
|
||||||
|
"features": "-mmx,-sse,+soft-float",
|
||||||
|
"code-model": "kernel",
|
||||||
|
"pre-link-args": {
|
||||||
|
"ld.lld": [
|
||||||
|
"--gc-sections",
|
||||||
|
"--script=kernel/lds/x86_64.ld"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
|
@ -76,7 +76,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
// Build ableOS in release mode
|
// Build ableOS in release mode
|
||||||
Command::new("cargo")
|
Command::new("cargo")
|
||||||
.args(["build", "--release"])
|
.args(["build", "--release"])
|
||||||
.current_dir(fs::canonicalize("./ableos").unwrap())
|
.current_dir(fs::canonicalize("./kernel").unwrap())
|
||||||
.status()
|
.status()
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
|
@ -167,7 +167,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
|
|
||||||
// copy the kernel over to ./disk/boot/kernel
|
// copy the kernel over to ./disk/boot/kernel
|
||||||
Command::new("cp")
|
Command::new("cp")
|
||||||
.arg("./target/x86_64-ableos/release/ableos")
|
.arg("./target/x86_64-ableos/release/kernel")
|
||||||
.arg(&format!("{mountpoint}/boot/kernel"))
|
.arg(&format!("{mountpoint}/boot/kernel"))
|
||||||
.status()?;
|
.status()?;
|
||||||
|
|
||||||
|
@ -254,7 +254,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
// Build ableOS
|
// Build ableOS
|
||||||
Command::new("cargo")
|
Command::new("cargo")
|
||||||
.arg("build")
|
.arg("build")
|
||||||
.current_dir(fs::canonicalize("./ableos").unwrap())
|
.current_dir(fs::canonicalize("./kernel").unwrap())
|
||||||
.status()
|
.status()
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
|
@ -294,7 +294,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
|
|
||||||
// copy the kernel over to ./disk/boot/kernel
|
// copy the kernel over to ./disk/boot/kernel
|
||||||
Command::new("cp")
|
Command::new("cp")
|
||||||
.arg("./target/x86_64-ableos/debug/ableos")
|
.arg("./target/x86_64-ableos/debug/kernel")
|
||||||
.arg(format!("{mountpoint}/boot/kernel"))
|
.arg(format!("{mountpoint}/boot/kernel"))
|
||||||
.status()
|
.status()
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
@ -333,7 +333,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
// Build ableOS
|
// Build ableOS
|
||||||
Command::new("cargo")
|
Command::new("cargo")
|
||||||
.args(["build", "--release"])
|
.args(["build", "--release"])
|
||||||
.current_dir(fs::canonicalize("./ableos").unwrap())
|
.current_dir(fs::canonicalize("./kernel").unwrap())
|
||||||
.status()
|
.status()
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
|
@ -372,7 +372,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
|
|
||||||
// copy the kernel over to ./disk/boot/kernel
|
// copy the kernel over to ./disk/boot/kernel
|
||||||
Command::new("cp")
|
Command::new("cp")
|
||||||
.arg("./target/x86_64-ableos/release/ableos")
|
.arg("./target/x86_64-ableos/release/kernel")
|
||||||
.arg(format!("{mountpoint}/boot/kernel"))
|
.arg(format!("{mountpoint}/boot/kernel"))
|
||||||
.status()
|
.status()
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
Loading…
Reference in a new issue