kthread.rs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517
  1. use core::{
  2. hint::spin_loop,
  3. sync::atomic::{AtomicBool, Ordering},
  4. };
  5. use alloc::{
  6. boxed::Box,
  7. collections::LinkedList,
  8. string::{String, ToString},
  9. sync::{Arc, Weak},
  10. };
  11. use atomic_enum::atomic_enum;
  12. use system_error::SystemError;
  13. use crate::{
  14. arch::{sched::sched, CurrentIrqArch},
  15. exception::{irqdesc::IrqAction, InterruptArch},
  16. init::initial_kthread::initial_kernel_thread,
  17. kinfo,
  18. libs::{once::Once, spinlock::SpinLock},
  19. process::{ProcessManager, ProcessState},
  20. };
  21. use super::{fork::CloneFlags, Pid, ProcessControlBlock, ProcessFlags};
  22. /// 内核线程的创建任务列表
  23. static KTHREAD_CREATE_LIST: SpinLock<LinkedList<Arc<KernelThreadCreateInfo>>> =
  24. SpinLock::new(LinkedList::new());
  25. static mut KTHREAD_DAEMON_PCB: Option<Arc<ProcessControlBlock>> = None;
  26. #[derive(Debug)]
  27. pub enum WorkerPrivate {
  28. KernelThread(KernelThreadPcbPrivate),
  29. }
  30. #[allow(dead_code)]
  31. impl WorkerPrivate {
  32. pub fn kernel_thread(&self) -> Option<&KernelThreadPcbPrivate> {
  33. match self {
  34. Self::KernelThread(x) => Some(x),
  35. }
  36. }
  37. pub fn kernel_thread_mut(&mut self) -> Option<&mut KernelThreadPcbPrivate> {
  38. match self {
  39. Self::KernelThread(x) => Some(x),
  40. }
  41. }
  42. }
  43. bitflags! {
  44. pub struct KernelThreadFlags: u32 {
  45. const IS_PER_CPU = 1 << 0;
  46. const SHOULD_STOP = 1 << 1;
  47. const SHOULD_PARK = 1 << 2;
  48. }
  49. }
  50. #[derive(Debug)]
  51. pub struct KernelThreadPcbPrivate {
  52. flags: KernelThreadFlags,
  53. }
  54. #[allow(dead_code)]
  55. impl KernelThreadPcbPrivate {
  56. pub fn new() -> Self {
  57. Self {
  58. flags: KernelThreadFlags::empty(),
  59. }
  60. }
  61. pub fn flags(&self) -> &KernelThreadFlags {
  62. &self.flags
  63. }
  64. pub fn flags_mut(&mut self) -> &mut KernelThreadFlags {
  65. &mut self.flags
  66. }
  67. }
  68. /// 内核线程的闭包,参数必须与闭包的参数一致,返回值必须是i32
  69. ///
  70. /// 元组的第一个元素是闭包,第二个元素是闭包的参数对象
  71. ///
  72. /// 对于非原始类型的参数,需要使用Box包装
  73. #[allow(dead_code)]
  74. #[allow(clippy::type_complexity)]
  75. pub enum KernelThreadClosure {
  76. UsizeClosure((Box<dyn Fn(usize) -> i32 + Send + Sync>, usize)),
  77. StaticUsizeClosure((&'static fn(usize) -> i32, usize)),
  78. EmptyClosure((Box<dyn Fn() -> i32 + Send + Sync>, ())),
  79. StaticEmptyClosure((&'static fn() -> i32, ())),
  80. IrqThread(
  81. (
  82. &'static dyn Fn(Arc<IrqAction>) -> Result<(), SystemError>,
  83. Arc<IrqAction>,
  84. ),
  85. ),
  86. // 添加其他类型入参的闭包,返回值必须是i32
  87. }
  88. unsafe impl Send for KernelThreadClosure {}
  89. unsafe impl Sync for KernelThreadClosure {}
  90. impl KernelThreadClosure {
  91. pub fn run(self) -> i32 {
  92. match self {
  93. Self::UsizeClosure((func, arg)) => func(arg),
  94. Self::EmptyClosure((func, _arg)) => func(),
  95. Self::StaticUsizeClosure((func, arg)) => func(arg),
  96. Self::StaticEmptyClosure((func, _arg)) => func(),
  97. Self::IrqThread((func, arg)) => {
  98. func(arg).map(|_| 0).unwrap_or_else(|e| e.to_posix_errno())
  99. }
  100. }
  101. }
  102. }
  103. pub struct KernelThreadCreateInfo {
  104. /// 内核线程的入口函数、传入参数
  105. closure: SpinLock<Option<Box<KernelThreadClosure>>>,
  106. /// 内核线程的名字
  107. name: String,
  108. /// 是否已经完成创建 todo:使用comletion机制优化这里
  109. created: AtomicKernelThreadCreateStatus,
  110. result_pcb: SpinLock<Option<Arc<ProcessControlBlock>>>,
  111. /// 不安全的Arc引用计数,当内核线程创建失败时,需要减少这个计数
  112. has_unsafe_arc_instance: AtomicBool,
  113. self_ref: Weak<Self>,
  114. /// 如果该值为true在进入bootstrap stage2之后,就会进入睡眠状态
  115. to_mark_sleep: AtomicBool,
  116. }
  117. #[atomic_enum]
  118. #[derive(PartialEq)]
  119. pub enum KernelThreadCreateStatus {
  120. Created,
  121. NotCreated,
  122. ErrorOccured,
  123. }
  124. #[allow(dead_code)]
  125. impl KernelThreadCreateInfo {
  126. pub fn new(func: KernelThreadClosure, name: String) -> Arc<Self> {
  127. let result = Arc::new(Self {
  128. closure: SpinLock::new(Some(Box::new(func))),
  129. name,
  130. created: AtomicKernelThreadCreateStatus::new(KernelThreadCreateStatus::NotCreated),
  131. result_pcb: SpinLock::new(None),
  132. has_unsafe_arc_instance: AtomicBool::new(false),
  133. self_ref: Weak::new(),
  134. to_mark_sleep: AtomicBool::new(true),
  135. });
  136. let tmp = result.clone();
  137. unsafe {
  138. let tmp = Arc::into_raw(tmp) as *mut Self;
  139. (*tmp).self_ref = Arc::downgrade(&result);
  140. Arc::from_raw(tmp);
  141. }
  142. return result;
  143. }
  144. /// 创建者调用这函数,等待创建完成后,获取创建结果
  145. ///
  146. /// ## 返回值
  147. ///
  148. /// - Some(Arc<ProcessControlBlock>) 创建成功,返回新创建的内核线程的PCB
  149. /// - None 创建失败
  150. pub fn poll_result(&self) -> Option<Arc<ProcessControlBlock>> {
  151. loop {
  152. match self.created.load(Ordering::SeqCst) {
  153. KernelThreadCreateStatus::Created => {
  154. return self.result_pcb.lock().take();
  155. }
  156. KernelThreadCreateStatus::NotCreated => {
  157. spin_loop();
  158. }
  159. KernelThreadCreateStatus::ErrorOccured => {
  160. // 创建失败,减少不安全的Arc引用计数
  161. let to_delete = self.has_unsafe_arc_instance.swap(false, Ordering::SeqCst);
  162. if to_delete {
  163. let self_ref = self.self_ref.upgrade().unwrap();
  164. unsafe { Arc::decrement_strong_count(&self_ref) };
  165. }
  166. return None;
  167. }
  168. }
  169. }
  170. }
  171. pub fn take_closure(&self) -> Option<Box<KernelThreadClosure>> {
  172. return self.closure.lock().take();
  173. }
  174. pub fn name(&self) -> &String {
  175. &self.name
  176. }
  177. pub unsafe fn set_create_ok(&self, pcb: Arc<ProcessControlBlock>) {
  178. // todo: 使用completion机制优化这里
  179. self.result_pcb.lock().replace(pcb);
  180. self.created
  181. .store(KernelThreadCreateStatus::Created, Ordering::SeqCst);
  182. }
  183. /// 生成一个不安全的Arc指针(用于创建内核线程时传递参数)
  184. pub fn generate_unsafe_arc_ptr(self: Arc<Self>) -> *const Self {
  185. assert!(
  186. self.has_unsafe_arc_instance
  187. .compare_exchange(false, true, Ordering::SeqCst, Ordering::SeqCst)
  188. .is_ok(),
  189. "Cannot generate unsafe arc ptr when there is already one."
  190. );
  191. let ptr = Arc::into_raw(self);
  192. return ptr;
  193. }
  194. pub unsafe fn parse_unsafe_arc_ptr(ptr: *const Self) -> Arc<Self> {
  195. let arc = Arc::from_raw(ptr);
  196. assert!(
  197. arc.has_unsafe_arc_instance
  198. .compare_exchange(true, false, Ordering::SeqCst, Ordering::SeqCst)
  199. .is_ok(),
  200. "Cannot parse unsafe arc ptr when there is no one."
  201. );
  202. assert!(Arc::strong_count(&arc) > 0);
  203. return arc;
  204. }
  205. /// 设置是否在进入bootstrap stage2之后,就进入睡眠状态
  206. ///
  207. /// ## 参数
  208. ///
  209. /// - to_mark_sleep: 是否在进入bootstrap stage2之后,就进入睡眠状态
  210. ///
  211. /// ## 返回值
  212. /// 如果已经创建完成,返回EINVAL
  213. pub fn set_to_mark_sleep(&self, to_mark_sleep: bool) -> Result<(), SystemError> {
  214. let result_guard = self.result_pcb.lock();
  215. if result_guard.is_some() {
  216. // 已经创建完成,不需要设置
  217. return Err(SystemError::EINVAL);
  218. }
  219. self.to_mark_sleep.store(to_mark_sleep, Ordering::SeqCst);
  220. return Ok(());
  221. }
  222. pub fn to_mark_sleep(&self) -> bool {
  223. self.to_mark_sleep.load(Ordering::SeqCst)
  224. }
  225. }
  226. pub struct KernelThreadMechanism;
  227. impl KernelThreadMechanism {
  228. pub fn init_stage1() {
  229. assert!(ProcessManager::current_pcb().pid() == Pid::new(0));
  230. kinfo!("Initializing kernel thread mechanism stage1...");
  231. // 初始化第一个内核线程
  232. let create_info = KernelThreadCreateInfo::new(
  233. KernelThreadClosure::EmptyClosure((Box::new(initial_kernel_thread), ())),
  234. "init".to_string(),
  235. );
  236. let irq_guard: crate::exception::IrqFlagsGuard =
  237. unsafe { CurrentIrqArch::save_and_disable_irq() };
  238. // 由于当前是pid=0的idle进程,而__inner_create要求当前是kthread,所以先临时设置为kthread
  239. ProcessManager::current_pcb()
  240. .flags
  241. .get_mut()
  242. .insert(ProcessFlags::KTHREAD);
  243. create_info
  244. .set_to_mark_sleep(false)
  245. .expect("Failed to set to_mark_sleep");
  246. KernelThreadMechanism::__inner_create(
  247. &create_info,
  248. CloneFlags::CLONE_VM | CloneFlags::CLONE_SIGNAL,
  249. )
  250. .unwrap_or_else(|e| panic!("Failed to create initial kernel thread, error: {:?}", e));
  251. ProcessManager::current_pcb()
  252. .flags
  253. .get_mut()
  254. .remove(ProcessFlags::KTHREAD);
  255. drop(irq_guard);
  256. kinfo!("Initializing kernel thread mechanism stage1 complete");
  257. }
  258. pub fn init_stage2() {
  259. assert!(ProcessManager::current_pcb()
  260. .flags()
  261. .contains(ProcessFlags::KTHREAD));
  262. static INIT: Once = Once::new();
  263. INIT.call_once(|| {
  264. kinfo!("Initializing kernel thread mechanism stage2...");
  265. // 初始化kthreadd
  266. let closure = KernelThreadClosure::EmptyClosure((Box::new(Self::kthread_daemon), ()));
  267. let info = KernelThreadCreateInfo::new(closure, "kthreadd".to_string());
  268. let kthreadd_pid: Pid = Self::__inner_create(
  269. &info,
  270. CloneFlags::CLONE_VM | CloneFlags::CLONE_FS | CloneFlags::CLONE_SIGNAL,
  271. )
  272. .expect("Failed to create kthread daemon");
  273. let pcb = ProcessManager::find(kthreadd_pid).unwrap();
  274. ProcessManager::wakeup(&pcb).expect("Failed to wakeup kthread daemon");
  275. unsafe {
  276. KTHREAD_DAEMON_PCB.replace(pcb);
  277. }
  278. kinfo!("Initialize kernel thread mechanism stage2 complete");
  279. });
  280. }
  281. /// 创建一个新的内核线程
  282. ///
  283. /// ## 参数
  284. ///
  285. /// - func: 内核线程的入口函数、传入参数
  286. /// - name: 内核线程的名字
  287. ///
  288. /// ## 返回值
  289. ///
  290. /// - Some(Arc<ProcessControlBlock>) 创建成功,返回新创建的内核线程的PCB
  291. #[allow(dead_code)]
  292. pub fn create(func: KernelThreadClosure, name: String) -> Option<Arc<ProcessControlBlock>> {
  293. let info = KernelThreadCreateInfo::new(func, name);
  294. while unsafe { KTHREAD_DAEMON_PCB.is_none() } {
  295. // 等待kthreadd启动
  296. spin_loop()
  297. }
  298. KTHREAD_CREATE_LIST.lock().push_back(info.clone());
  299. ProcessManager::wakeup(unsafe { KTHREAD_DAEMON_PCB.as_ref().unwrap() })
  300. .expect("Failed to wakeup kthread daemon");
  301. return info.poll_result();
  302. }
  303. /// 创建并运行一个新的内核线程
  304. ///
  305. /// ## 参数
  306. ///
  307. /// - func: 内核线程的入口函数、传入参数
  308. /// - name: 内核线程的名字
  309. ///
  310. /// ## 返回值
  311. ///
  312. /// - Some(Arc<ProcessControlBlock>) 创建成功,返回新创建的内核线程的PCB
  313. #[allow(dead_code)]
  314. pub fn create_and_run(
  315. func: KernelThreadClosure,
  316. name: String,
  317. ) -> Option<Arc<ProcessControlBlock>> {
  318. let pcb = Self::create(func, name)?;
  319. ProcessManager::wakeup(&pcb)
  320. .unwrap_or_else(|_| panic!("Failed to wakeup kthread: {:?}", pcb.pid()));
  321. return Some(pcb);
  322. }
  323. /// 停止一个内核线程
  324. ///
  325. /// 如果目标内核线程的数据检查失败,会panic
  326. ///
  327. /// ## 返回值
  328. ///
  329. /// - Ok(i32) 目标内核线程的退出码
  330. #[allow(dead_code)]
  331. pub fn stop(pcb: &Arc<ProcessControlBlock>) -> Result<usize, SystemError> {
  332. if !pcb.flags().contains(ProcessFlags::KTHREAD) {
  333. panic!("Cannt stop a non-kthread process");
  334. }
  335. let mut worker_private = pcb.worker_private();
  336. assert!(
  337. worker_private.is_some(),
  338. "kthread stop: worker_private is none, pid: {:?}",
  339. pcb.pid()
  340. );
  341. worker_private
  342. .as_mut()
  343. .unwrap()
  344. .kernel_thread_mut()
  345. .expect("Error type of worker private")
  346. .flags
  347. .insert(KernelThreadFlags::SHOULD_STOP);
  348. drop(worker_private);
  349. ProcessManager::wakeup(pcb).ok();
  350. // 忙等目标内核线程退出
  351. // todo: 使用completion机制优化这里
  352. loop {
  353. if let ProcessState::Exited(code) = pcb.sched_info().inner_lock_read_irqsave().state() {
  354. return Ok(code);
  355. }
  356. spin_loop();
  357. }
  358. }
  359. /// 判断一个内核线程是否应当停止
  360. ///
  361. /// ## 参数
  362. ///
  363. /// - pcb: 目标内核线程的PCB
  364. ///
  365. /// ## 返回值
  366. ///
  367. /// - bool 是否应当停止. true表示应当停止,false表示不应当停止. 如果目标进程不是内核线程,返回false
  368. ///
  369. /// ## Panic
  370. ///
  371. /// 如果目标内核线程的数据检查失败,会panic
  372. #[allow(dead_code)]
  373. pub fn should_stop(pcb: &Arc<ProcessControlBlock>) -> bool {
  374. if !pcb.flags().contains(ProcessFlags::KTHREAD) {
  375. return false;
  376. }
  377. let worker_private = pcb.worker_private();
  378. assert!(
  379. worker_private.is_some(),
  380. "kthread should_stop: worker_private is none, pid: {:?}",
  381. pcb.pid()
  382. );
  383. return worker_private
  384. .as_ref()
  385. .unwrap()
  386. .kernel_thread()
  387. .expect("Error type of worker private")
  388. .flags
  389. .contains(KernelThreadFlags::SHOULD_STOP);
  390. }
  391. /// A daemon thread which creates other kernel threads
  392. #[inline(never)]
  393. fn kthread_daemon() -> i32 {
  394. let current_pcb = ProcessManager::current_pcb();
  395. {
  396. // 初始化worker_private
  397. let mut worker_private_guard = current_pcb.worker_private();
  398. let worker_private = WorkerPrivate::KernelThread(KernelThreadPcbPrivate::new());
  399. *worker_private_guard = Some(worker_private);
  400. }
  401. // 设置为kthread
  402. current_pcb.flags().insert(ProcessFlags::KTHREAD);
  403. drop(current_pcb);
  404. loop {
  405. let mut list = KTHREAD_CREATE_LIST.lock();
  406. while let Some(info) = list.pop_front() {
  407. drop(list);
  408. // create a new kernel thread
  409. let result: Result<Pid, SystemError> = Self::__inner_create(
  410. &info,
  411. CloneFlags::CLONE_VM | CloneFlags::CLONE_FS | CloneFlags::CLONE_SIGNAL,
  412. );
  413. if result.is_err() {
  414. // 创建失败
  415. info.created
  416. .store(KernelThreadCreateStatus::ErrorOccured, Ordering::SeqCst);
  417. };
  418. list = KTHREAD_CREATE_LIST.lock();
  419. }
  420. drop(list);
  421. let irq_guard = unsafe { CurrentIrqArch::save_and_disable_irq() };
  422. ProcessManager::mark_sleep(true).ok();
  423. drop(irq_guard);
  424. sched();
  425. }
  426. }
  427. }
  428. /// 内核线程启动的第二阶段
  429. ///
  430. /// 该函数只能被`kernel_thread_bootstrap_stage1`调用(jmp到该函数)
  431. ///
  432. /// ## 参数
  433. ///
  434. /// - ptr: 传入的参数,是一个指向`Arc<KernelThreadCreateInfo>`的指针
  435. pub unsafe extern "C" fn kernel_thread_bootstrap_stage2(ptr: *const KernelThreadCreateInfo) -> ! {
  436. let info = KernelThreadCreateInfo::parse_unsafe_arc_ptr(ptr);
  437. let closure: Box<KernelThreadClosure> = info.take_closure().unwrap();
  438. info.set_create_ok(ProcessManager::current_pcb());
  439. let to_mark_sleep = info.to_mark_sleep();
  440. drop(info);
  441. if to_mark_sleep {
  442. // 进入睡眠状态
  443. let irq_guard = CurrentIrqArch::save_and_disable_irq();
  444. ProcessManager::mark_sleep(true).expect("Failed to mark sleep");
  445. drop(irq_guard);
  446. sched();
  447. }
  448. let mut retval = SystemError::EINTR.to_posix_errno();
  449. if !KernelThreadMechanism::should_stop(&ProcessManager::current_pcb()) {
  450. retval = closure.run();
  451. }
  452. ProcessManager::exit(retval as usize);
  453. }
  454. /// 初始化内核线程机制
  455. #[inline(never)]
  456. pub fn kthread_init() {
  457. static INIT: Once = Once::new();
  458. INIT.call_once(|| {
  459. KernelThreadMechanism::init_stage1();
  460. });
  461. }