mod.rs 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749
  1. /// 导出devfs的模块
  2. pub mod null_dev;
  3. pub mod zero_dev;
  4. use super::{
  5. devpts::{DevPtsFs, LockedDevPtsFSInode},
  6. vfs::{
  7. file::FileMode, syscall::ModeType, utils::DName, vcore::generate_inode_id, FilePrivateData,
  8. FileSystem, FileType, FsInfo, IndexNode, Magic, Metadata, SuperBlock,
  9. },
  10. };
  11. use crate::{
  12. driver::base::{block::gendisk::GenDisk, device::device_number::DeviceNumber},
  13. filesystem::vfs::mount::MountFlags,
  14. libs::{
  15. casting::DowncastArc,
  16. once::Once,
  17. spinlock::{SpinLock, SpinLockGuard},
  18. },
  19. process::ProcessManager,
  20. time::PosixTimeSpec,
  21. };
  22. use alloc::{
  23. collections::BTreeMap,
  24. string::{String, ToString},
  25. sync::{Arc, Weak},
  26. vec::Vec,
  27. };
  28. use log::{error, info};
  29. use system_error::SystemError;
  30. const DEVFS_BLOCK_SIZE: u64 = 512;
  31. const DEVFS_MAX_NAMELEN: usize = 255;
  32. /// @brief dev文件系统
  33. #[derive(Debug)]
  34. pub struct DevFS {
  35. // 文件系统根节点
  36. root_inode: Arc<LockedDevFSInode>,
  37. super_block: SuperBlock,
  38. }
  39. impl FileSystem for DevFS {
  40. fn as_any_ref(&self) -> &dyn core::any::Any {
  41. self
  42. }
  43. fn root_inode(&self) -> Arc<dyn super::vfs::IndexNode> {
  44. return self.root_inode.clone();
  45. }
  46. fn info(&self) -> super::vfs::FsInfo {
  47. return FsInfo {
  48. blk_dev_id: 0,
  49. max_name_len: DEVFS_MAX_NAMELEN,
  50. };
  51. }
  52. fn name(&self) -> &str {
  53. "devfs"
  54. }
  55. fn super_block(&self) -> SuperBlock {
  56. self.super_block.clone()
  57. }
  58. }
  59. impl DevFS {
  60. pub fn new() -> Arc<Self> {
  61. let super_block = SuperBlock::new(
  62. Magic::DEVFS_MAGIC,
  63. DEVFS_BLOCK_SIZE,
  64. DEVFS_MAX_NAMELEN as u64,
  65. );
  66. // 初始化root inode
  67. let root: Arc<LockedDevFSInode> = Arc::new(LockedDevFSInode(SpinLock::new(
  68. // /dev 的权限设置为 读+执行,root 可以读写
  69. // root 的 parent 是空指针
  70. DevFSInode::new(FileType::Dir, ModeType::from_bits_truncate(0o755), 0),
  71. )));
  72. // panic!("devfs root inode id: {:?}", root.0.lock().metadata.inode_id);
  73. let devfs: Arc<DevFS> = Arc::new(DevFS {
  74. root_inode: root,
  75. super_block,
  76. });
  77. // 对root inode加锁,并继续完成初始化工作
  78. let mut root_guard: SpinLockGuard<DevFSInode> = devfs.root_inode.0.lock();
  79. root_guard.parent = Arc::downgrade(&devfs.root_inode);
  80. root_guard.self_ref = Arc::downgrade(&devfs.root_inode);
  81. root_guard.fs = Arc::downgrade(&devfs);
  82. // 释放锁
  83. drop(root_guard);
  84. // 创建文件夹
  85. let root: &Arc<LockedDevFSInode> = &devfs.root_inode;
  86. root.add_dir("char")
  87. .expect("DevFS: Failed to create /dev/char");
  88. root.add_dir("block")
  89. .expect("DevFS: Failed to create /dev/block");
  90. devfs.register_bultinin_device();
  91. // debug!("ls /dev: {:?}", root.list());
  92. return devfs;
  93. }
  94. /// @brief 注册系统内部自带的设备
  95. fn register_bultinin_device(&self) {
  96. use null_dev::LockedNullInode;
  97. use zero_dev::LockedZeroInode;
  98. let dev_root: Arc<LockedDevFSInode> = self.root_inode.clone();
  99. dev_root
  100. .add_dev("null", LockedNullInode::new())
  101. .expect("DevFS: Failed to register /dev/null");
  102. dev_root
  103. .add_dev("zero", LockedZeroInode::new())
  104. .expect("DevFS: Failed to register /dev/zero");
  105. }
  106. /// @brief 在devfs内注册设备
  107. ///
  108. /// @param name 设备名称
  109. /// @param device 设备节点的结构体
  110. pub fn register_device<T: DeviceINode>(
  111. &self,
  112. name: &str,
  113. device: Arc<T>,
  114. ) -> Result<(), SystemError> {
  115. let dev_root_inode = self.root_inode.clone();
  116. let metadata = device.metadata()?;
  117. match metadata.file_type {
  118. // 字节设备挂载在 /dev/char
  119. FileType::CharDevice => {
  120. if dev_root_inode.find("char").is_err() {
  121. dev_root_inode.create(
  122. "char",
  123. FileType::Dir,
  124. ModeType::from_bits_truncate(0o755),
  125. )?;
  126. }
  127. let any_char_inode = dev_root_inode.find("char")?;
  128. let dev_char_inode = any_char_inode.downcast_arc::<LockedDevFSInode>().unwrap();
  129. device.set_fs(dev_root_inode.0.lock().fs.clone());
  130. device.set_parent(Arc::downgrade(&dev_root_inode));
  131. // 特殊处理 tty 设备,挂载在 /dev 下
  132. if name.starts_with("tty") && name.len() >= 3 {
  133. dev_root_inode.add_dev(name, device.clone())?;
  134. } else if name.starts_with("hvc") && name.len() > 3 {
  135. // 特殊处理 hvc 设备,挂载在 /dev 下
  136. dev_root_inode.add_dev(name, device.clone())?;
  137. } else if name == "console" {
  138. dev_root_inode.add_dev(name, device.clone())?;
  139. } else if name == "ptmx" {
  140. // ptmx设备
  141. dev_root_inode.add_dev(name, device.clone())?;
  142. } else {
  143. // 在 /dev/char 下创建设备节点
  144. dev_char_inode.add_dev(name, device.clone())?;
  145. device.set_parent(Arc::downgrade(&dev_char_inode));
  146. }
  147. }
  148. FileType::BlockDevice => {
  149. if dev_root_inode.find("block").is_err() {
  150. dev_root_inode.create(
  151. "block",
  152. FileType::Dir,
  153. ModeType::from_bits_truncate(0o755),
  154. )?;
  155. }
  156. let any_block_inode = dev_root_inode.find("block")?;
  157. let dev_block_inode = any_block_inode.downcast_arc::<LockedDevFSInode>().unwrap();
  158. // default parent is dev_root_inode
  159. device.set_parent(Arc::downgrade(&dev_root_inode));
  160. device.set_fs(dev_root_inode.0.lock().fs.clone());
  161. if name.starts_with("vd") && name.len() > 2 {
  162. // 虚拟磁盘设备挂载在 /dev 下
  163. dev_root_inode.add_dev(name, device.clone())?;
  164. let path = format!("/dev/{}", name);
  165. let symlink_name = device
  166. .as_any_ref()
  167. .downcast_ref::<GenDisk>()
  168. .unwrap()
  169. .symlink_name();
  170. dev_block_inode.add_dev_symlink(&path, &symlink_name)?;
  171. } else if name.starts_with("nvme") {
  172. // NVMe设备挂载在 /dev 下
  173. dev_root_inode.add_dev(name, device.clone())?;
  174. } else {
  175. dev_block_inode.add_dev(name, device.clone())?;
  176. device.set_parent(Arc::downgrade(&dev_block_inode));
  177. }
  178. }
  179. FileType::KvmDevice | FileType::FramebufferDevice => {
  180. dev_root_inode
  181. .add_dev(name, device.clone())
  182. .unwrap_or_else(|_| panic!("DevFS: Failed to register /dev/{}", name));
  183. // default parent is dev_root_inode
  184. device.set_parent(Arc::downgrade(&dev_root_inode));
  185. device.set_fs(dev_root_inode.0.lock().fs.clone());
  186. }
  187. _ => {
  188. return Err(SystemError::ENOSYS);
  189. }
  190. }
  191. return Ok(());
  192. }
  193. /// @brief 卸载设备
  194. pub fn unregister_device<T: DeviceINode>(
  195. &self,
  196. name: &str,
  197. device: Arc<T>,
  198. ) -> Result<(), SystemError> {
  199. let dev_root_inode: Arc<LockedDevFSInode> = self.root_inode.clone();
  200. match device.metadata().unwrap().file_type {
  201. // 字节设备挂载在 /dev/char
  202. FileType::CharDevice => {
  203. if dev_root_inode.find("char").is_err() {
  204. return Err(SystemError::ENOENT);
  205. }
  206. let any_char_inode = dev_root_inode.find("char")?;
  207. let dev_char_inode = any_char_inode
  208. .as_any_ref()
  209. .downcast_ref::<LockedDevFSInode>()
  210. .unwrap();
  211. // TODO: 调用设备的卸载接口(当引入卸载接口之后)
  212. dev_char_inode.remove(name)?;
  213. }
  214. FileType::BlockDevice => {
  215. if dev_root_inode.find("block").is_err() {
  216. return Err(SystemError::ENOENT);
  217. }
  218. let any_block_inode = dev_root_inode.find("block")?;
  219. let dev_block_inode = any_block_inode
  220. .as_any_ref()
  221. .downcast_ref::<LockedDevFSInode>()
  222. .unwrap();
  223. dev_block_inode.remove(name)?;
  224. }
  225. _ => {
  226. return Err(SystemError::ENOSYS);
  227. }
  228. }
  229. return Ok(());
  230. }
  231. }
  232. /// @brief dev文件i节点(锁)
  233. #[derive(Debug)]
  234. pub struct LockedDevFSInode(SpinLock<DevFSInode>);
  235. /// @brief dev文件i节点(无锁)
  236. #[derive(Debug)]
  237. pub struct DevFSInode {
  238. /// 指向父Inode的弱引用
  239. parent: Weak<LockedDevFSInode>,
  240. /// 指向自身的弱引用
  241. self_ref: Weak<LockedDevFSInode>,
  242. /// 子Inode的B树
  243. children: BTreeMap<DName, Arc<dyn IndexNode>>,
  244. /// 指向inode所在的文件系统对象的指针
  245. fs: Weak<DevFS>,
  246. /// INode 元数据
  247. metadata: Metadata,
  248. /// 目录名
  249. dname: DName,
  250. /// 当前inode的数据部分(仅供symlink使用)
  251. data: Vec<u8>,
  252. }
  253. impl DevFSInode {
  254. pub fn new(dev_type_: FileType, mode: ModeType, data_: usize) -> Self {
  255. return Self::new_with_parent(Weak::default(), dev_type_, mode, data_);
  256. }
  257. pub fn new_with_parent(
  258. parent: Weak<LockedDevFSInode>,
  259. dev_type_: FileType,
  260. mode: ModeType,
  261. data_: usize,
  262. ) -> Self {
  263. return DevFSInode {
  264. parent,
  265. self_ref: Weak::default(),
  266. children: BTreeMap::new(),
  267. metadata: Metadata {
  268. dev_id: 1,
  269. inode_id: generate_inode_id(),
  270. size: 0,
  271. blk_size: 0,
  272. blocks: 0,
  273. atime: PosixTimeSpec::default(),
  274. mtime: PosixTimeSpec::default(),
  275. ctime: PosixTimeSpec::default(),
  276. btime: PosixTimeSpec::default(),
  277. file_type: dev_type_, // 文件夹
  278. mode,
  279. nlinks: 1,
  280. uid: 0,
  281. gid: 0,
  282. raw_dev: DeviceNumber::from(data_ as u32),
  283. },
  284. fs: Weak::default(),
  285. dname: DName::default(),
  286. data: Vec::new(),
  287. };
  288. }
  289. }
  290. impl LockedDevFSInode {
  291. pub fn add_dir(&self, name: &str) -> Result<(), SystemError> {
  292. let guard: SpinLockGuard<DevFSInode> = self.0.lock();
  293. if guard.children.contains_key(&DName::from(name)) {
  294. return Err(SystemError::EEXIST);
  295. }
  296. match self.do_create_with_data(
  297. guard,
  298. name,
  299. FileType::Dir,
  300. ModeType::from_bits_truncate(0o755),
  301. 0,
  302. ) {
  303. Ok(inode) => inode,
  304. Err(err) => {
  305. return Err(err);
  306. }
  307. };
  308. return Ok(());
  309. }
  310. pub fn add_dev(&self, name: &str, dev: Arc<dyn IndexNode>) -> Result<(), SystemError> {
  311. let mut this = self.0.lock();
  312. let name = DName::from(name);
  313. if this.children.contains_key(&name) {
  314. return Err(SystemError::EEXIST);
  315. }
  316. this.children.insert(name, dev);
  317. return Ok(());
  318. }
  319. /// # 在devfs中添加一个符号链接
  320. ///
  321. /// ## 参数
  322. /// - `path`: 符号链接指向的路径
  323. /// - `symlink_name`: 符号链接的名称
  324. pub fn add_dev_symlink(&self, path: &str, symlink_name: &str) -> Result<(), SystemError> {
  325. let new_inode = self.create_with_data(
  326. symlink_name,
  327. FileType::SymLink,
  328. ModeType::from_bits_truncate(0o777),
  329. 0,
  330. )?;
  331. let buf = path.as_bytes();
  332. let len = buf.len();
  333. new_inode
  334. .downcast_ref::<LockedDevFSInode>()
  335. .unwrap()
  336. .write_at(0, len, buf, SpinLock::new(FilePrivateData::Unused).lock())?;
  337. Ok(())
  338. }
  339. pub fn remove(&self, name: &str) -> Result<(), SystemError> {
  340. let x = self
  341. .0
  342. .lock()
  343. .children
  344. .remove(&DName::from(name))
  345. .ok_or(SystemError::ENOENT)?;
  346. drop(x);
  347. return Ok(());
  348. }
  349. fn do_create_with_data(
  350. &self,
  351. mut guard: SpinLockGuard<DevFSInode>,
  352. name: &str,
  353. file_type: FileType,
  354. mode: ModeType,
  355. dev: usize,
  356. ) -> Result<Arc<dyn IndexNode>, SystemError> {
  357. if guard.metadata.file_type != FileType::Dir {
  358. return Err(SystemError::ENOTDIR);
  359. }
  360. let name = DName::from(name);
  361. // 如果有重名的,则返回
  362. if guard.children.contains_key(&name) {
  363. return Err(SystemError::EEXIST);
  364. }
  365. // 创建inode
  366. let result: Arc<LockedDevFSInode> = Arc::new(LockedDevFSInode(SpinLock::new(DevFSInode {
  367. parent: guard.self_ref.clone(),
  368. self_ref: Weak::default(),
  369. children: BTreeMap::new(),
  370. metadata: Metadata {
  371. dev_id: 0,
  372. inode_id: generate_inode_id(),
  373. size: 0,
  374. blk_size: 0,
  375. blocks: 0,
  376. atime: PosixTimeSpec::default(),
  377. mtime: PosixTimeSpec::default(),
  378. ctime: PosixTimeSpec::default(),
  379. btime: PosixTimeSpec::default(),
  380. file_type,
  381. mode,
  382. nlinks: 1,
  383. uid: 0,
  384. gid: 0,
  385. raw_dev: DeviceNumber::from(dev as u32),
  386. },
  387. fs: guard.fs.clone(),
  388. dname: name.clone(),
  389. data: Vec::new(),
  390. })));
  391. // 初始化inode的自引用的weak指针
  392. result.0.lock().self_ref = Arc::downgrade(&result);
  393. // 将子inode插入父inode的B树中
  394. guard.children.insert(name, result.clone());
  395. return Ok(result);
  396. }
  397. }
  398. impl IndexNode for LockedDevFSInode {
  399. fn as_any_ref(&self) -> &dyn core::any::Any {
  400. self
  401. }
  402. fn open(
  403. &self,
  404. _data: SpinLockGuard<FilePrivateData>,
  405. _mode: &FileMode,
  406. ) -> Result<(), SystemError> {
  407. return Ok(());
  408. }
  409. fn close(&self, _data: SpinLockGuard<FilePrivateData>) -> Result<(), SystemError> {
  410. return Ok(());
  411. }
  412. fn create_with_data(
  413. &self,
  414. name: &str,
  415. file_type: FileType,
  416. mode: ModeType,
  417. data: usize,
  418. ) -> Result<Arc<dyn IndexNode>, SystemError> {
  419. // 获取当前inode
  420. let guard: SpinLockGuard<DevFSInode> = self.0.lock();
  421. // 如果当前inode不是文件夹,则返回
  422. return self.do_create_with_data(guard, name, file_type, mode, data);
  423. }
  424. fn find(&self, name: &str) -> Result<Arc<dyn IndexNode>, SystemError> {
  425. let inode = self.0.lock();
  426. if inode.metadata.file_type != FileType::Dir {
  427. return Err(SystemError::ENOTDIR);
  428. }
  429. match name {
  430. "" | "." => {
  431. return Ok(inode.self_ref.upgrade().ok_or(SystemError::ENOENT)?);
  432. }
  433. ".." => {
  434. return Ok(inode.parent.upgrade().ok_or(SystemError::ENOENT)?);
  435. }
  436. name => {
  437. // 在子目录项中查找
  438. return Ok(inode
  439. .children
  440. .get(&DName::from(name))
  441. .ok_or(SystemError::ENOENT)?
  442. .clone());
  443. }
  444. }
  445. }
  446. fn fs(&self) -> Arc<dyn FileSystem> {
  447. return self.0.lock().fs.upgrade().unwrap();
  448. }
  449. fn get_entry_name(&self, ino: super::vfs::InodeId) -> Result<String, SystemError> {
  450. let inode: SpinLockGuard<DevFSInode> = self.0.lock();
  451. if inode.metadata.file_type != FileType::Dir {
  452. return Err(SystemError::ENOTDIR);
  453. }
  454. match ino.into() {
  455. 0 => {
  456. return Ok(String::from("."));
  457. }
  458. 1 => {
  459. return Ok(String::from(".."));
  460. }
  461. ino => {
  462. // 暴力遍历所有的children,判断inode id是否相同
  463. // TODO: 优化这里,这个地方性能很差!
  464. let mut key: Vec<String> = inode
  465. .children
  466. .iter()
  467. .filter_map(|(k, v)| {
  468. if v.metadata().unwrap().inode_id.into() == ino {
  469. Some(k.to_string())
  470. } else {
  471. None
  472. }
  473. })
  474. .collect();
  475. match key.len() {
  476. 0=>{return Err(SystemError::ENOENT);}
  477. 1=>{return Ok(key.remove(0));}
  478. _ => panic!("Devfs 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)
  479. }
  480. }
  481. }
  482. }
  483. fn ioctl(
  484. &self,
  485. _cmd: u32,
  486. _data: usize,
  487. _private_data: &FilePrivateData,
  488. ) -> Result<usize, SystemError> {
  489. Err(SystemError::ENOSYS)
  490. }
  491. fn list(&self) -> Result<Vec<String>, SystemError> {
  492. let info = self.metadata()?;
  493. if info.file_type != FileType::Dir {
  494. return Err(SystemError::ENOTDIR);
  495. }
  496. let mut keys: Vec<String> = Vec::new();
  497. keys.push(String::from("."));
  498. keys.push(String::from(".."));
  499. keys.append(
  500. &mut self
  501. .0
  502. .lock()
  503. .children
  504. .keys()
  505. .map(ToString::to_string)
  506. .collect(),
  507. );
  508. return Ok(keys);
  509. }
  510. fn metadata(&self) -> Result<Metadata, SystemError> {
  511. return Ok(self.0.lock().metadata.clone());
  512. }
  513. fn set_metadata(&self, metadata: &Metadata) -> Result<(), SystemError> {
  514. let mut inode = self.0.lock();
  515. inode.metadata.atime = metadata.atime;
  516. inode.metadata.mtime = metadata.mtime;
  517. inode.metadata.ctime = metadata.ctime;
  518. inode.metadata.btime = metadata.btime;
  519. inode.metadata.mode = metadata.mode;
  520. inode.metadata.uid = metadata.uid;
  521. inode.metadata.gid = metadata.gid;
  522. return Ok(());
  523. }
  524. /// 读设备 - 应该调用设备的函数读写,而不是通过文件系统读写,仅支持符号链接的读取
  525. fn read_at(
  526. &self,
  527. offset: usize,
  528. len: usize,
  529. buf: &mut [u8],
  530. _data: SpinLockGuard<FilePrivateData>,
  531. ) -> Result<usize, SystemError> {
  532. let meta = self.metadata()?;
  533. match meta.file_type {
  534. FileType::SymLink => {
  535. if buf.len() < len {
  536. return Err(SystemError::EINVAL);
  537. }
  538. // 加锁
  539. let inode = self.0.lock();
  540. // 检查当前inode是否为一个文件夹,如果是的话,就返回错误
  541. if inode.metadata.file_type == FileType::Dir {
  542. return Err(SystemError::EISDIR);
  543. }
  544. let start = inode.data.len().min(offset);
  545. let end = inode.data.len().min(offset + len);
  546. // buffer空间不足
  547. if buf.len() < (end - start) {
  548. return Err(SystemError::ENOBUFS);
  549. }
  550. // 拷贝数据
  551. let src = &inode.data[start..end];
  552. buf[0..src.len()].copy_from_slice(src);
  553. return Ok(src.len());
  554. }
  555. _ => {
  556. error!("DevFS: read_at is not supported!");
  557. Err(SystemError::ENOSYS)
  558. }
  559. }
  560. }
  561. /// 写设备 - 应该调用设备的函数读写,而不是通过文件系统读写,仅支持符号链接的写入
  562. fn write_at(
  563. &self,
  564. offset: usize,
  565. len: usize,
  566. buf: &[u8],
  567. _data: SpinLockGuard<FilePrivateData>,
  568. ) -> Result<usize, SystemError> {
  569. let meta = self.metadata()?;
  570. match meta.file_type {
  571. FileType::SymLink => {
  572. if buf.len() < len {
  573. return Err(SystemError::EINVAL);
  574. }
  575. let mut inode = self.0.lock();
  576. if inode.metadata.file_type == FileType::Dir {
  577. return Err(SystemError::EISDIR);
  578. }
  579. let data: &mut Vec<u8> = &mut inode.data;
  580. // 如果文件大小比原来的大,那就resize这个数组
  581. if offset + len > data.len() {
  582. data.resize(offset + len, 0);
  583. }
  584. let target = &mut data[offset..offset + len];
  585. target.copy_from_slice(&buf[0..len]);
  586. return Ok(len);
  587. }
  588. _ => {
  589. error!("DevFS: read_at is not supported!");
  590. Err(SystemError::ENOSYS)
  591. }
  592. }
  593. }
  594. fn parent(&self) -> Result<Arc<dyn IndexNode>, SystemError> {
  595. let me = self.0.lock();
  596. Ok(me
  597. .parent
  598. .upgrade()
  599. .unwrap_or(me.self_ref.upgrade().unwrap()))
  600. }
  601. fn dname(&self) -> Result<DName, SystemError> {
  602. Ok(self.0.lock().dname.clone())
  603. }
  604. }
  605. /// @brief 所有的设备INode都需要额外实现这个trait
  606. pub trait DeviceINode: IndexNode {
  607. fn set_fs(&self, fs: Weak<DevFS>);
  608. fn set_parent(&self, parent: Weak<LockedDevFSInode>);
  609. fn set_devpts_fs(&self, _devpts: Weak<DevPtsFs>) {
  610. panic!("DeviceINode: set_devpts_fs is not implemented!");
  611. }
  612. fn set_devpts_parent(&self, _parent: Weak<LockedDevPtsFSInode>) {
  613. panic!("DeviceINode: set_devpts_parent is not implemented!");
  614. }
  615. // TODO: 增加 unregister 方法
  616. }
  617. /// @brief 获取devfs实例的强类型不可变引用
  618. macro_rules! devfs_exact_ref {
  619. () => {{
  620. let devfs_inode: Result<Arc<dyn IndexNode>, SystemError> =
  621. crate::process::ProcessManager::current_mntns()
  622. .root_inode()
  623. .find("dev");
  624. if let Err(e) = devfs_inode {
  625. error!("failed to get DevFS ref. errcode = {:?}", e);
  626. return Err(SystemError::ENOENT);
  627. }
  628. let binding = devfs_inode.unwrap();
  629. let devfs_inode: &LockedDevFSInode = binding
  630. .as_any_ref()
  631. .downcast_ref::<LockedDevFSInode>()
  632. .unwrap();
  633. let binding = devfs_inode.fs();
  634. binding
  635. }
  636. .as_any_ref()
  637. .downcast_ref::<DevFS>()
  638. .unwrap()};
  639. }
  640. /// @brief devfs的设备注册函数
  641. pub fn devfs_register<T: DeviceINode>(name: &str, device: Arc<T>) -> Result<(), SystemError> {
  642. return devfs_exact_ref!().register_device(name, device);
  643. }
  644. /// @brief devfs的设备卸载函数
  645. #[allow(dead_code)]
  646. pub fn devfs_unregister<T: DeviceINode>(name: &str, device: Arc<T>) -> Result<(), SystemError> {
  647. return devfs_exact_ref!().unregister_device(name, device);
  648. }
  649. pub fn devfs_init() -> Result<(), SystemError> {
  650. static INIT: Once = Once::new();
  651. let mut result = None;
  652. INIT.call_once(|| {
  653. info!("Initializing DevFS...");
  654. // 创建 devfs 实例
  655. let devfs: Arc<DevFS> = DevFS::new();
  656. // devfs 挂载
  657. let root_inode = ProcessManager::current_mntns().root_inode();
  658. root_inode
  659. .mkdir("dev", ModeType::from_bits_truncate(0o755))
  660. .expect("Unabled to find /dev")
  661. .mount(devfs, MountFlags::empty())
  662. .expect("Failed to mount at /dev");
  663. info!("DevFS mounted.");
  664. result = Some(Ok(()));
  665. });
  666. return result.unwrap();
  667. }