1 use core::intrinsics::size_of; 2 3 use alloc::{ 4 borrow::ToOwned, 5 collections::BTreeMap, 6 format, 7 string::{String, ToString}, 8 sync::{Arc, Weak}, 9 vec::Vec, 10 }; 11 use system_error::SystemError; 12 13 use crate::{ 14 arch::mm::LockedFrameAllocator, 15 driver::base::device::device_number::DeviceNumber, 16 filesystem::vfs::{ 17 core::{generate_inode_id, ROOT_INODE}, 18 FileType, 19 }, 20 kerror, kinfo, 21 libs::{ 22 once::Once, 23 spinlock::{SpinLock, SpinLockGuard}, 24 }, 25 mm::allocator::page_frame::FrameAllocator, 26 process::{Pid, ProcessManager}, 27 time::TimeSpec, 28 }; 29 30 use super::vfs::{ 31 file::{FileMode, FilePrivateData}, 32 syscall::ModeType, 33 FileSystem, FsInfo, IndexNode, InodeId, Metadata, 34 }; 35 36 pub mod kmsg; 37 pub mod log; 38 mod syscall; 39 40 /// @brief 进程文件类型 41 /// @usage 用于定义进程文件夹下的各类文件类型 42 #[derive(Debug)] 43 #[repr(u8)] 44 pub enum ProcFileType { 45 ///展示进程状态信息 46 ProcStatus = 0, 47 /// meminfo 48 ProcMeminfo = 1, 49 /// kmsg 50 ProcKmsg = 2, 51 //todo: 其他文件类型 52 ///默认文件类型 53 Default, 54 } 55 56 impl From<u8> for ProcFileType { 57 fn from(value: u8) -> Self { 58 match value { 59 0 => ProcFileType::ProcStatus, 60 1 => ProcFileType::ProcMeminfo, 61 2 => ProcFileType::ProcKmsg, 62 _ => ProcFileType::Default, 63 } 64 } 65 } 66 /// @brief 节点私有信息结构体 67 /// @usage 用于传入各类文件所需的信息 68 #[derive(Debug)] 69 pub struct InodeInfo { 70 ///进程的pid 71 pid: Pid, 72 ///文件类型 73 ftype: ProcFileType, 74 //其他需要传入的信息在此定义 75 } 76 77 /// @brief procfs的inode名称的最大长度 78 const PROCFS_MAX_NAMELEN: usize = 64; 79 80 /// @brief procfs文件系统的Inode结构体 81 #[derive(Debug)] 82 pub struct LockedProcFSInode(SpinLock<ProcFSInode>); 83 84 /// @brief procfs文件系统结构体 85 #[derive(Debug)] 86 pub struct ProcFS { 87 /// procfs的root inode 88 root_inode: Arc<LockedProcFSInode>, 89 } 90 91 #[derive(Debug, Clone)] 92 pub struct ProcfsFilePrivateData { 93 data: Vec<u8>, 94 } 95 96 impl ProcfsFilePrivateData { 97 pub fn new() -> Self { 98 return ProcfsFilePrivateData { data: Vec::new() }; 99 } 100 } 101 102 impl Default for ProcfsFilePrivateData { 103 fn default() -> Self { 104 Self::new() 105 } 106 } 107 108 /// @brief procfs文件系统的Inode结构体(不包含锁) 109 #[derive(Debug)] 110 pub struct ProcFSInode { 111 /// 指向父Inode的弱引用 112 parent: Weak<LockedProcFSInode>, 113 /// 指向自身的弱引用 114 self_ref: Weak<LockedProcFSInode>, 115 /// 子Inode的B树 116 children: BTreeMap<String, Arc<LockedProcFSInode>>, 117 /// 当前inode的数据部分 118 data: Vec<u8>, 119 /// 当前inode的元数据 120 metadata: Metadata, 121 /// 指向inode所在的文件系统对象的指针 122 fs: Weak<ProcFS>, 123 /// 储存私有信息 124 fdata: InodeInfo, 125 } 126 127 /// 对ProcFSInode实现获取各类文件信息的函数 128 impl ProcFSInode { 129 /// @brief 去除Vec中所有的\0,并在结尾添加\0 130 #[inline] 131 fn trim_string(&self, data: &mut Vec<u8>) { 132 data.retain(|x| *x != 0); 133 134 data.push(0); 135 } 136 // todo:其他数据获取函数实现 137 138 /// @brief 打开status文件 139 /// 140 fn open_status(&self, pdata: &mut ProcfsFilePrivateData) -> Result<i64, SystemError> { 141 // 获取该pid对应的pcb结构体 142 let pid = self.fdata.pid; 143 let pcb = ProcessManager::find(pid); 144 let pcb = if let Some(pcb) = pcb { 145 pcb 146 } else { 147 kerror!( 148 "ProcFS: Cannot find pcb for pid {:?} when opening its 'status' file.", 149 pid 150 ); 151 return Err(SystemError::ESRCH); 152 }; 153 // 传入数据 154 let pdata: &mut Vec<u8> = &mut pdata.data; 155 156 pdata.append( 157 &mut format!("Name:\t{}", pcb.basic().name()) 158 .as_bytes() 159 .to_owned(), 160 ); 161 162 let sched_info_guard = pcb.sched_info(); 163 let state = sched_info_guard.inner_lock_read_irqsave().state(); 164 let cpu_id = sched_info_guard 165 .on_cpu() 166 .map(|cpu| cpu.data() as i32) 167 .unwrap_or(-1); 168 169 let priority = sched_info_guard.priority(); 170 let vrtime = sched_info_guard.virtual_runtime(); 171 172 pdata.append(&mut format!("\nState:\t{:?}", state).as_bytes().to_owned()); 173 pdata.append( 174 &mut format!("\nPid:\t{}", pcb.pid().into()) 175 .as_bytes() 176 .to_owned(), 177 ); 178 pdata.append( 179 &mut format!("\nPpid:\t{}", pcb.basic().ppid().into()) 180 .as_bytes() 181 .to_owned(), 182 ); 183 pdata.append(&mut format!("\ncpu_id:\t{}", cpu_id).as_bytes().to_owned()); 184 pdata.append( 185 &mut format!("\npriority:\t{}", priority.data()) 186 .as_bytes() 187 .to_owned(), 188 ); 189 pdata.append( 190 &mut format!("\npreempt:\t{}", pcb.preempt_count()) 191 .as_bytes() 192 .to_owned(), 193 ); 194 pdata.append(&mut format!("\nvrtime:\t{}", vrtime).as_bytes().to_owned()); 195 196 if let Some(user_vm) = pcb.basic().user_vm() { 197 let address_space_guard = user_vm.read(); 198 // todo: 当前进程运行过程中占用内存的峰值 199 let hiwater_vm: u64 = 0; 200 // 进程代码段的大小 201 let text = (address_space_guard.end_code - address_space_guard.start_code) / 1024; 202 // 进程数据段的大小 203 let data = (address_space_guard.end_data - address_space_guard.start_data) / 1024; 204 drop(address_space_guard); 205 pdata.append( 206 &mut format!("\nVmPeak:\t{} kB", hiwater_vm) 207 .as_bytes() 208 .to_owned(), 209 ); 210 pdata.append(&mut format!("\nVmData:\t{} kB", data).as_bytes().to_owned()); 211 pdata.append(&mut format!("\nVmExe:\t{} kB", text).as_bytes().to_owned()); 212 } 213 214 pdata.append( 215 &mut format!("\nflags: {:?}\n", pcb.flags().clone()) 216 .as_bytes() 217 .to_owned(), 218 ); 219 220 // 去除多余的\0 221 self.trim_string(pdata); 222 223 return Ok((pdata.len() * size_of::<u8>()) as i64); 224 } 225 226 /// 打开 meminfo 文件 227 fn open_meminfo(&self, pdata: &mut ProcfsFilePrivateData) -> Result<i64, SystemError> { 228 // 获取内存信息 229 let usage = unsafe { LockedFrameAllocator.usage() }; 230 231 // 传入数据 232 let data: &mut Vec<u8> = &mut pdata.data; 233 234 data.append( 235 &mut format!("MemTotal:\t{} kB\n", usage.total().bytes() >> 10) 236 .as_bytes() 237 .to_owned(), 238 ); 239 240 data.append( 241 &mut format!("MemFree:\t{} kB\n", usage.free().bytes() >> 10) 242 .as_bytes() 243 .to_owned(), 244 ); 245 246 // 去除多余的\0 247 self.trim_string(data); 248 249 return Ok((data.len() * size_of::<u8>()) as i64); 250 } 251 252 /// proc文件系统读取函数 253 fn proc_read( 254 &self, 255 offset: usize, 256 len: usize, 257 buf: &mut [u8], 258 _pdata: &mut ProcfsFilePrivateData, 259 ) -> Result<usize, SystemError> { 260 let start = _pdata.data.len().min(offset); 261 let end = _pdata.data.len().min(offset + len); 262 263 // buffer空间不足 264 if buf.len() < (end - start) { 265 return Err(SystemError::ENOBUFS); 266 } 267 268 // 拷贝数据 269 let src = &_pdata.data[start..end]; 270 buf[0..src.len()].copy_from_slice(src); 271 return Ok(src.len()); 272 } 273 } 274 275 impl FileSystem for ProcFS { 276 fn root_inode(&self) -> Arc<dyn super::vfs::IndexNode> { 277 return self.root_inode.clone(); 278 } 279 280 fn info(&self) -> FsInfo { 281 return FsInfo { 282 blk_dev_id: 0, 283 max_name_len: PROCFS_MAX_NAMELEN, 284 }; 285 } 286 287 fn as_any_ref(&self) -> &dyn core::any::Any { 288 self 289 } 290 fn name(&self) -> &str { 291 "procfs" 292 } 293 } 294 295 impl ProcFS { 296 pub fn new() -> Arc<Self> { 297 // 初始化root inode 298 let root: Arc<LockedProcFSInode> = 299 Arc::new(LockedProcFSInode(SpinLock::new(ProcFSInode { 300 parent: Weak::default(), 301 self_ref: Weak::default(), 302 children: BTreeMap::new(), 303 data: Vec::new(), 304 metadata: Metadata { 305 dev_id: 0, 306 inode_id: generate_inode_id(), 307 size: 0, 308 blk_size: 0, 309 blocks: 0, 310 atime: TimeSpec::default(), 311 mtime: TimeSpec::default(), 312 ctime: TimeSpec::default(), 313 file_type: FileType::Dir, 314 mode: ModeType::from_bits_truncate(0o555), 315 nlinks: 1, 316 uid: 0, 317 gid: 0, 318 raw_dev: DeviceNumber::default(), 319 }, 320 fs: Weak::default(), 321 fdata: InodeInfo { 322 pid: Pid::new(0), 323 ftype: ProcFileType::Default, 324 }, 325 }))); 326 327 let result: Arc<ProcFS> = Arc::new(ProcFS { root_inode: root }); 328 329 // 对root inode加锁,并继续完成初始化工作 330 let mut root_guard: SpinLockGuard<ProcFSInode> = result.root_inode.0.lock(); 331 root_guard.parent = Arc::downgrade(&result.root_inode); 332 root_guard.self_ref = Arc::downgrade(&result.root_inode); 333 root_guard.fs = Arc::downgrade(&result); 334 // 释放锁 335 drop(root_guard); 336 337 // 创建meminfo文件 338 let inode = result.root_inode(); 339 let binding = inode.create( 340 "meminfo", 341 FileType::File, 342 ModeType::from_bits_truncate(0o444), 343 ); 344 if let Ok(meminfo) = binding { 345 let meminfo_file = meminfo 346 .as_any_ref() 347 .downcast_ref::<LockedProcFSInode>() 348 .unwrap(); 349 meminfo_file.0.lock().fdata.pid = Pid::new(0); 350 meminfo_file.0.lock().fdata.ftype = ProcFileType::ProcMeminfo; 351 } else { 352 panic!("create meminfo error"); 353 } 354 355 // 创建kmsg文件 356 let binding = inode.create("kmsg", FileType::File, ModeType::from_bits_truncate(0o444)); 357 if let Ok(kmsg) = binding { 358 let kmsg_file = kmsg 359 .as_any_ref() 360 .downcast_ref::<LockedProcFSInode>() 361 .unwrap(); 362 kmsg_file.0.lock().fdata.pid = Pid::new(1); 363 kmsg_file.0.lock().fdata.ftype = ProcFileType::ProcKmsg; 364 } else { 365 panic!("create ksmg error"); 366 } 367 368 return result; 369 } 370 371 /// @brief 进程注册函数 372 /// @usage 在进程中调用并创建进程对应文件 373 pub fn register_pid(&self, pid: Pid) -> Result<(), SystemError> { 374 // 获取当前inode 375 let inode: Arc<dyn IndexNode> = self.root_inode(); 376 // 创建对应进程文件夹 377 let pid_dir: Arc<dyn IndexNode> = inode.create( 378 &pid.to_string(), 379 FileType::Dir, 380 ModeType::from_bits_truncate(0o555), 381 )?; 382 // 创建相关文件 383 // status文件 384 let binding: Arc<dyn IndexNode> = pid_dir.create( 385 "status", 386 FileType::File, 387 ModeType::from_bits_truncate(0o444), 388 )?; 389 let status_file: &LockedProcFSInode = binding 390 .as_any_ref() 391 .downcast_ref::<LockedProcFSInode>() 392 .unwrap(); 393 status_file.0.lock().fdata.pid = pid; 394 status_file.0.lock().fdata.ftype = ProcFileType::ProcStatus; 395 396 //todo: 创建其他文件 397 398 return Ok(()); 399 } 400 401 /// @brief 解除进程注册 402 /// 403 pub fn unregister_pid(&self, pid: Pid) -> Result<(), SystemError> { 404 // 获取当前inode 405 let proc: Arc<dyn IndexNode> = self.root_inode(); 406 // 获取进程文件夹 407 let pid_dir: Arc<dyn IndexNode> = proc.find(&pid.to_string())?; 408 // 删除进程文件夹下文件 409 pid_dir.unlink("status")?; 410 411 // 查看进程文件是否还存在 412 // let pf= pid_dir.find("status").expect("Cannot find status"); 413 414 // 删除进程文件夹 415 proc.unlink(&pid.to_string())?; 416 417 return Ok(()); 418 } 419 } 420 421 impl IndexNode for LockedProcFSInode { 422 fn open(&self, data: &mut FilePrivateData, _mode: &FileMode) -> Result<(), SystemError> { 423 // 加锁 424 let mut inode: SpinLockGuard<ProcFSInode> = self.0.lock(); 425 426 // 如果inode类型为文件夹,则直接返回成功 427 if let FileType::Dir = inode.metadata.file_type { 428 return Ok(()); 429 } 430 let mut private_data = ProcfsFilePrivateData::new(); 431 // 根据文件类型获取相应数据 432 let file_size = match inode.fdata.ftype { 433 ProcFileType::ProcStatus => inode.open_status(&mut private_data)?, 434 ProcFileType::ProcMeminfo => inode.open_meminfo(&mut private_data)?, 435 _ => { 436 todo!() 437 } 438 }; 439 *data = FilePrivateData::Procfs(private_data); 440 // 更新metadata里面的文件大小数值 441 inode.metadata.size = file_size; 442 443 return Ok(()); 444 } 445 446 fn close(&self, data: &mut FilePrivateData) -> Result<(), SystemError> { 447 let guard: SpinLockGuard<ProcFSInode> = self.0.lock(); 448 // 如果inode类型为文件夹,则直接返回成功 449 if let FileType::Dir = guard.metadata.file_type { 450 return Ok(()); 451 } 452 // 释放data 453 *data = FilePrivateData::Procfs(ProcfsFilePrivateData::new()); 454 455 return Ok(()); 456 } 457 458 fn read_at( 459 &self, 460 offset: usize, 461 len: usize, 462 buf: &mut [u8], 463 data: &mut FilePrivateData, 464 ) -> Result<usize, SystemError> { 465 if buf.len() < len { 466 return Err(SystemError::EINVAL); 467 } 468 // 加锁 469 let inode: SpinLockGuard<ProcFSInode> = self.0.lock(); 470 471 // 检查当前inode是否为一个文件夹,如果是的话,就返回错误 472 if inode.metadata.file_type == FileType::Dir { 473 return Err(SystemError::EISDIR); 474 } 475 476 // 获取数据信息 477 let private_data = match data { 478 FilePrivateData::Procfs(p) => p, 479 _ => { 480 panic!("ProcFS: FilePrivateData mismatch!"); 481 } 482 }; 483 484 // 根据文件类型读取相应数据 485 match inode.fdata.ftype { 486 ProcFileType::ProcStatus => return inode.proc_read(offset, len, buf, private_data), 487 ProcFileType::ProcMeminfo => return inode.proc_read(offset, len, buf, private_data), 488 ProcFileType::ProcKmsg => (), 489 ProcFileType::Default => (), 490 }; 491 492 // 默认读取 493 let start = inode.data.len().min(offset); 494 let end = inode.data.len().min(offset + len); 495 496 // buffer空间不足 497 if buf.len() < (end - start) { 498 return Err(SystemError::ENOBUFS); 499 } 500 501 // 拷贝数据 502 let src = &inode.data[start..end]; 503 buf[0..src.len()].copy_from_slice(src); 504 return Ok(src.len()); 505 } 506 507 fn write_at( 508 &self, 509 _offset: usize, 510 _len: usize, 511 _buf: &[u8], 512 _data: &mut FilePrivateData, 513 ) -> Result<usize, SystemError> { 514 return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP); 515 } 516 517 fn fs(&self) -> Arc<dyn FileSystem> { 518 return self.0.lock().fs.upgrade().unwrap(); 519 } 520 521 fn as_any_ref(&self) -> &dyn core::any::Any { 522 self 523 } 524 525 fn metadata(&self) -> Result<Metadata, SystemError> { 526 let inode = self.0.lock(); 527 let metadata = inode.metadata.clone(); 528 529 return Ok(metadata); 530 } 531 532 fn set_metadata(&self, metadata: &Metadata) -> Result<(), SystemError> { 533 let mut inode = self.0.lock(); 534 inode.metadata.atime = metadata.atime; 535 inode.metadata.mtime = metadata.mtime; 536 inode.metadata.ctime = metadata.ctime; 537 inode.metadata.mode = metadata.mode; 538 inode.metadata.uid = metadata.uid; 539 inode.metadata.gid = metadata.gid; 540 541 return Ok(()); 542 } 543 544 fn resize(&self, len: usize) -> Result<(), SystemError> { 545 let mut inode = self.0.lock(); 546 if inode.metadata.file_type == FileType::File { 547 inode.data.resize(len, 0); 548 return Ok(()); 549 } else { 550 return Err(SystemError::EINVAL); 551 } 552 } 553 554 fn create_with_data( 555 &self, 556 name: &str, 557 file_type: FileType, 558 mode: ModeType, 559 data: usize, 560 ) -> Result<Arc<dyn IndexNode>, SystemError> { 561 // 获取当前inode 562 let mut inode = self.0.lock(); 563 // 如果当前inode不是文件夹,则返回 564 if inode.metadata.file_type != FileType::Dir { 565 return Err(SystemError::ENOTDIR); 566 } 567 // 如果有重名的,则返回 568 if inode.children.contains_key(name) { 569 return Err(SystemError::EEXIST); 570 } 571 572 // 创建inode 573 let result: Arc<LockedProcFSInode> = 574 Arc::new(LockedProcFSInode(SpinLock::new(ProcFSInode { 575 parent: inode.self_ref.clone(), 576 self_ref: Weak::default(), 577 children: BTreeMap::new(), 578 data: Vec::new(), 579 metadata: Metadata { 580 dev_id: 0, 581 inode_id: generate_inode_id(), 582 size: 0, 583 blk_size: 0, 584 blocks: 0, 585 atime: TimeSpec::default(), 586 mtime: TimeSpec::default(), 587 ctime: TimeSpec::default(), 588 file_type, 589 mode, 590 nlinks: 1, 591 uid: 0, 592 gid: 0, 593 raw_dev: DeviceNumber::from(data as u32), 594 }, 595 fs: inode.fs.clone(), 596 fdata: InodeInfo { 597 pid: Pid::new(0), 598 ftype: ProcFileType::Default, 599 }, 600 }))); 601 602 // 初始化inode的自引用的weak指针 603 result.0.lock().self_ref = Arc::downgrade(&result); 604 605 // 将子inode插入父inode的B树中 606 inode.children.insert(String::from(name), result.clone()); 607 608 return Ok(result); 609 } 610 611 fn link(&self, name: &str, other: &Arc<dyn IndexNode>) -> Result<(), SystemError> { 612 let other: &LockedProcFSInode = other 613 .downcast_ref::<LockedProcFSInode>() 614 .ok_or(SystemError::EPERM)?; 615 let mut inode: SpinLockGuard<ProcFSInode> = self.0.lock(); 616 let mut other_locked: SpinLockGuard<ProcFSInode> = other.0.lock(); 617 618 // 如果当前inode不是文件夹,那么报错 619 if inode.metadata.file_type != FileType::Dir { 620 return Err(SystemError::ENOTDIR); 621 } 622 623 // 如果另一个inode是文件夹,那么也报错 624 if other_locked.metadata.file_type == FileType::Dir { 625 return Err(SystemError::EISDIR); 626 } 627 628 // 如果当前文件夹下已经有同名文件,也报错。 629 if inode.children.contains_key(name) { 630 return Err(SystemError::EEXIST); 631 } 632 633 inode 634 .children 635 .insert(String::from(name), other_locked.self_ref.upgrade().unwrap()); 636 637 // 增加硬链接计数 638 other_locked.metadata.nlinks += 1; 639 return Ok(()); 640 } 641 642 fn unlink(&self, name: &str) -> Result<(), SystemError> { 643 let mut inode: SpinLockGuard<ProcFSInode> = self.0.lock(); 644 // 如果当前inode不是目录,那么也没有子目录/文件的概念了,因此要求当前inode的类型是目录 645 if inode.metadata.file_type != FileType::Dir { 646 return Err(SystemError::ENOTDIR); 647 } 648 649 // 不允许删除当前文件夹,也不允许删除上一个目录 650 if name == "." || name == ".." { 651 return Err(SystemError::ENOTEMPTY); 652 } 653 654 // 获得要删除的文件的inode 655 let to_delete = inode.children.get(name).ok_or(SystemError::ENOENT)?; 656 657 // 减少硬链接计数 658 to_delete.0.lock().metadata.nlinks -= 1; 659 660 // 在当前目录中删除这个子目录项 661 inode.children.remove(name); 662 663 return Ok(()); 664 } 665 666 fn move_to( 667 &self, 668 _old_name: &str, 669 _target: &Arc<dyn IndexNode>, 670 _new_name: &str, 671 ) -> Result<(), SystemError> { 672 return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP); 673 } 674 675 fn find(&self, name: &str) -> Result<Arc<dyn IndexNode>, SystemError> { 676 let inode = self.0.lock(); 677 678 if inode.metadata.file_type != FileType::Dir { 679 return Err(SystemError::ENOTDIR); 680 } 681 682 match name { 683 "" | "." => { 684 return Ok(inode.self_ref.upgrade().ok_or(SystemError::ENOENT)?); 685 } 686 687 ".." => { 688 return Ok(inode.parent.upgrade().ok_or(SystemError::ENOENT)?); 689 } 690 name => { 691 // 在子目录项中查找 692 return Ok(inode.children.get(name).ok_or(SystemError::ENOENT)?.clone()); 693 } 694 } 695 } 696 697 fn get_entry_name(&self, ino: InodeId) -> Result<String, SystemError> { 698 let inode: SpinLockGuard<ProcFSInode> = self.0.lock(); 699 if inode.metadata.file_type != FileType::Dir { 700 return Err(SystemError::ENOTDIR); 701 } 702 703 match ino.into() { 704 0 => { 705 return Ok(String::from(".")); 706 } 707 1 => { 708 return Ok(String::from("..")); 709 } 710 ino => { 711 // 暴力遍历所有的children,判断inode id是否相同 712 // TODO: 优化这里,这个地方性能很差! 713 let mut key: Vec<String> = inode 714 .children 715 .keys() 716 .filter(|k| { 717 inode 718 .children 719 .get(*k) 720 .unwrap() 721 .0 722 .lock() 723 .metadata 724 .inode_id 725 .into() 726 == ino 727 }) 728 .cloned() 729 .collect(); 730 731 match key.len() { 732 0=>{return Err(SystemError::ENOENT);} 733 1=>{return Ok(key.remove(0));} 734 _ => panic!("Procfs get_entry_name: key.len()={key_len}>1, current inode_id={inode_id:?}, to find={to_find:?}", key_len=key.len(), inode_id = inode.metadata.inode_id, to_find=ino) 735 } 736 } 737 } 738 } 739 740 fn list(&self) -> Result<Vec<String>, SystemError> { 741 let info = self.metadata()?; 742 if info.file_type != FileType::Dir { 743 return Err(SystemError::ENOTDIR); 744 } 745 746 let mut keys: Vec<String> = Vec::new(); 747 keys.push(String::from(".")); 748 keys.push(String::from("..")); 749 keys.append(&mut self.0.lock().children.keys().cloned().collect()); 750 751 return Ok(keys); 752 } 753 } 754 755 /// @brief 向procfs注册进程 756 pub fn procfs_register_pid(pid: Pid) -> Result<(), SystemError> { 757 let procfs_inode = ROOT_INODE().find("proc")?; 758 759 let procfs_inode = procfs_inode 760 .downcast_ref::<LockedProcFSInode>() 761 .expect("Failed to find procfs' root inode"); 762 let fs = procfs_inode.fs(); 763 let procfs: &ProcFS = fs.as_any_ref().downcast_ref::<ProcFS>().unwrap(); 764 765 // 调用注册函数 766 procfs.register_pid(pid)?; 767 768 return Ok(()); 769 } 770 771 /// @brief 在ProcFS中,解除进程的注册 772 pub fn procfs_unregister_pid(pid: Pid) -> Result<(), SystemError> { 773 // 获取procfs实例 774 let procfs_inode: Arc<dyn IndexNode> = ROOT_INODE().find("proc")?; 775 776 let procfs_inode: &LockedProcFSInode = procfs_inode 777 .downcast_ref::<LockedProcFSInode>() 778 .expect("Failed to find procfs' root inode"); 779 let fs: Arc<dyn FileSystem> = procfs_inode.fs(); 780 let procfs: &ProcFS = fs.as_any_ref().downcast_ref::<ProcFS>().unwrap(); 781 782 // 调用解除注册函数 783 return procfs.unregister_pid(pid); 784 } 785 786 pub fn procfs_init() -> Result<(), SystemError> { 787 static INIT: Once = Once::new(); 788 let mut result = None; 789 INIT.call_once(|| { 790 kinfo!("Initializing ProcFS..."); 791 // 创建 procfs 实例 792 let procfs: Arc<ProcFS> = ProcFS::new(); 793 794 // procfs 挂载 795 let _t = ROOT_INODE() 796 .find("proc") 797 .expect("Cannot find /proc") 798 .mount(procfs) 799 .expect("Failed to mount proc"); 800 kinfo!("ProcFS mounted."); 801 result = Some(Ok(())); 802 }); 803 804 return result.unwrap(); 805 } 806