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