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