jrz Week 2 Lab报告

Lab1 系统调用&&测试程序

1)在mod.rs添加系统调用

/kernel/src/syscall/mod.rs

SYS_ADD =>{
                // 这里应该对传入的参数进行合法性检查
                let a = args[0] ;
                let b = args[1] ;           
                Ok(a + b)
            }
SYS_ADD需要是一个整数,整数大小为系统调用号

/kernel/src/arch/x86_64/syscall/nr.rs

我看很多系统调用都把系统定义号放在这里

添加测试程序

在/user/apps中cargo new test_SYS_ADD
注意:在 test_SYS_ADD要把libc添加为依赖项

use std::ffi::CString;
use libc::{
syscall, SYS_exit};
use std::env;
fn main() {
    let args: Vec<String> = env::args().collect();
    let num1 = args[1].parse::<i32>().unwrap();
    let num2 = args[2].parse::<i32>().unwrap(); unsafe {
        // 使用 syscall 来调用系统调用 888
        let result: i32 = syscall(888, num1, num2) as i32;
        println!("syscall(SYS_ADD): ADD {} + {} =  {}", num1, num2,result);
        // 使用 assert 来验证返回结果
        assert_eq!(result, num1 + num2, "System call returned incorrect result!");
        println!("System call returned correct result: {}", result);
    }
}

编写玩测试程序后make build编译,再运行
结果

root@DragonOS:/$ test_SYS_ADD 32 45
[ WARN ] (src/syscall/mod.rs:876)	 SYS_POLL has not yet been implemented
[ WARN ] (src/syscall/mod.rs:899)	 SYS_SIGALTSTACK has not yet been impled
syscall(SYS_ADD): ADD 32 + 45 =  77
2 个赞

hint: 你还可以用 cargo fmt 和 cargo clippy 来使你的代码更整洁些,以及下面只有 syscall 调用是 unsafe 的,你应该将 println!assert_eq! 放到 unsafe block

1 个赞