hello world
This commit is contained in:
commit
0a34a214c1
7
kernel/Cargo.lock
generated
Normal file
7
kernel/Cargo.lock
generated
Normal file
@ -0,0 +1,7 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 4
|
||||
|
||||
[[package]]
|
||||
name = "kernel"
|
||||
version = "0.1.0"
|
6
kernel/Cargo.toml
Normal file
6
kernel/Cargo.toml
Normal file
@ -0,0 +1,6 @@
|
||||
[package]
|
||||
name = "kernel"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
[dependencies]
|
33
kernel/src/main.rs
Normal file
33
kernel/src/main.rs
Normal file
@ -0,0 +1,33 @@
|
||||
#![no_std]
|
||||
#![no_main]
|
||||
|
||||
#![feature(lang_items)]
|
||||
|
||||
#[lang = "eh_personality"]
|
||||
extern "C" fn eh_personality() {}
|
||||
|
||||
use core::panic::PanicInfo;
|
||||
use core::sync::atomic;
|
||||
use core::sync::atomic::Ordering;
|
||||
|
||||
|
||||
#[inline(never)]
|
||||
#[panic_handler]
|
||||
fn panic(_info: &PanicInfo) -> ! {
|
||||
loop {
|
||||
atomic::compiler_fence(Ordering::SeqCst);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
mod terminal;
|
||||
|
||||
use terminal::{fill, put_string, VgaColor};
|
||||
|
||||
#[no_mangle]
|
||||
fn main() -> ! {
|
||||
fill(' ', VgaColor::BLACK, VgaColor::BLACK);
|
||||
put_string(0, 0, "Hello World from MxRox!", VgaColor::BLACK, VgaColor::WHITE);
|
||||
|
||||
loop {}
|
||||
}
|
49
kernel/src/terminal.rs
Normal file
49
kernel/src/terminal.rs
Normal file
@ -0,0 +1,49 @@
|
||||
pub const TERMINAL_BUFFER: *mut u16 = 0xB8000 as *mut u16;
|
||||
pub const TERMINAL_WIDTH: usize = 80;
|
||||
pub const TERMINAL_HEIGHT: usize = 25;
|
||||
|
||||
pub struct VgaColor(u8);
|
||||
|
||||
impl VgaColor {
|
||||
pub const BLACK: u8 = 0;
|
||||
pub const BLUE: u8 = 1;
|
||||
pub const GREEN: u8 = 2;
|
||||
pub const CYAN: u8 = 3;
|
||||
pub const RED: u8 = 4;
|
||||
pub const MAGENTA: u8 = 5;
|
||||
pub const BROWN: u8 = 6;
|
||||
pub const LIGHT_GREY: u8 = 7;
|
||||
pub const DARK_GREY: u8 = 8;
|
||||
pub const LIGHT_BLUE: u8 = 9;
|
||||
pub const LIGHT_GREEN: u8 = 10;
|
||||
pub const LIGHT_CYAN: u8 = 11;
|
||||
pub const LIGHT_RED: u8 = 12;
|
||||
pub const LIGHT_MAGENTA: u8 = 13;
|
||||
pub const LIGHT_BROWN: u8 = 14;
|
||||
pub const WHITE: u8 = 15;
|
||||
}
|
||||
|
||||
pub fn put_char(x: usize, y: usize, c: char, bg: u8, fg: u8) {
|
||||
let c16 = c as u16;
|
||||
let color = fg | bg << 4;
|
||||
let color16 = color as u16;
|
||||
let index = y * TERMINAL_WIDTH + x;
|
||||
|
||||
unsafe {
|
||||
*TERMINAL_BUFFER.add(index) = c16 | (color16 << 8)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn put_string(x: usize, y: usize, text: &str, bg: u8, fg: u8) {
|
||||
for (i, c) in text.char_indices() {
|
||||
put_char(x+i, y, c, bg, fg);
|
||||
}
|
||||
}
|
||||
|
||||
pub fn fill(c: char, bg: u8, fg: u8) {
|
||||
for x in 0..TERMINAL_WIDTH {
|
||||
for y in 0..TERMINAL_HEIGHT {
|
||||
put_char(x, y, c, bg, fg);
|
||||
}
|
||||
}
|
||||
}
|
16
kernel/x86-unknown-bare_metal.json
Normal file
16
kernel/x86-unknown-bare_metal.json
Normal file
@ -0,0 +1,16 @@
|
||||
{
|
||||
"llvm-target": "i686-unknown-none",
|
||||
"data-layout": "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-i128:128-f64:32:64-f80:32-n8:16:32-S128",
|
||||
"arch": "x86",
|
||||
"target-endian": "little",
|
||||
"target-pointer-width": "32",
|
||||
"target-c-int-width": "32",
|
||||
"os": "none",
|
||||
"executables": true,
|
||||
"linker-flavor": "ld.lld",
|
||||
"linker": "rust-lld",
|
||||
"panic-strategy": "abort",
|
||||
"disable-redzone": true,
|
||||
"features": "+soft-float,-sse"
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user