feat: page caching layer for vfs
[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     pid_t pgid;
83 };
84
85 extern volatile struct proc_info* __current;
86
87 /**
88  * @brief 分配并初始化一个进程控制块
89  *
90  * @return struct proc_info*
91  */
92 struct proc_info*
93 alloc_process();
94
95 /**
96  * @brief 初始化进程用户空间
97  *
98  * @param pcb
99  */
100 void
101 init_proc_user_space(struct proc_info* pcb);
102
103 /**
104  * @brief 向系统发布一个进程,使其可以被调度。
105  *
106  * @param process
107  */
108 void
109 commit_process(struct proc_info* process);
110
111 pid_t
112 destroy_process(pid_t pid);
113
114 void
115 setup_proc_mem(struct proc_info* proc, uintptr_t kstack_from);
116
117 /**
118  * @brief 复制当前进程(LunaixOS的类 fork (unix) 实现)
119  *
120  */
121 pid_t
122 dup_proc();
123
124 /**
125  * @brief 创建新进程(LunaixOS的类 CreateProcess (Windows) 实现)
126  *
127  */
128 void
129 new_proc();
130
131 /**
132  * @brief 终止(退出)当前进程
133  *
134  */
135 void
136 terminate_proc(int exit_code);
137
138 int
139 orphaned_proc(pid_t pid);
140
141 struct proc_info*
142 get_process(pid_t pid);
143
144 #endif /* __LUNAIX_PROCESS_H */