rcore-os/rcore-thread

使用后报错

Opened this issue · 7 comments

image
报错消息ru如上图

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));
}

其中包和 blog_os内几乎相同

嗯这是一个已知Bug,还不清楚原因……有空时候会修一下

我发现 在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 中运行?
我这里改了 在没有其他线程的时候正常的循环了。

@wangrunji0408 但是 朋友还是有问题
我在 x86_64 平台开发 很尴尬的是
在一开始在you loop_context 切换上下文时 是成功的。
但是再次切换时就报错了
也就是调用了 yield_now 时发生了错误。
我调试时发现报错位置在 汇编语言中。(哈哈哈 于是疯了)
希望 可以帮忙看一下这个问题。

哈哈 竟然回我消息了 感谢你们开发出了 这些crate 给大家使用。
虽然还在看rcore的源码阶段,但是我也是励志写一个自己操作系统的 有志青年。

我在调试时发现 在x86_64下进行上下文切换的 switch 方法后。保存当前上下文的 rip的值 似乎是有问题的。 rip 太大了。不晓得为什么,原来我不太懂汇编,提供不了更多帮助。

@zzhgithub 在内联汇编中加入 alignstack 后,似乎修复了这个问题。请再试试!