使用后报错
Opened this issue · 7 comments
zzhgithub commented
static mut HEAP: [u8; HEAP_SIZE] = [0; HEAP_SIZE];
#[no_mangle]
pub extern "C" fn _start() -> !{
use x86_64::structures::paging::mapper::MapperAllSizes;
use x86_64::structures::paging::Page;
use x86_64::VirtAddr;
use memory::BootInfoFrameAllocator;
println!("Hello World {}", ",my friends!");
// let phys_mem_offset = VirtAddr::new(boot_info.physical_memory_offset);
// // new: initialize a mapper
// let mut mapper = unsafe { memory::init(phys_mem_offset) };
// let mut frame_allocator = unsafe { BootInfoFrameAllocator::init(&boot_info.memory_map)};
// init heap 初始化堆
// allocator::init_heap(&mut mapper, &mut frame_allocator)
// .expect("heap initialization failed");
unsafe {
ALLOCATOR
.lock()
.init(HEAP.as_ptr() as usize, HEAP_SIZE);
}
init();
test();
process::processor().run();
hlt_loop();
}
pub fn hlt_loop() -> ! {
loop {
x86_64::instructions::hlt();
}
}
pub fn init() {
println!("init start");
// 中断表初始化
interrupts::init_idt();
// 设置段表和 TSS
gdt::init();
// 进程初始化
process::init();
// PICS(中断控制器) 初始化
unsafe { interrupts::PICS.lock().initialize() };
// 允许时间中断
x86_64::instructions::interrupts::enable();
println!("init end");
}
pub fn test(){
thread::spawn(|| {
let tid = thread::current().id();
println!("[{}] yield", tid);
thread::yield_now();
println!("[{}] spawn", tid);
let t2 = thread::spawn(|| {
let tid = thread::current().id();
println!("[{}] yield", tid);
thread::yield_now();
println!("[{}] return 8", tid);
8
});
println!("[{}] join", tid);
let ret = t2.join();
println!("[{}] get {:?}", tid, ret);
println!("[{}] exit", tid);
});
println!("test");
// lisp::lisp_repl();
// use alloc::{boxed::Box, vec, vec::Vec, rc::Rc};
// // allocate a number on the heap
// let heap_value = Box::new(41);
// println!("heap_value at {:p}", heap_value);
// // create a dynamically sized vector
// let mut vec = Vec::new();
// for i in 0..500 {
// vec.push(i);
// }
// println!("vec at {:p}", vec.as_slice());
// // create a reference counted vector -> will be freed when count reaches 0
// let reference_counted = Rc::new(vec![1, 2, 3]);
// let cloned_reference = reference_counted.clone();
// println!("current reference count is {}", Rc::strong_count(&cloned_reference));
// core::mem::drop(reference_counted);
// println!("reference count is {} now", Rc::strong_count(&cloned_reference));
}
zzhgithub commented
其中包和 blog_os内几乎相同
wangrunji0408 commented
嗯这是一个已知Bug,还不清楚原因……有空时候会修一下
zzhgithub commented
我发现 在rr.rs 中的pop方法时 没有检查长度
fn pop(&mut self) -> Option<Tid> {
trace!("RR info len is {}",self.infos.len()); // new
if self.infos.len() == 0 { //new
return None;
}
let ret = match self.infos[0].next {
0 => None,
tid => {
self.infos[tid].present = false;
self._list_remove(tid);
Some(tid - 1)
}
};
trace!("rr pop {:?}", ret);
ret
}
这里 如果什么 线程都没有注册的情况下 是空 应该返回None 让他一直在idle 中运行?
我这里改了 在没有其他线程的时候正常的循环了。
zzhgithub commented
@wangrunji0408 但是 朋友还是有问题
我在 x86_64 平台开发 很尴尬的是
在一开始在you loop_context 切换上下文时 是成功的。
但是再次切换时就报错了
也就是调用了 yield_now 时发生了错误。
我调试时发现报错位置在 汇编语言中。(哈哈哈 于是疯了)
希望 可以帮忙看一下这个问题。
zzhgithub commented
哈哈 竟然回我消息了 感谢你们开发出了 这些crate 给大家使用。
虽然还在看rcore的源码阶段,但是我也是励志写一个自己操作系统的 有志青年。
zzhgithub commented
我在调试时发现 在x86_64下进行上下文切换的 switch 方法后。保存当前上下文的 rip的值 似乎是有问题的。 rip 太大了。不晓得为什么,原来我不太懂汇编,提供不了更多帮助。
wangrunji0408 commented
@zzhgithub 在内联汇编中加入 alignstack
后,似乎修复了这个问题。请再试试!