Skip to content

Commit c1c96f1

Browse files
committed
test5:sys_map try2
1 parent 9e2535d commit c1c96f1

File tree

1 file changed

+53
-52
lines changed

1 file changed

+53
-52
lines changed

arceos/exercises/sys_map/src/syscall.rs

Lines changed: 53 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use axhal::paging::MappingFlags;
1111
use arceos_posix_api::{self as api, get_file_like};
1212
use memory_addr::{align_up_4k, AddrRange, PAGE_SIZE_4K};
1313
use crate::task::TaskExt;
14-
14+
use crate::VirtAddr;
1515
const SYS_IOCTL: usize = 29;
1616
const SYS_OPENAT: usize = 56;
1717
const SYS_CLOSE: usize = 57;
@@ -144,63 +144,64 @@ fn sys_mmap(
144144
_offset: isize,
145145
) -> isize {
146146
// unimplemented!("no sys_mmap!");
147-
let curr = current();//得到当前进程的task 相当于任务控制块
148-
let ext = unsafe { &mut *(curr.task_ext_ptr() as *mut TaskExt) };//获取任务扩展数据
149-
let mut space = ext.aspace.lock();//得到任务的地址空间
150-
151-
let flags = MmapFlags::from_bits_truncate(flags);//两个标志转换 flags代表映射行为标志 包括修改后对其他进程是否共享等
152-
let prot = MmapProt::from_bits_truncate(prot);//prot表示映射的内存权限 是否可读写等
153-
let len = align_up_4k(len);
154-
155-
// 1. 选地址
156-
let vaddr = if flags.contains(MmapFlags::MAP_FIXED) {
157-
VirtAddr::from(addr as usize)//CASE1:强制使用指定地址 无论地址是否可用
158-
} else if addr.is_null() {//CASE2:addr.is_null() 代表内核自己决定
159-
space.find_free_area(space.base() + PAGE_SIZE_4K, len,
160-
AddrRange::new(space.base(), space.end()))?
161-
} else {
162-
VirtAddr::from(addr as usize)//CASE3:其他情况 使用提示的地址
163-
};
164-
165-
// 2. 映射页表
166-
space.map_alloc(vaddr, len, MappingFlags::from(prot) | MappingFlags::USER, true)
167-
.map_err(|_| LinuxError::ENOMEM)?;
168-
//在用户地址空间中,建立从虚拟地址 vaddr 开始、长度为 len 的区域与物理页的映射关系
169-
//分配了物理页 并在页表建立了映射
170-
171-
// 3. 填充内容
172-
if !flags.contains(MmapFlags::MAP_ANONYMOUS) {
173-
let file = get_file_like(fd)?;
174-
let file_size = file.get_size(); // 获取文件大小
147+
return 1;//测试
148+
// let curr = current();//得到当前进程的task 相当于任务控制块
149+
// let ext = unsafe { &mut *(curr.task_ext_ptr() as *mut TaskExt) };//获取任务扩展数据
150+
// let mut space = ext.aspace.lock();//得到任务的地址空间
151+
152+
// let flags = MmapFlags::from_bits_truncate(flags);//两个标志转换 flags代表映射行为标志 包括修改后对其他进程是否共享等
153+
// let prot = MmapProt::from_bits_truncate(prot);//prot表示映射的内存权限 是否可读写等
154+
// let len = align_up_4k(length);
155+
156+
// // 1. 选地址
157+
// let vaddr = if flags.contains(MmapFlags::MAP_FIXED) {
158+
// VirtAddr::from(addr as usize)//CASE1:强制使用指定地址 无论地址是否可用
159+
// } else if addr.is_null() {//CASE2:addr.is_null() 代表内核自己决定
160+
// space.find_free_area(space.base() + PAGE_SIZE_4K, len,
161+
// AddrRange::new(space.base(), space.end()))?
162+
// } else {
163+
// VirtAddr::from(addr as usize)//CASE3:其他情况 使用提示的地址
164+
// };
165+
166+
// // 2. 映射页表
167+
// space.map_alloc(vaddr, len, MappingFlags::from(prot) | MappingFlags::USER, true)
168+
// .map_err(|_| LinuxError::ENOMEM)?;
169+
// //在用户地址空间中,建立从虚拟地址 vaddr 开始、长度为 len 的区域与物理页的映射关系
170+
// //分配了物理页 并在页表建立了映射
171+
172+
// // 3. 填充内容
173+
// if !flags.contains(MmapFlags::MAP_ANONYMOUS) {
174+
// let file = get_file_like(fd)?;
175+
// let file_size = file.get_size(); // 获取文件大小
175176

176-
// 计算实际需要读取的字节数
177-
let read_len = len.min(file_size.saturating_sub(offset as usize));
177+
// // 计算实际需要读取的字节数
178+
// let read_len = len.min(file_size.saturating_sub(_offset as usize));
178179

179-
let mut remain = read_len;
180-
let mut off = offset as usize;
181-
let mut va = vaddr;
182-
//将虚拟地址转化为内核可访问的多个内核缓冲区 内部是转化为物理地址 再转化为内核虚拟地址
183-
//这样将文件读到这些内核缓冲区
184-
for buf in space.translated_byte_buffer(va, read_len)? {
185-
if remain == 0 { break; }
180+
// let mut remain = read_len;
181+
// let mut off = _offset as usize;
182+
// let mut va = vaddr;
183+
// //将虚拟地址转化为内核可访问的多个内核缓冲区 内部是转化为物理地址 再转化为内核虚拟地址
184+
// //这样将文件读到这些内核缓冲区
185+
// for buf in space.translated_byte_buffer(va, read_len)? {
186+
// if remain == 0 { break; }
186187

187-
let read = file.read_at(off, buf)? as usize;
188-
if read == 0 {
189-
// 文件结束但还有剩余空间,填充0或报错?
190-
break;
191-
}
188+
// let read = file.read_at(off, buf)? as usize;
189+
// if read == 0 {
190+
// // 文件结束但还有剩余空间,填充0或报错?
191+
// break;
192+
// }
192193

193-
off += read;
194-
remain = remain.saturating_sub(read);
195-
}
194+
// off += read;
195+
// remain = remain.saturating_sub(read);
196+
// }
196197

197-
// 如果是 MAP_PRIVATE,标记为写时复制?
198-
if flags.contains(MmapFlags::MAP_PRIVATE) {
199-
// 可能需要特殊的处理
200-
}
201-
}
198+
// // 如果是 MAP_PRIVATE,标记为写时复制?
199+
// if flags.contains(MmapFlags::MAP_PRIVATE) {
200+
// // 可能需要特殊的处理
201+
// }
202+
// }
202203

203-
Ok(vaddr.as_usize() as isize)
204+
// Ok(vaddr.as_usize() as isize)
204205
}
205206

206207
fn sys_openat(dfd: c_int, fname: *const c_char, flags: c_int, mode: api::ctypes::mode_t) -> isize {

0 commit comments

Comments
 (0)