Compare commits

...

2 Commits

16 changed files with 272 additions and 120 deletions

View File

@ -152,7 +152,9 @@ bool tty_is_enabled(tty *ttyx);
bool tty_enable(tty *ttyx); bool tty_enable(tty *ttyx);
void tty_disable(tty *ttyx); void tty_disable(tty *ttyx);
#define TTY_FONT_SCALE 2 #ifndef TTY_FONT_SCALE
#define TTY_FONT_SCALE 1
#endif
typedef struct __tty_font_t typedef struct __tty_font_t
{ {

View File

@ -27,6 +27,9 @@ DEFINES = ARCH="${ARCH}" ASM="${ASM}" ASMFLAGS="${ASMFLAGS}" SOURCE="${SOURCE}"
ifdef release ifdef release
DEFINES := ${DEFINES} release=1 DEFINES := ${DEFINES} release=1
endif endif
ifdef ttyfont_scale
DEFINES := ${DEFINES} ttyfont_scale=${ttyfont_scale}
endif
################################ ################################
# rust语言环境变量 # rust语言环境变量

View File

@ -12,6 +12,9 @@ CCFLAGS = -m64 -mcmodel=large -I ../../include \
ifdef release ifdef release
CCFLAGS := ${CCFLAGS} -O2 CCFLAGS := ${CCFLAGS} -O2
endif endif
ifdef ttyfont_scale
CCFLAGS := ${CCFLAGS} -DTTY_FONT_SCALE=${ttyfont_scale}
endif
C_SRCS = main.c tty.c font.c memm.c memm_${ARCH}.c raw.c time.c syscall_${ARCH}.c interrupt_${ARCH}.c C_SRCS = main.c tty.c font.c memm.c memm_${ARCH}.c raw.c time.c syscall_${ARCH}.c interrupt_${ARCH}.c
C_OBJS = ${C_SRCS:.c=.c.o} C_OBJS = ${C_SRCS:.c=.c.o}

View File

@ -1,4 +1,12 @@
use crate::{kernel::tty::tty::Tty, message}; use crate::{
kernel::{
memm::utils::AddressUtils,
tty::tty::{Color, FmtMeta, Tty},
},
message,
};
use super::proc::RegisterTexture;
extern "C" { extern "C" {
pub fn interrupt_open(); pub fn interrupt_open();
@ -9,7 +17,7 @@ extern "C" {
} }
#[no_mangle] #[no_mangle]
unsafe extern "C" fn interrupt_req_UNSUPPORTED(rip: u64, rsp: u64, errcode: u64) -> ! { unsafe extern "C" fn interrupt_req_UNSUPPORTED(rip: u64, rsp: u64, _errcode: u64) -> ! {
interrupt_rust_enter(); interrupt_rust_enter();
let tty = Tty::from_id(0).unwrap(); let tty = Tty::from_id(0).unwrap();
tty.enable(); tty.enable();
@ -24,8 +32,9 @@ unsafe extern "C" fn interrupt_req_UNSUPPORTED(rip: u64, rsp: u64, errcode: u64)
} }
#[no_mangle] #[no_mangle]
unsafe extern "C" fn interrupt_req_DE(rip: u64, rsp: u64, errcode: u64) { unsafe extern "C" fn interrupt_req_DE(rip: u64, rsp: u64, _errcode: u64) {
interrupt_rust_enter(); interrupt_rust_enter();
if rip.is_kernel_space() {
let tty = Tty::from_id(0).unwrap(); let tty = Tty::from_id(0).unwrap();
tty.enable(); tty.enable();
tty.print(message!( tty.print(message!(
@ -35,14 +44,108 @@ unsafe extern "C" fn interrupt_req_DE(rip: u64, rsp: u64, errcode: u64) {
FmtMeta::Pointer(rip as usize), FmtMeta::Pointer(rip as usize),
FmtMeta::Pointer(rsp as usize) FmtMeta::Pointer(rsp as usize)
)); ));
loop {}
} else if rip.is_user_space() {
// TODO 处理后返回
interrupt_rust_leave(); interrupt_rust_leave();
} }
}
// #[no_mangle]
// unsafe extern "C" fn interrupt_req_NMI(rip: u64, rsp: u64, errcode: u64) {}
#[no_mangle]
unsafe extern "C" fn interrupt_req_BP(rip: u64, rsp: u64, errcode: u64) {
interrupt_rust_enter();
if rip.is_kernel_space() {
let register_texture = errcode as *const RegisterTexture;
let register_texture = &*register_texture;
let tty = Tty::from_id(0).unwrap();
tty.enable();
tty.print(message!(
"{Debug}: Kernel hit breakpoint {0x{}}.\n",
FmtMeta::Color(Color::BLUE),
FmtMeta::Pointer(rip as usize),
FmtMeta::Color(Color::GREEN)
));
tty.print(message!(
"\trax\t{}\n",
FmtMeta::Pointer(register_texture.rax as usize)
));
tty.print(message!(
"\trbx\t{}\n",
FmtMeta::Pointer(register_texture.rbx as usize)
));
tty.print(message!(
"\trcx\t{}\n",
FmtMeta::Pointer(register_texture.rcx as usize)
));
tty.print(message!(
"\trdx\t{}\n",
FmtMeta::Pointer(register_texture.rdx as usize)
));
tty.print(message!(
"\trsi\t{}\n",
FmtMeta::Pointer(register_texture.rsi as usize)
));
tty.print(message!(
"\trdi\t{}\n",
FmtMeta::Pointer(register_texture.rdi as usize)
));
tty.print(message!(
"\trbp\t{}\n",
FmtMeta::Pointer(register_texture.rbp as usize)
));
tty.print(message!(
"\trsp\t{}\n",
FmtMeta::Pointer(register_texture.rsp as usize)
));
tty.print(message!(
"\tr8\t{}\n",
FmtMeta::Pointer(register_texture.r8 as usize)
));
tty.print(message!(
"\tr9\t{}\n",
FmtMeta::Pointer(register_texture.r9 as usize)
));
tty.print(message!(
"\tr10\t{}\n",
FmtMeta::Pointer(register_texture.r10 as usize)
));
tty.print(message!(
"\tr11\t{}\n",
FmtMeta::Pointer(register_texture.r11 as usize)
));
tty.print(message!(
"\tr12\t{}\n",
FmtMeta::Pointer(register_texture.r12 as usize)
));
tty.print(message!(
"\tr13\t{}\n",
FmtMeta::Pointer(register_texture.r13 as usize)
));
tty.print(message!(
"\tr14\t{}\n",
FmtMeta::Pointer(register_texture.r14 as usize)
));
tty.print(message!(
"\tr15\t{}\n",
FmtMeta::Pointer(register_texture.r15 as usize)
));
tty.print(message!(
"\trip\t{}\n",
FmtMeta::Pointer(register_texture.rip as usize)
));
tty.print(message!(
"\trflags\t{}\n",
FmtMeta::Pointer(register_texture.rflags as usize)
));
loop {}
} else if rip.is_user_space() {
// TODO 处理后返回
interrupt_rust_leave();
}
}
#[no_mangle]
unsafe extern "C" fn interrupt_req_NMI(rip: u64, rsp: u64, errcode: u64) {}
#[no_mangle]
unsafe extern "C" fn interrupt_req_BP(rip: u64, rsp: u64, errcode: u64) {}
#[no_mangle] #[no_mangle]
unsafe extern "C" fn interrupt_req_OF(rip: u64, rsp: u64, errcode: u64) {} unsafe extern "C" fn interrupt_req_OF(rip: u64, rsp: u64, errcode: u64) {}

View File

@ -6,6 +6,8 @@
void interrupt_init() void interrupt_init()
{ {
gate_descriptor_t gate; gate_descriptor_t gate;
// 用UNSUPPORTED中断处理程序填充所有中断向量
trap_gate_generate(gate, interrupt_entry_sym(UNSUPPORTED)); trap_gate_generate(gate, interrupt_entry_sym(UNSUPPORTED));
for (usize i = 4; i < 256; i++) for (usize i = 4; i < 256; i++)
{ {
@ -14,7 +16,7 @@ void interrupt_init()
trap_gate_generate(gate, interrupt_entry_sym(DE)); trap_gate_generate(gate, interrupt_entry_sym(DE));
interrupt_register_gate(gate, 0); interrupt_register_gate(gate, 0);
trap_gate_generate(gate, interrupt_entry_sym(UNSUPPORTED)); trap_gate_generate(gate, interrupt_entry_sym(UNSUPPORTED)); // Debug Exception (#DB)
interrupt_register_gate(gate, 1); interrupt_register_gate(gate, 1);
trap_gate_generate(gate, interrupt_entry_sym(NMI)); trap_gate_generate(gate, interrupt_entry_sym(NMI));
interrupt_register_gate(gate, 2); interrupt_register_gate(gate, 2);

View File

@ -1,32 +1,30 @@
#[repr(C)] #[repr(C)]
#[derive(Debug)]
pub struct RegisterTexture { pub struct RegisterTexture {
es: u16, pub es: u16,
ds: u16, pub ds: u16,
reserved: u32, pub reserved: u32,
r15: u64, pub r15: u64,
r14: u64, pub r14: u64,
r13: u64, pub r13: u64,
r12: u64, pub r12: u64,
r11: u64, pub r11: u64,
r10: u64, pub r10: u64,
r9: u64, pub r9: u64,
r8: u64, pub r8: u64,
rdi: u64, pub rdi: u64,
rsi: u64, pub rsi: u64,
rdx: u64, pub rdx: u64,
rbx: u64, pub rbx: u64,
rcx: u64, pub rcx: u64,
rax: u64, pub rax: u64,
rbp: u64, pub rbp: u64,
rip: u64, pub rip: u64,
cs: u64, pub cs: u64,
rflags: u64, pub rflags: u64,
rsp: u64, pub rsp: u64,
ss: u64, pub ss: u64,
} }
#[derive(Debug)]
pub struct ProcessTexture { pub struct ProcessTexture {
register: RegisterTexture, register: RegisterTexture,
} }

View File

@ -48,11 +48,11 @@ void kmain(void *mb2_bootinfo)
// 初始化中断管理 // 初始化中断管理
interrupt_init(); interrupt_init();
int i = 1 / 0;
// 初始化系统调用 // 初始化系统调用
syscall_init(); syscall_init();
asm("int3");
// 为rust准备正确对齐的栈 // 为rust准备正确对齐的栈
prepare_stack(); prepare_stack();

View File

@ -81,12 +81,4 @@ void raw_allocator_free(raw_allocator_t *allocator, void *mem)
cell = raw_allocator_next_cell(cell); cell = raw_allocator_next_cell(cell);
} }
allocator->rest_memory += cell->capacity + sizeof(raw_allocator_cell); allocator->rest_memory += cell->capacity + sizeof(raw_allocator_cell);
allocator->free_count++;
if ( // 可用内存不超过当前allocator的 5% 或调用free次数很多时
allocator->size / allocator->rest_memory > 20 ||
allocator->free_count > RAW_ALLOCATOR_FREE_MAX)
{
raw_allocator_cellmerge(allocator);
allocator->free_count = 0;
}
} }

View File

@ -1 +1,2 @@
pub mod memm; pub mod memm;
pub mod utils;

24
src/kernel/memm/utils.rs Normal file
View File

@ -0,0 +1,24 @@
mod x86_64 {
pub trait AddressUtils {
fn is_cannonical(self) -> bool;
fn is_user_space(self) -> bool;
fn is_kernel_space(self) -> bool;
}
impl AddressUtils for u64 {
fn is_cannonical(self) -> bool {
self < 0x0000_8000_0000_0000 || self > 0xffff_7fff_ffff_ffff
}
fn is_user_space(self) -> bool {
self > 0xffff_7fff_ffff_ffff
}
fn is_kernel_space(self) -> bool {
self.is_cannonical() && !self.is_user_space()
}
}
}
#[cfg(target_arch = "x86_64")]
pub use x86_64::*;

View File

@ -12,17 +12,12 @@ macro_rules! message {
use crate::{ use crate::{
kernel::tty::tty::{ kernel::tty::tty::{
MessageBuilder, MessageBuilder,
FmtMeta,
Color,
format_message format_message
}, },
libk::alloc::vec::Vec, libk::alloc::{string::ToString, vec::Vec},
}; };
let mut formatter = $fmtter.chars().collect::<Vec<char>>(); let mut formatter = Vec::from_iter($fmtter.to_string().chars());
let builder = MessageBuilder::new(); let builder = MessageBuilder::new();
$( builder$(.append(format_message(&mut formatter, $e)))*.build()
let builder = builder.append(format_message(&mut formatter, $e));
)*
builder.build()
}}; }};
} }

View File

@ -119,23 +119,18 @@ impl Tty {
pub fn print(&self, msg: Message) { pub fn print(&self, msg: Message) {
for MessageSection { for MessageSection {
mut msg, msg,
fgcolor, fgcolor,
bgcolor, bgcolor,
} in msg.0.into_iter() } in msg.0.into_iter()
{ {
unsafe { unsafe {
let string = msg.as_bytes_mut() as *mut [u8] as *mut u8;
let string = string.offset(msg.len() as isize);
let swp = *string;
*string = 0;
tty_text_print( tty_text_print(
self.tty_pointer, self.tty_pointer,
msg.as_bytes_mut() as *mut [u8] as *mut u8, msg.to_cstr().get_pointer(),
u32::from(fgcolor), u32::from(fgcolor),
u32::from(bgcolor), u32::from(bgcolor),
); );
*string = swp;
}; };
} }
} }
@ -337,6 +332,7 @@ pub fn format_message(fmt: &mut Vec<char>, meta: FmtMeta) -> MessageBuilder {
}; };
if fmt_start == None || fmt_end == None { if fmt_start == None || fmt_end == None {
msgbuilder.message_mut(&String::from_iter(fmt.iter())); msgbuilder.message_mut(&String::from_iter(fmt.iter()));
msgbuilder
} else { } else {
let fmt_start = fmt_start.unwrap(); let fmt_start = fmt_start.unwrap();
let fmt_end = fmt_end.unwrap(); let fmt_end = fmt_end.unwrap();
@ -377,7 +373,6 @@ pub fn format_message(fmt: &mut Vec<char>, meta: FmtMeta) -> MessageBuilder {
} }
} }
} }
}
let mut rests = Vec::new(); let mut rests = Vec::new();
while !fmt.is_empty() && fmt[0] != '{' { while !fmt.is_empty() && fmt[0] != '{' {
rests.push(fmt.remove(0)); rests.push(fmt.remove(0));
@ -385,3 +380,4 @@ pub fn format_message(fmt: &mut Vec<char>, meta: FmtMeta) -> MessageBuilder {
msgbuilder.message_mut(&String::from_iter(rests.iter())); msgbuilder.message_mut(&String::from_iter(rests.iter()));
msgbuilder msgbuilder
} }
}

View File

@ -1,6 +1,7 @@
#![no_std] #![no_std]
#![feature(strict_provenance)] #![feature(strict_provenance)]
#![feature(layout_for_ptr)] #![feature(layout_for_ptr)]
#![feature(alloc_layout_extra)]
extern crate alloc; extern crate alloc;
@ -8,6 +9,8 @@ use core::panic::PanicInfo;
use kernel::tty::tty::Tty; use kernel::tty::tty::Tty;
use crate::kernel::tty::tty::{Color, FmtMeta};
pub mod kernel; pub mod kernel;
pub mod libk; pub mod libk;

View File

@ -24,18 +24,21 @@ impl String {
self.data.iter() self.data.iter()
} }
pub fn as_bytes(&self) -> &[u8] {
&self.u8data[..]
}
pub unsafe fn as_bytes_mut(&mut self) -> &mut [u8] {
&mut self.u8data[..]
}
pub fn insert(&mut self, index: usize, item: char) { pub fn insert(&mut self, index: usize, item: char) {
self.data.insert(index, item); self.data.insert(index, item);
self.u8data.insert(index, item as u8); self.u8data.insert(index, item as u8);
} }
pub fn remove(&mut self, index: usize) -> char {
self.u8data.remove(index);
self.data.remove(index)
}
pub unsafe fn to_cstr(&self) -> Vec<u8> {
let mut res = self.u8data.clone();
res.push(0);
res
}
} }
impl FromIterator<char> for String { impl FromIterator<char> for String {
@ -63,15 +66,17 @@ impl ToString for String {
impl Add for String { impl Add for String {
type Output = Self; type Output = Self;
fn add(mut self, rhs: Self) -> Self::Output { fn add(mut self, mut rhs: Self) -> Self::Output {
self.data.append(&mut rhs.chars().map(|c| *c).collect()); self.data.append(&mut rhs.data);
self.u8data.append(&mut rhs.u8data);
self self
} }
} }
impl AddAssign for String { impl AddAssign for String {
fn add_assign(&mut self, rhs: String) { fn add_assign(&mut self, mut rhs: String) {
*self = self.clone() + rhs; self.data.append(&mut rhs.data);
self.u8data.append(&mut rhs.u8data);
} }
} }

View File

@ -1,5 +1,6 @@
use core::{ use core::{
alloc::Layout, alloc::Layout,
mem::size_of,
ops::{Index, IndexMut, Range, RangeFull}, ops::{Index, IndexMut, Range, RangeFull},
ptr::addr_of_mut, ptr::addr_of_mut,
slice, slice,
@ -19,18 +20,24 @@ pub struct Vec<T> {
impl<T: Default> Vec<T> { impl<T: Default> Vec<T> {
pub fn new() -> Self { pub fn new() -> Self {
Self { Self {
pointer: unsafe { alloc(Layout::array::<T>(4).unwrap()).cast() }, pointer: unsafe {
alloc(Layout::from_size_align_unchecked(4 * size_of::<T>(), 1)).cast()
},
length: 0, length: 0,
capacity: 4, capacity: 4,
} }
} }
unsafe fn extend_capacity(&mut self) { unsafe fn extend_capacity(&mut self) {
let newp: *mut T = alloc(Layout::array::<T>(self.capacity * 2).unwrap()).cast(); let newp: *mut T = alloc(Layout::from_size_align_unchecked(
self.capacity * 2 * size_of::<T>(),
1,
))
.cast();
self.pointer.kcopy_to(newp, self.length); self.pointer.kcopy_to(newp, self.length);
dealloc( dealloc(
self.pointer.cast(), self.pointer.cast(),
Layout::array::<T>(self.capacity).unwrap(), Layout::from_size_align_unchecked(self.capacity * size_of::<T>(), 1),
); );
self.pointer = newp; self.pointer = newp;
self.capacity *= 2; self.capacity *= 2;
@ -51,7 +58,11 @@ impl<T: Default> Vec<T> {
let rearlen = self.length - index; let rearlen = self.length - index;
unsafe { unsafe {
if rearlen != 0 { if rearlen != 0 {
let tmp = alloc(Layout::array::<T>(rearlen).unwrap()).cast(); let tmp = alloc(Layout::from_size_align_unchecked(
rearlen * size_of::<T>(),
1,
))
.cast();
self.pointer.offset(index as isize).kcopy_to(tmp, rearlen); self.pointer.offset(index as isize).kcopy_to(tmp, rearlen);
self.pointer.offset(index as isize).write(item); self.pointer.offset(index as isize).write(item);
self.pointer self.pointer
@ -116,7 +127,7 @@ impl<T: Default> Vec<T> {
t t
} }
pub fn iter(&self) -> VecIterator<T> { pub fn iter<'a, 'b: 'a>(&'a self) -> VecIterator<'b, T> {
VecIterator { VecIterator {
pointer: self.pointer, pointer: self.pointer,
index: 0, index: 0,
@ -124,6 +135,10 @@ impl<T: Default> Vec<T> {
_phantom: &(), _phantom: &(),
} }
} }
pub unsafe fn get_pointer(&self) -> *mut T {
self.pointer
}
} }
impl<T: Default> Default for Vec<T> { impl<T: Default> Default for Vec<T> {
@ -165,7 +180,13 @@ impl<T: Default> IndexMut<RangeFull> for Vec<T> {
impl<T: Default> Clone for Vec<T> { impl<T: Default> Clone for Vec<T> {
fn clone(&self) -> Self { fn clone(&self) -> Self {
let res = Self { let res = Self {
pointer: unsafe { alloc(Layout::array::<T>(self.capacity).unwrap()).cast() }, pointer: unsafe {
alloc(Layout::from_size_align_unchecked(
self.capacity * size_of::<T>(),
1,
))
.cast()
},
length: self.length, length: self.length,
capacity: self.capacity, capacity: self.capacity,
}; };
@ -182,7 +203,7 @@ impl<T> Drop for Vec<T> {
unsafe { unsafe {
dealloc( dealloc(
self.pointer.cast(), self.pointer.cast(),
Layout::array::<T>(self.capacity).unwrap(), Layout::from_size_align_unchecked(self.capacity * size_of::<T>(), 1),
) )
}; };
} }
@ -198,17 +219,33 @@ impl<T: Default> FromIterator<T> for Vec<T> {
} }
} }
impl<'a> FromIterator<&'a char> for Vec<char> {
fn from_iter<U: IntoIterator<Item = &'a char>>(iter: U) -> Self {
let mut res = Vec::new();
for i in iter {
res.push(*i);
}
res
}
}
impl<T: Default> IntoIterator for Vec<T> { impl<T: Default> IntoIterator for Vec<T> {
type Item = T; type Item = T;
type IntoIter = VecIter<T>; type IntoIter = VecIter<T>;
fn into_iter(self) -> Self::IntoIter { fn into_iter(self) -> Self::IntoIter {
/*let pointer = unsafe {
let pointer = alloc(Layout::from_size_align_unchecked(
self.capacity * size_of::<T>(),
1,
));
pointer.copy_from(self.pointer.cast(), self.length);
pointer.cast()
};*/
VecIter { VecIter {
pointer: self.pointer, vec: self,
index: 0, index: 0,
length: self.length,
capacity: self.capacity,
} }
} }
} }
@ -246,22 +283,21 @@ impl<'a, T: 'a> DoubleEndedIterator for VecIterator<'a, T> {
} }
pub struct VecIter<T> { pub struct VecIter<T> {
pointer: *mut T, vec: Vec<T>,
index: usize, index: usize,
length: usize,
capacity: usize,
} }
impl<T: Default> Iterator for VecIter<T> { impl<T: Default> Iterator for VecIter<T> {
type Item = T; type Item = T;
fn next(&mut self) -> Option<Self::Item> { fn next(&mut self) -> Option<Self::Item> {
if self.index == self.length { if self.index == self.vec.length {
None None
} else { } else {
let mut t = T::default(); let mut t = T::default();
let res = unsafe { let res = unsafe {
self.pointer self.vec
.pointer
.offset(self.index as isize) .offset(self.index as isize)
.kcopy_to(addr_of_mut!(t), 1); .kcopy_to(addr_of_mut!(t), 1);
Some(t) Some(t)
@ -271,14 +307,3 @@ impl<T: Default> Iterator for VecIter<T> {
} }
} }
} }
impl<T> Drop for VecIter<T> {
fn drop(&mut self) {
unsafe {
dealloc(
self.pointer.cast(),
Layout::array::<T>(self.capacity).unwrap(),
)
};
}
}

View File

@ -1,4 +1,4 @@
use core::mem::{size_of, transmute}; use core::mem::size_of;
extern "C" { extern "C" {
pub fn memset(des: *const u8, src: u8, len: usize); pub fn memset(des: *const u8, src: u8, len: usize);
@ -14,16 +14,16 @@ pub trait PtrOptions<T> {
impl<T> PtrOptions<T> for *mut T { impl<T> PtrOptions<T> for *mut T {
unsafe fn kcopy_from(self, src: *const T, count: usize) { unsafe fn kcopy_from(self, src: *const T, count: usize) {
memcpy( memcpy(
transmute(self.cast_const()), self.cast_const() as *const u8,
transmute(src), src.cast(),
count * size_of::<T>(), count * size_of::<T>(),
); );
} }
unsafe fn kcopy_to(self, des: *const T, count: usize) { unsafe fn kcopy_to(self, des: *const T, count: usize) {
memcpy( memcpy(
transmute(des), des.cast(),
transmute(self.cast_const()), self.cast_const() as *const u8,
count * size_of::<T>(), count * size_of::<T>(),
); );
} }