feat: add pmm, add vmm, add allocator, create memory management foundation
This commit is contained in:
53
kernel/src/debug/serial.rs
Normal file
53
kernel/src/debug/serial.rs
Normal file
@@ -0,0 +1,53 @@
|
||||
use core::arch::asm;
|
||||
|
||||
pub struct SerialPort(u16);
|
||||
|
||||
impl SerialPort {
|
||||
pub const COM1: u16 = 0x3F8;
|
||||
|
||||
pub unsafe fn init() -> Self {
|
||||
let port = Self::COM1;
|
||||
// В новых версиях Rust даже внутри unsafe fn
|
||||
// вызовы других unsafe функций требуют явного блока
|
||||
unsafe {
|
||||
outb(port + 1, 0x00); // Disable interrupts
|
||||
outb(port + 3, 0x80); // Enable DLAB
|
||||
outb(port + 0, 0x03); // Divisor 3 (38400 baud)
|
||||
outb(port + 1, 0x00);
|
||||
outb(port + 3, 0x03); // 8 bits, no parity, 1 stop bit
|
||||
outb(port + 2, 0xC7); // Enable FIFO
|
||||
outb(port + 4, 0x0B); // IRQs enabled, RTS/DSR set
|
||||
}
|
||||
SerialPort(port)
|
||||
}
|
||||
|
||||
fn is_transmit_empty(&self) -> bool {
|
||||
unsafe { (inb(self.0 + 5) & 0x20) != 0 }
|
||||
}
|
||||
|
||||
pub fn send(&self, data: u8) {
|
||||
while !self.is_transmit_empty() {}
|
||||
unsafe { outb(self.0, data); }
|
||||
}
|
||||
}
|
||||
|
||||
impl core::fmt::Write for SerialPort {
|
||||
fn write_str(&mut self, s: &str) -> core::fmt::Result {
|
||||
for byte in s.bytes() { self.send(byte); }
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
unsafe fn outb(port: u16, val: u8) {
|
||||
unsafe {
|
||||
asm!("out dx, al", in("dx") port, in("al") val, options(nomem, nostack, preserves_flags));
|
||||
}
|
||||
}
|
||||
|
||||
unsafe fn inb(port: u16) -> u8 {
|
||||
let res: u8;
|
||||
unsafe {
|
||||
asm!("in al, dx", out("al") res, in("dx") port, options(nomem, nostack, preserves_flags));
|
||||
}
|
||||
res
|
||||
}
|
||||
Reference in New Issue
Block a user