refactor: kernel space yield() for controllable, flexible task switching
[lunaix-os.git] / lunaix-os / includes / lunaix / process.h
1 #ifndef __LUNAIX_PROCESS_H
2 #define __LUNAIX_PROCESS_H
3
4 #include <arch/x86/interrupts.h>
5 #include <lunaix/clock.h>
6 #include <lunaix/fs.h>
7 #include <lunaix/mm/mm.h>
8 #include <lunaix/signal.h>
9 #include <lunaix/timer.h>
10 #include <lunaix/types.h>
11 #include <stdint.h>
12
13 // 虽然内核不是进程,但为了区分,这里使用Pid=-1来指代内核。这主要是方便物理页所有权检查。
14 #define KERNEL_PID -1
15
16 #define PS_STOPPED 0
17 #define PS_RUNNING 1
18 #define PS_TERMNAT 2
19 #define PS_DESTROY 4
20 #define PS_BLOCKED 8
21 #define PS_CREATED 16
22
23 #define PROC_TERMINATED(state) (state & 0x6)
24
25 #define PROC_FINPAUSE 1
26
27 struct proc_mm
28 {
29     heap_context_t u_heap;
30     struct mm_region regions;
31 };
32
33 struct proc_sig
34 {
35     void* signal_handler;
36     int sig_num;
37     isr_param prev_context;
38 };
39
40 #define PROC_SIG_SIZE sizeof(struct proc_sig) // size=84
41
42 struct proc_info
43 {
44     /*
45         Any change to *critical section*, including layout, size
46         must be reflected in kernel/asm/x86/interrupt.S to avoid
47         disaster!
48      */
49
50     /* ---- critical section start ---- */
51
52     pid_t pid;
53     struct proc_info* parent;
54     isr_param intr_ctx; // size=76
55     uintptr_t ustack_top;
56     void* page_table;
57
58     /* ---- critical section end ---- */
59
60     struct llist_header siblings;
61     struct llist_header children;
62     struct llist_header grp_member;
63
64     struct
65     {
66         struct llist_header sleepers;
67         time_t wakeup_time;
68         time_t alarm_time;
69     } sleep;
70
71     struct proc_mm mm;
72     time_t created;
73     uint8_t state;
74     int32_t exit_code;
75     int32_t k_status;
76     sigset_t sig_pending;
77     sigset_t sig_mask;
78     sigset_t sig_inprogress;
79     int flags;
80     void* sig_handler[_SIG_NUM];
81     struct v_fdtable* fdtable;
82     struct v_dnode* cwd;
83     pid_t pgid;
84 };
85
86 extern volatile struct proc_info* __current;
87
88 /**
89  * @brief 分配并初始化一个进程控制块
90  *
91  * @return struct proc_info*
92  */
93 struct proc_info*
94 alloc_process();
95
96 /**
97  * @brief 初始化进程用户空间
98  *
99  * @param pcb
100  */
101 void
102 init_proc_user_space(struct proc_info* pcb);
103
104 /**
105  * @brief 向系统发布一个进程,使其可以被调度。
106  *
107  * @param process
108  */
109 void
110 commit_process(struct proc_info* process);
111
112 pid_t
113 destroy_process(pid_t pid);
114
115 void
116 setup_proc_mem(struct proc_info* proc, uintptr_t kstack_from);
117
118 /**
119  * @brief 复制当前进程(LunaixOS的类 fork (unix) 实现)
120  *
121  */
122 pid_t
123 dup_proc();
124
125 /**
126  * @brief 创建新进程(LunaixOS的类 CreateProcess (Windows) 实现)
127  *
128  */
129 void
130 new_proc();
131
132 /**
133  * @brief 终止(退出)当前进程
134  *
135  */
136 void
137 terminate_proc(int exit_code);
138
139 int
140 orphaned_proc(pid_t pid);
141
142 struct proc_info*
143 get_process(pid_t pid);
144
145 #endif /* __LUNAIX_PROCESS_H */