data: start-aligned but maybe with shorter length assume that all frames were cleared before
(&mut self, page_table: &mut PageTable, data: &[u8])
| 317 | /// data: start-aligned but maybe with shorter length |
| 318 | /// assume that all frames were cleared before |
| 319 | pub fn copy_data(&mut self, page_table: &mut PageTable, data: &[u8]) { |
| 320 | assert_eq!(self.map_type, MapType::Framed); |
| 321 | let mut start: usize = 0; |
| 322 | let mut current_vpn = self.vpn_range.get_start(); |
| 323 | let len = data.len(); |
| 324 | loop { |
| 325 | let src = &data[start..len.min(start + PAGE_SIZE)]; |
| 326 | let dst = &mut page_table |
| 327 | .translate(current_vpn) |
| 328 | .unwrap() |
| 329 | .ppn() |
| 330 | .get_bytes_array()[..src.len()]; |
| 331 | dst.copy_from_slice(src); |
| 332 | start += PAGE_SIZE; |
| 333 | if start >= len { |
| 334 | break; |
| 335 | } |
| 336 | current_vpn.step(); |
| 337 | } |
| 338 | } |
| 339 | } |
| 340 | |
| 341 | #[derive(Copy, Clone, PartialEq, Debug)] |