mod.rs 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. use core::ops::{Deref, DerefMut};
  2. use super::device::{mkdev, DeviceNumber, KObject};
  3. use crate::libs::spinlock::{SpinLock, SpinLockGuard};
  4. use alloc::{collections::BTreeMap, sync::Arc, vec::Vec};
  5. const KOBJMAP_HASH_SIZE: usize = 255;
  6. pub(crate) const DEV_MAJOR_HASH_SIZE: usize = 255;
  7. pub(crate) const DEV_MAJOR_MAX: usize = 512;
  8. pub(crate) const MINOR_BITS: usize = 20;
  9. pub(crate) const MINOR_MASK: usize = 1 << MINOR_BITS - 1;
  10. /* Marks the bottom of the first segment of free char majors */
  11. pub(crate) const DEV_MAJOR_DYN_END: usize = 234;
  12. /* Marks the top and bottom of the second segment of free char majors */
  13. pub(crate) const DEV_MAJOR_DYN_EXT_START: usize = 511;
  14. pub(crate) const DEV_MAJOR_DYN_EXT_END: usize = 384;
  15. /// @brief: 字符设备与块设备管理结构体
  16. #[derive(Debug, Clone)]
  17. struct Probe(Arc<dyn KObject>);
  18. impl Probe {
  19. /// @brief: 新建probe实例
  20. /// @parameter: data: probe实例
  21. /// @return: probe实例
  22. pub fn new(data: Arc<dyn KObject>) -> Self {
  23. Self(data)
  24. }
  25. }
  26. /// @brief: 字符设备和块设备管理实例(锁)
  27. #[derive(Debug)]
  28. pub struct LockedKObjMap(SpinLock<KObjMap>);
  29. impl Default for LockedKObjMap {
  30. fn default() -> Self {
  31. Self(SpinLock::new(KObjMap::default()))
  32. }
  33. }
  34. /// @brief: 字符设备和块设备管理实例
  35. #[derive(Debug, Clone)]
  36. struct KObjMap(Vec<BTreeMap<DeviceNumber, Probe>>);
  37. impl Default for KObjMap {
  38. fn default() -> Self {
  39. Self(vec![BTreeMap::new(); KOBJMAP_HASH_SIZE])
  40. }
  41. }
  42. /// @brief: obj设备注册
  43. /// @parameter: domain: 管理实例
  44. /// dev_t: 设备号
  45. /// range: 次设备号范围
  46. /// data: 设备实例
  47. /// @return: none
  48. pub fn kobj_map(
  49. domain: Arc<LockedKObjMap>,
  50. dev_t: DeviceNumber,
  51. range: usize,
  52. data: Arc<dyn KObject>,
  53. ) {
  54. if let Some(map) = domain.0.lock().0.get_mut(dev_t.major() % 255) {
  55. for i in 0..range {
  56. map.insert(
  57. mkdev(dev_t.major(), dev_t.minor() + i),
  58. Probe::new(data.clone()),
  59. );
  60. }
  61. }
  62. }
  63. /// @brief: obj设备注销
  64. /// @parameter: domain: 管理实例
  65. /// dev_t: 设备号
  66. /// range: 次设备号范围
  67. /// @return: none
  68. pub fn kobj_unmap(domain: Arc<LockedKObjMap>, dev_t: DeviceNumber, range: usize) {
  69. if let Some(map) = domain.0.lock().0.get_mut(dev_t.major() % 255) {
  70. for i in 0..range {
  71. let rm_dev_t = &DeviceNumber::new(Into::<usize>::into(dev_t) + i);
  72. match map.get(rm_dev_t) {
  73. Some(_) => {
  74. map.remove(rm_dev_t);
  75. }
  76. None => {}
  77. }
  78. }
  79. }
  80. }
  81. /// @brief: 设备查找
  82. /// @parameter: domain: 管理实例
  83. /// dev_t: 设备号
  84. /// @return: 查找成功,返回设备实例,否则返回None
  85. #[allow(dead_code)]
  86. pub fn kobj_lookup(domain: Arc<LockedKObjMap>, dev_t: DeviceNumber) -> Option<Arc<dyn KObject>> {
  87. if let Some(map) = domain.0.lock().0.get(dev_t.major() % 255) {
  88. match map.get(&dev_t) {
  89. Some(value) => {
  90. return Some(value.0.clone());
  91. }
  92. None => {
  93. return None;
  94. }
  95. }
  96. }
  97. return None;
  98. }
  99. // 管理字符设备号的map(加锁)
  100. pub struct LockedDevsMap(SpinLock<DevsMap>);
  101. impl Default for LockedDevsMap {
  102. fn default() -> Self {
  103. LockedDevsMap(SpinLock::new(DevsMap::default()))
  104. }
  105. }
  106. impl LockedDevsMap {
  107. #[inline(always)]
  108. pub fn lock(&self) -> SpinLockGuard<DevsMap> {
  109. self.0.lock()
  110. }
  111. }
  112. // 管理字符设备号的map
  113. #[derive(Debug)]
  114. pub struct DevsMap(Vec<Vec<DeviceStruct>>);
  115. impl Default for DevsMap {
  116. fn default() -> Self {
  117. DevsMap(vec![Vec::new(); DEV_MAJOR_HASH_SIZE])
  118. }
  119. }
  120. impl Deref for DevsMap {
  121. type Target = Vec<Vec<DeviceStruct>>;
  122. fn deref(&self) -> &Self::Target {
  123. &self.0
  124. }
  125. }
  126. impl DerefMut for DevsMap {
  127. fn deref_mut(&mut self) -> &mut Self::Target {
  128. &mut self.0
  129. }
  130. }
  131. // 字符设备在系统中的实例,devfs通过该结构与实际字符设备进行联系
  132. #[allow(dead_code)]
  133. #[derive(Debug, Clone)]
  134. pub struct DeviceStruct {
  135. dev_t: DeviceNumber, //起始设备号
  136. minorct: usize, // 次设备号数量
  137. name: &'static str, //字符设备名
  138. }
  139. impl DeviceStruct {
  140. /// @brief: 创建实例
  141. /// @parameter: dev_t: 设备号
  142. /// minorct: 次设备号数量
  143. /// name: 字符设备名
  144. /// char: 字符设备实例
  145. /// @return: 实例
  146. ///
  147. #[allow(dead_code)]
  148. pub fn new(dev_t: DeviceNumber, minorct: usize, name: &'static str) -> Self {
  149. Self {
  150. dev_t,
  151. minorct,
  152. name,
  153. }
  154. }
  155. /// @brief: 获取起始次设备号
  156. /// @parameter: None
  157. /// @return: 起始设备号
  158. ///
  159. #[allow(dead_code)]
  160. pub fn device_number(&self) -> DeviceNumber {
  161. self.dev_t
  162. }
  163. /// @brief: 获取起始次设备号
  164. /// @parameter: None
  165. /// @return: 起始设备号
  166. ///
  167. #[allow(dead_code)]
  168. pub fn base_minor(&self) -> usize {
  169. self.dev_t.minor()
  170. }
  171. /// @brief: 获取次设备号数量
  172. /// @parameter: None
  173. /// @return: 次设备号数量
  174. #[allow(dead_code)]
  175. pub fn minorct(&self) -> usize {
  176. self.minorct
  177. }
  178. }