Skip to content

Commit 0161efd

Browse files
committed
Clear screen before passing control to kernel
1 parent 7c0b64e commit 0161efd

File tree

2 files changed

+46
-31
lines changed

2 files changed

+46
-31
lines changed

src/main.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ pub extern "C" fn load_elf(kernel_start: PhysAddr, kernel_size: u64,
100100
enable_write_protect_bit();
101101

102102
let entry_point = VirtAddr::new(elf_file.header.pt2.entry_point());
103+
printer::PRINTER.lock().clear_screen();
103104
unsafe { context_switch(p4_addr, entry_point, stack_end, boot_info_addr) };
104105
}
105106

src/printer.rs

Lines changed: 45 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,45 @@
1-
use core::fmt::{Write, Result};
2-
use core::slice;
3-
use spin::Mutex;
4-
5-
pub static PRINTER: Mutex<Printer> = Mutex::new(Printer::new());
6-
7-
pub struct Printer {
8-
index: usize,
9-
}
10-
11-
impl Printer {
12-
pub const fn new() -> Printer {
13-
Printer {
14-
index: 0,
15-
}
16-
}
17-
}
18-
19-
impl Write for Printer {
20-
fn write_str(&mut self, s: &str) -> Result {
21-
const VGA_BUFFER: *mut u8 = 0xb8000 as *mut _;
22-
let vga_buffer = unsafe { slice::from_raw_parts_mut(VGA_BUFFER, 80 * 25 * 2) };
23-
for byte in s.bytes() {
24-
vga_buffer[self.index] = byte;
25-
vga_buffer[self.index + 1] = 0x4f;
26-
self.index += 2;
27-
}
28-
29-
Ok(())
30-
}
31-
}
1+
use core::fmt::{Write, Result};
2+
use core::slice;
3+
use spin::Mutex;
4+
5+
const VGA_BUFFER: *mut u8 = 0xb8000 as *mut _;
6+
const SCREEN_SIZE: usize = 80 * 25;
7+
8+
pub static PRINTER: Mutex<Printer> = Mutex::new(Printer::new());
9+
10+
pub struct Printer {
11+
index: usize,
12+
}
13+
14+
impl Printer {
15+
pub const fn new() -> Printer {
16+
Printer {
17+
index: 0,
18+
}
19+
}
20+
21+
pub fn clear_screen(&mut self) {
22+
let vga_buffer = Self::vga_buffer();
23+
for byte in vga_buffer {
24+
*byte = 0;
25+
}
26+
self.index = 0;
27+
}
28+
29+
fn vga_buffer() -> &'static mut [u8] {
30+
unsafe { slice::from_raw_parts_mut(VGA_BUFFER, SCREEN_SIZE * 2) }
31+
}
32+
}
33+
34+
impl Write for Printer {
35+
fn write_str(&mut self, s: &str) -> Result {
36+
let vga_buffer = Self::vga_buffer();
37+
for byte in s.bytes() {
38+
vga_buffer[self.index] = byte;
39+
vga_buffer[self.index + 1] = 0x4f;
40+
self.index += 2;
41+
}
42+
43+
Ok(())
44+
}
45+
}

0 commit comments

Comments
 (0)