rCore第二章练习
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