sys_write 安全检查

ch2 中,我们实现了第一个系统调用 sys_write,这使得我们可以在用户态输出信息。但是 os 在提供服务的同时,还有保护 os 本身以及其他用户程序不受错误或者恶意程序破坏的功能。

由于还没有实现虚拟内存,我们可以在用户程序中指定一个属于其他程序字符串,并将它输出,这显然是不合理的,因此我们要对 sys_write 做检查:

  • sys_write 仅能输出位于程序本身内存空间内的数据,否则报错。

我的实现

​ 由于所有的程序都将加载到0x80400000运行。我们可以再sys_write中加入如下的代码

pub fn sys_write(fd: usize, buf: *const u8, len: usize) -> isize {
    match fd {
        FD_STDOUT => {
            let slice = unsafe { core::slice::from_raw_parts(buf, len) }
			let str = core::str::from_utf8(slice).unwrap();
            if check_bound(str.as_ptr() as usize) {
                print!("{}", str);
                len as isize
            } else {
                panic!("Only support for own space")
            }
        }
        //...
    }
}

​ 这里对于每次的输出都检查str地址是否在加载运行程序的地址范围内。之后为APP_MANAGER实现check_bound方法, 要求

addr >= APP_BASE_ADDRESS && addr < APP_BASE_ADDRESS + APP_SIZE_LIMIT