550W Document
550W, a high-end OS
pcb.h
浏览该文件的文档.
1 #pragma once
2 
3 #include <asm/context.h>
4 #include <common/elf.h>
5 #include <lib/list.h>
6 #include <os/cpu.h>
7 #include <os/lock.h>
8 #include <os/mm.h>
9 #include <os/sync.h>
10 #include <os/time.h>
11 
12 #define NUM_MAX_PCB_NAME 20
13 #define NUM_MAX_PROCESS 16
14 #define NUM_MAX_CHILD 5
15 #define NUM_MAX_CHILD_THREADS 5
16 #define NUM_MAX_TASK (1 + NUM_MAX_CHILD + NUM_MAX_CHILD_THREADS) * NUM_MAX_PROCESS
17 #define NUM_MAX_LOCK 16
18 #define NUM_MAX_MBOX 16
19 
20 #define WNOHANG 0x00000001
21 #define WUNTRACED 0x00000002
22 #define WSTOPPED WUNTRACED
23 #define WEXITED 0x00000004
24 #define WCONTINUED 0x00000008
25 #define WNOWAIT 0x01000000 /* Don't reap, just poll status. */
26 
27 #define __WNOTHREAD 0x20000000 /* Don't wait on children of other threads in this group */
28 #define __WALL 0x40000000 /* Wait on all children, regardless of type */
29 #define __WCLONE 0x80000000 /* Wait only on non-SIGCHLD children */
30 
31 #define PRIO_MIN (-20)
32 #define PRIO_MAX 20
33 
34 #define PRIO_PROCESS 0
35 #define PRIO_PGRP 1
36 #define PRIO_USER 2
37 
38 /*
39  * cloning flags:
40  */
41 #define CSIGNAL 0x000000ff /* signal mask to be sent at exit */
42 #define CLONE_VM 0x00000100 /* set if VM shared between processes */
43 #define CLONE_FS 0x00000200 /* set if fs info shared between processes */
44 #define CLONE_FILES 0x00000400 /* set if open files shared between processes */
45 #define CLONE_SIGHAND 0x00000800 /* set if signal handlers and blocked signals shared */
46 #define CLONE_PIDFD 0x00001000 /* set if a pidfd should be placed in parent */
47 #define CLONE_PTRACE 0x00002000 /* set if we want to let tracing continue on the child too */
48 #define CLONE_VFORK 0x00004000 /* set if the parent wants the child to wake it up on mm_release */
49 #define CLONE_PARENT 0x00008000 /* set if we want to have the same parent as the cloner */
50 #define CLONE_THREAD 0x00010000 /* Same thread group? */
51 #define CLONE_NEWNS 0x00020000 /* New mount namespace group */
52 #define CLONE_SYSVSEM 0x00040000 /* share system V SEM_UNDO semantics */
53 #define CLONE_SETTLS 0x00080000 /* create a new TLS for the child */
54 #define CLONE_PARENT_SETTID 0x00100000 /* set the TID in the parent */
55 #define CLONE_CHILD_CLEARTID 0x00200000 /* clear the TID in the child */
56 #define CLONE_DETACHED 0x00400000 /* Unused, ignored */
57 #define CLONE_UNTRACED 0x00800000 /* set if the tracing process can't force CLONE_PTRACE on this clone */
58 #define CLONE_CHILD_SETTID 0x01000000 /* set the TID in the child */
59 #define CLONE_NEWCGROUP 0x02000000 /* New cgroup namespace */
60 #define CLONE_NEWUTS 0x04000000 /* New utsname namespace */
61 #define CLONE_NEWIPC 0x08000000 /* New ipc namespace */
62 #define CLONE_NEWUSER 0x10000000 /* New user namespace */
63 #define CLONE_NEWPID 0x20000000 /* New pid namespace */
64 #define CLONE_NEWNET 0x40000000 /* New network namespace */
65 #define CLONE_IO 0x80000000 /* Clone io context */
66 
67 typedef void (*void_task)();
68 
69 typedef struct prior {
70  long priority;
71  uint64_t last_sched_time;
73 
74 typedef enum task_status {
80 
81 typedef enum task_type {
87 
88 typedef enum enqueue_way {
92 
93 typedef enum dequeue_way {
97 
98 typedef enum unblock_way {
104 
105 typedef struct rusage {
106  __kernel_timeval_t ru_utime; /* user time used */
107  __kernel_timeval_t ru_stime; /* system time used */
108  __kernel_long_t ru_maxrss; /* maximum resident set size */
109  __kernel_long_t ru_ixrss; /* integral shared memory size */
110  __kernel_long_t ru_idrss; /* integral unshared data size */
111  __kernel_long_t ru_isrss; /* integral unshared stack size */
112  __kernel_long_t ru_minflt; /* page reclaims */
113  __kernel_long_t ru_majflt; /* page faults */
115  __kernel_long_t ru_inblock; /* block input operations */
116  __kernel_long_t ru_oublock; /* block output operations */
117  __kernel_long_t ru_msgsnd; /* messages sent */
118  __kernel_long_t ru_msgrcv; /* messages received */
119  __kernel_long_t ru_nsignals; /* signals received */
120  __kernel_long_t ru_nvcsw; /* voluntary context switches */
121  __kernel_long_t ru_nivcsw; /* involuntary " */
123 
125 
126 /* Process Control Block */
127 typedef struct pcb {
128  /* register context */
129  // this must be this order!! The order is defined in regs.h
132 
133  /* previous, next pointer */
135 
138 
139  bool in_use;
141 
142  /* process id */
144  pid_t pid; // real offset of pcb[]
145  pid_t fpid; // threads' fpid is process pid
147  uint32_t *clear_ctid;
154 
155  /* kernel/user thread/process */
157 
158  /* BLOCK | READY | RUNNING | ZOMBIE */
161 
162  /* cursor position */
163  int cursor_x;
164  int cursor_y;
165 
167 
168  uint8_t core_mask[CPU_SET_SIZE];
169 
170  uint64_t pgdir;
171 
172  int locksum;
174  void *chan;
175 
177 
178  /* time */
179  __kernel_timeval_t stime_last; // last time into kernel
180  __kernel_timeval_t utime_last; // last time out kernel
184 
187 
188 /* current running task PCB */
189 extern pcb_t *volatile current_running0;
190 extern pcb_t *volatile current_running1;
191 extern pcb_t *volatile *volatile current_running;
192 /* ready queue to run */
193 extern list_head ready_queue;
194 extern list_head block_queue;
195 
196 extern pcb_t pcb[NUM_MAX_TASK];
197 // pcb_t kernel_pcb[NR_CPUS];
198 extern const ptr_t pid0_stack;
199 extern const ptr_t pid0_stack2;
200 extern pcb_t pid0_pcb;
201 extern pcb_t pid0_pcb2;
202 
203 extern pid_t freepid[NUM_MAX_TASK];
204 
205 void k_pcb_init();
206 extern void switch_to(pcb_t *prev, pcb_t *next);
207 long k_pcb_scheduler(void);
208 void k_pcb_block(list_head *, list_head *queue, enqueue_way_t way);
210 long k_pcb_getpid(void);
211 void k_pcb_sleep(void *chan, spin_lock_t *lk);
212 void k_pcb_wakeup(void *chan);
213 
214 long sys_sched_yield(void);
215 long sys_nanosleep(nanotime_val_t *rqtp, nanotime_val_t *rmtp);
216 long sys_spawn(const char *file_name);
217 long sys_fork(void);
218 long sys_exec(const char *file_name, const char *argv[], const char *envp[]);
219 long sys_execve(const char *file_name, const char *argv[], const char *envp[]);
220 long sys_clone(unsigned long flags, void *stack, pid_t *parent_tid, void *tls, pid_t *child_tid);
221 long sys_kill(pid_t pid);
222 long sys_exit(int error_code);
223 long sys_wait4(pid_t pid, int *stat_addr, int options, rusage_t *ru);
224 long sys_process_show();
225 long sys_setpriority(int which, int who, int niceval);
226 long sys_getpriority(int which, int who);
227 long sys_getpid(void);
228 long sys_getppid(void);
229 long sys_sched_setaffinity(pid_t pid, unsigned int len, const uint8_t *user_mask_ptr);
230 long sys_sched_getaffinity(pid_t pid, unsigned int len, uint8_t *user_mask_ptr);
struct rusage rusage_t
enum enqueue_way enqueue_way_t
enum task_type task_type_t
#define NUM_MAX_PROCESS
Definition: pcb.h:13
task_status
Definition: pcb.h:74
@ TASK_BLOCKED
Definition: pcb.h:75
@ TASK_EXITED
Definition: pcb.h:78
@ TASK_RUNNING
Definition: pcb.h:76
@ TASK_READY
Definition: pcb.h:77
void k_pcb_unblock(list_head *, list_head *, unblock_way_t way)
Definition: pcb.c:325
long sys_sched_getaffinity(pid_t pid, unsigned int len, uint8_t *user_mask_ptr)
Definition: pcb.c:364
const ptr_t pid0_stack2
Definition: pcb.c:25
void switch_to(pcb_t *prev, pcb_t *next)
void k_pcb_wakeup(void *chan)
Definition: pcb.c:733
list_head block_queue
long sys_setpriority(int which, int who, int niceval)
Definition: pcb.c:135
enum dequeue_way dequeue_way_t
struct pcb pcb_t
long sys_getpid(void)
[SYSCALL] getpid: get current task process id
Definition: pcb.c:711
enum unblock_way unblock_way_t
long k_pcb_getpid(void)
Definition: pcb.c:702
long sys_sched_setaffinity(pid_t pid, unsigned int len, const uint8_t *user_mask_ptr)
Definition: pcb.c:350
void k_pcb_sleep(void *chan, spin_lock_t *lk)
Definition: pcb.c:724
void(* void_task)()
Definition: pcb.h:67
enum task_status task_status_t
list_head ready_queue
long sys_spawn(const char *file_name)
Definition: pcb.c:404
long sys_wait4(pid_t pid, int *stat_addr, int options, rusage_t *ru)
Definition: pcb.c:508
pcb_t *volatile current_running1
Definition: pcb.c:16
enqueue_way
Definition: pcb.h:88
@ ENQUEUE_TIMER_LIST
Definition: pcb.h:90
@ ENQUEUE_LIST
Definition: pcb.h:89
long sys_exec(const char *file_name, const char *argv[], const char *envp[])
Definition: pcb.c:634
long sys_process_show()
Definition: pcb.c:550
long sys_getpriority(int which, int who)
Definition: pcb.c:164
pcb_t *volatile *volatile current_running
Definition: pcb.c:17
pcb_t pid0_pcb2
Definition: pcb.c:27
pcb_t *volatile current_running0
Definition: pcb.c:15
long sys_nanosleep(nanotime_val_t *rqtp, nanotime_val_t *rmtp)
Definition: pcb.c:263
pid_t freepid[NUM_MAX_TASK]
Definition: pcb.c:29
long sys_fork(void)
Definition: pcb.c:412
unblock_way
Definition: pcb.h:98
@ UNBLOCK_TO_LIST_BACK
Definition: pcb.h:100
@ UNBLOCK_ONLY
Definition: pcb.h:101
@ UNBLOCK_TO_LIST_STRATEGY
Definition: pcb.h:102
@ UNBLOCK_TO_LIST_FRONT
Definition: pcb.h:99
dequeue_way
Definition: pcb.h:93
@ DEQUEUE_LIST
Definition: pcb.h:94
@ DEQUEUE_LIST_STRATEGY
Definition: pcb.h:95
struct prior prior_t
#define NUM_MAX_PCB_NAME
Definition: pcb.h:12
#define NUM_MAX_TASK
Definition: pcb.h:16
long sys_sched_yield(void)
Definition: pcb.c:316
long sys_exit(int error_code)
Definition: pcb.c:491
pcb_t pid0_pcb
Definition: pcb.c:26
long k_pcb_scheduler(void)
Definition: pcb.c:290
long sys_getppid(void)
[SYSCALL] getppid: get parent of current task pid
Definition: pcb.c:720
long sys_kill(pid_t pid)
Definition: pcb.c:479
task_type
Definition: pcb.h:81
@ KERNEL_PROCESS
Definition: pcb.h:82
@ USER_PROCESS
Definition: pcb.h:84
@ KERNEL_THREAD
Definition: pcb.h:83
@ USER_THREAD
Definition: pcb.h:85
#define NUM_MAX_CHILD_THREADS
Definition: pcb.h:15
const ptr_t pid0_stack
Definition: pcb.c:24
#define NUM_MAX_CHILD
Definition: pcb.h:14
void k_pcb_block(list_head *, list_head *queue, enqueue_way_t way)
Definition: pcb.c:320
long sys_execve(const char *file_name, const char *argv[], const char *envp[])
Definition: pcb.c:638
#define NUM_MAX_LOCK
Definition: pcb.h:17
void k_pcb_init()
Definition: pcb.c:123
long sys_clone(unsigned long flags, void *stack, pid_t *parent_tid, void *tls, pid_t *child_tid)
Definition: pcb.c:698
Definition: elf.h:119
Definition: list.h:7
Definition: time.h:16
Definition: sync.h:55
Definition: pcb.h:127
int cursor_y
Definition: pcb.h:164
__kernel_clock_t dead_child_utime
Definition: pcb.h:183
__kernel_timeval_t stime_last
Definition: pcb.h:179
pid_t child_pids[NUM_MAX_CHILD]
Definition: pcb.h:149
reg_t user_sp
Definition: pcb.h:131
list_node_t list
Definition: pcb.h:134
__kernel_timeval_t utime_last
Definition: pcb.h:180
pid_t pid
Definition: pcb.h:144
pid_t father_pid
Definition: pcb.h:148
int thread_ids[NUM_MAX_CHILD_THREADS]
Definition: pcb.h:153
int cursor_x
Definition: pcb.h:163
pid_t tid
Definition: pcb.h:146
reg_t kernel_sp
Definition: pcb.h:130
uint64_t pgdir
Definition: pcb.h:170
int child_num
Definition: pcb.h:150
int * child_stat_addrs[NUM_MAX_CHILD]
Definition: pcb.h:151
task_type_t type
Definition: pcb.h:156
int threadsum
Definition: pcb.h:152
pcbtimer_t timer
Definition: pcb.h:181
prior_t priority
Definition: pcb.h:166
regs_context_t * save_context
Definition: pcb.h:136
ELF_info_t elf
Definition: pcb.h:140
int lock_ids[NUM_MAX_LOCK]
Definition: pcb.h:173
char name[NUM_MAX_PCB_NAME]
Definition: pcb.h:143
switchto_context_t * switch_context
Definition: pcb.h:137
task_status_t status
Definition: pcb.h:159
pid_t fpid
Definition: pcb.h:145
uint8_t core_mask[CPU_SET_SIZE]
Definition: pcb.h:168
int locksum
Definition: pcb.h:172
bool in_use
Definition: pcb.h:139
pcb_mbox_t * mbox
Definition: pcb.h:176
int exit_status
Definition: pcb.h:160
uint32_t * clear_ctid
Definition: pcb.h:147
void * chan
Definition: pcb.h:174
__kernel_clock_t dead_child_stime
Definition: pcb.h:182
rusage_t resources
Definition: pcb.h:185
Definition: time.h:33
Definition: pcb.h:69
long priority
Definition: pcb.h:70
uint64_t last_sched_time
Definition: pcb.h:71
Definition: context.h:8
Definition: pcb.h:105
__kernel_long_t ru_nivcsw
Definition: pcb.h:121
__kernel_long_t ru_nvcsw
Definition: pcb.h:120
__kernel_long_t ru_inblock
Definition: pcb.h:115
__kernel_timeval_t ru_utime
Definition: pcb.h:106
__kernel_long_t ru_idrss
Definition: pcb.h:110
__kernel_long_t ru_nswap
Definition: pcb.h:114
__kernel_long_t ru_isrss
Definition: pcb.h:111
__kernel_long_t ru_minflt
Definition: pcb.h:112
__kernel_long_t ru_msgsnd
Definition: pcb.h:117
__kernel_long_t ru_msgrcv
Definition: pcb.h:118
__kernel_long_t ru_majflt
Definition: pcb.h:113
__kernel_long_t ru_ixrss
Definition: pcb.h:109
__kernel_timeval_t ru_stime
Definition: pcb.h:107
__kernel_long_t ru_oublock
Definition: pcb.h:116
__kernel_long_t ru_nsignals
Definition: pcb.h:119
__kernel_long_t ru_maxrss
Definition: pcb.h:108
Definition: lock.h:17
Definition: context.h:20
#define __kernel_timeval_t
Definition: time.h:14
int pid_t
Definition: types.h:42
uint64_t ptr_t
Definition: types.h:44
__kernel_long_t __kernel_clock_t
Definition: types.h:150
uint64_t reg_t
Definition: types.h:43
long __kernel_long_t
Definition: types.h:79