1 | 1-Event Manager: |
---|
2 | The even manager has been changed in the fallowing ways : |
---|
3 | - the API has been changed to avoid given a pointer to the second argumern to event_send we give only the |
---|
4 | the gpid of the target processor. |
---|
5 | - local event handling is gloablly the same |
---|
6 | - remote event has been changed. Must be carrefully handled with physical access: |
---|
7 | - the kfifo of the remote cpu is physically accessed |
---|
8 | - the event_notifier must notify after copying the event structure (on the stack ?). |
---|
9 | !!! This does not aplying that the pointer arguments are copied !!! |
---|
10 | => modify event handler |
---|
11 | |
---|
12 | 3-Processes/Thread Management |
---|
13 | |
---|
14 | 3.1) Task Management |
---|
15 | |
---|
16 | There's one gloabal table that index all process by pid. |
---|
17 | Replicaing the kernel will also replicate this structure... |
---|
18 | The fatest way to corrdinate the replica : |
---|
19 | - Consiste of using the table of cluster 0 as the main table. Each table will contain |
---|
20 | a pointer to the task structure if the task is local, other ways the table entry is |
---|
21 | either marked and contains the cluster id wich handle the task or a NULL value. |
---|
22 | A NULL value at the main table mean that the entry has not been allocated. |
---|
23 | A NULL value in other table must be confirmed by cheching the main table. |
---|
24 | |
---|
25 | This imply a change in pid allocate, wich must allocate from the main table by setting |
---|
26 | the cluster id and marking the entry with a remote flag (0x1). // TODO more on synch |
---|
27 | |
---|
28 | The lookup need to check for the task in local, if we find a task address we return' it. |
---|
29 | If we find a remote entry we go to the indicate cluster. If the remote cluster does not contain |
---|
30 | the address of the task ... |
---|
31 | |
---|
32 | |
---|
33 | Excuse me! the fastest way is to directly use the main table as the only table and ignore other tables!!! |
---|
34 | This will require putting a physical addresse on the table to point to task structures and synchronised |
---|
35 | with a lock. |
---|
36 | |
---|
37 | 3.2)Task descriptor |
---|
38 | |
---|
39 | This structure contain the following structures that are shared between threads: |
---|
40 | - vmm (Virtual Memory Manager) : see 2-. |
---|
41 | - pointer to root/cwd file, fdinfo and binary file: use physical addresses |
---|
42 | - pointer to task parent: use a parent cluster id field, or directly a physical addresse ? |
---|
43 | - 2 list : one for the children and one for the siblings |
---|
44 | - a signal manager (NULL par default ?) |
---|
45 | - thread handling structures : |
---|
46 | - a table containing a reference to all the threads (and a pointer to it's page struct) |
---|
47 | - a list entry root that englobe all thread: not really used, can be deleted |
---|
48 | |
---|
49 | How to manipulate these fields ? => by message passing ? |
---|
50 | for thread's pointer we directly placed the ppn: thread's structures are aligned on a page. |
---|
51 | Other pointers fd_info, bin are to locals strutures. |
---|
52 | vmm handling is local if a single threaded task, otherwise the handling is done by message passing. |
---|
53 | |
---|
54 | 3.3) Thread Management |
---|
55 | In the second stage... |
---|
56 | |
---|
57 | |
---|
58 | |
---|
59 | 2-Memory Management: |
---|
60 | vmm: message passing to the processor that contain the main structure. |
---|
61 | There is no need to acess the thread data except for statistique pupose! |
---|
62 | There is a part that could be done by the thread with passing a message... look in the page table part |
---|
63 | |
---|
64 | To think : page fault at the same addresses how to avoid them (merge the messages of page fault) ? |
---|
65 | |
---|
66 | kmem: all remote allocation are forbiden except for user pages (at least for now). |
---|
67 | (user remote allocation have been done in the second stage.) |
---|
68 | |
---|
69 | |
---|
70 | 3-Cluster Manager: |
---|
71 | One cluster manager for each cluster: no need for the global table...no need for the replication of cluster addresses |
---|
72 | ...no needs for procs base addresses: the cpu_s are directly put into the cluster structures with the cluster base |
---|
73 | address the compiler will offset to the good addresse. |
---|
74 | |
---|
75 | |
---|
76 | 3-DQDT: |
---|
77 | initialisation has been modified to not require the remote allocation API. We set a table of two dqdt in the |
---|
78 | |
---|
79 | |
---|
80 | |
---|
81 | 4-Drivers |
---|
82 | |
---|
83 | |
---|
84 | |
---|
85 | |
---|
86 | 5-Boot: |
---|
87 | A) The main proc of the boot cluster enter the boot loader, initiliase the stack bases for |
---|
88 | all other procs in the boot_tbl and wait for all other proc to copy the needed info (kernel, boot, |
---|
89 | boot info) from the boot cluster. |
---|
90 | |
---|
91 | B) All other procs enter the boot_loader allocate a stack a the end of the cluster ram and |
---|
92 | wait for their cluster to be initilised by their main proc. (except for those of the boot cluster ?) |
---|
93 | |
---|
94 | C) The main procs of other clusters enter the boot loader, set the sp register to point to |
---|
95 | the stack at the end of the current cluster ram. |
---|
96 | (Enter the C code and) Copy the kernel/boot/boot_info from the main cluster to their cluster |
---|
97 | increment a value and sleep back (wait instruction). |
---|
98 | |
---|
99 | D) All procs sleep after incrementing a counter in the in the original BI (boot cluster). |
---|
100 | |
---|
101 | E) Once the counter reach the number of proc, the main proc of the boot cluster can then |
---|
102 | copy the kernel/boot/boot_info in the same cluster but at the correct adresses. This will erase the |
---|
103 | code of the preloader. (the sp pointer of the boot cluster is good, the preloader should set it to |
---|
104 | point |
---|
105 | |
---|
106 | !!! moving the boot code is dangerous, since we are currently executing it ... and the |
---|
107 | addreses in it are fixed ?!!! If we really want this space, we need to give up at this stage on the |
---|
108 | boot code, BI can be kept. |
---|
109 | |
---|
110 | *********************************************************************************************************** |
---|
111 | Initital memory content at boot (TODO): |
---|
112 | |
---|
113 | ------------------ 0x0000 0000 |
---|
114 | Preloader |
---|
115 | ------------------ ENDPRELOADER |
---|
116 | Kernel |
---|
117 | ------------------ END kernel paddr (important here, the charging addresse (paddr) is differente than vaddr) |
---|
118 | BI |
---|
119 | ------------------ |
---|
120 | Boot code |
---|
121 | ------------------ End of boot |
---|
122 | ..... |
---|
123 | ------------------ end of cluster space - 4 boot stacks |
---|
124 | Boot stacks (x nbproc) |
---|
125 | ----------------- End of cluster space |
---|
126 | |
---|
127 | |
---|
128 | Boot code role is to set: |
---|
129 | 1 - the kernel and boot info: deplace it to the address 0 |
---|
130 | 2 - the stacks for each proc |
---|
131 | 3 - initialise the info structure (allocated on the stack): don't forget to put the BI info address |
---|
132 | that resulted from displacing it. |
---|
133 | 4 - initialise the page table and the mmu if we are booting in virtual mode |
---|
134 | |
---|
135 | ***** Phase 1: boot proc of the boot cluster |
---|
136 | - after the preloader, there's only the boot_proc who has a stack and all other proc are waiting (an WTI). |
---|
137 | - jump to C code |
---|
138 | - wakeup all proc (possible improvement: set a distributed wakeup) |
---|
139 | |
---|
140 | ***** Phase 2: all proc (the boot cluster proc) |
---|
141 | |
---|
142 | - start by setting a stack at the end of current cluster |
---|
143 | - jump to C code |
---|
144 | - set info structure |
---|
145 | - copy the kernel and BI info (only one proc per cluster) at the start of the current cluster |
---|
146 | (- set the page table and the mmu) |
---|
147 | - jump to the kernel (of the cuurrent cluster) and wait in it ? yes wait for the |
---|
148 | kernel image of cluster 0 to be set (since we will probably synchronise with it) |
---|
149 | |
---|
150 | |
---|
151 | ? how to signal to the current cluster proc to jump to kernel ? |
---|
152 | |
---|
153 | --> the boot code is now used by only the boot cluster |
---|
154 | --> the preloader code is used by only the boot cluster other procs |
---|
155 | |
---|
156 | ***** Phase 3: |
---|
157 | - put a barrier to be sure that all procs have entred the boot code |
---|
158 | - all proc set their stack: to put after the boot proc stack |
---|
159 | (- set the page table and the mmu) |
---|
160 | |
---|
161 | --> the preloader code is no longer in use |
---|
162 | |
---|
163 | - copy the kernel and BI of the boot cluster (by the boot proc) |
---|
164 | - all proc of the boot cluster can now jump to the kernel and wait |
---|
165 | - the boot proc enters the kernels and wake up a proc per cluster (except for the current |
---|
166 | boot cluster) |
---|
167 | |
---|
168 | --> the boot code is no longer in use |
---|
169 | |
---|
170 | |
---|
171 | !! be careful the stack of all the procs are still in use !! |
---|
172 | put the in the reserved zone ? |
---|
173 | |
---|
174 | N.B.: all addresses of the boot cluster are found using compiled in variables |
---|
175 | |
---|
176 | |
---|
177 | ****** It's up to the kernel now... |
---|
178 | |
---|
179 | Kernel boot: |
---|
180 | ***** Phase 1: only the boot proc |
---|
181 | wake up one proc per cluster |
---|
182 | !!! Must be sure that they are sleeping (waiting) ? !!! |
---|
183 | |
---|
184 | ***** Phase 2: A proc per cluster |
---|
185 | Tasks: '->' indicate dependance |
---|
186 | |
---|
187 | 1) initialise task bootstap and task manager and set idle arg |
---|
188 | reported: devfs/sysfs roots |
---|
189 | |
---|
190 | 2) initialise arch_memory : (initialise boot_tbl: done in the boot phase); initialise |
---|
191 | clusters_tbl ? |
---|
192 | initialise arch: initialise current cluster: initialise ppm (physical page memory) (can |
---|
193 | alloc now!), cpu_init : event listener! |
---|
194 | initialise devices (printk) (put all in cluster devices lists, root all |
---|
195 | interruptions locally (to the proc handling them)); |
---|
196 | and register them (!!!to be reported!!!) -> depend on message api |
---|
197 | |
---|
198 | |
---|
199 | 3) --Barrier--: here we should wait that everybody has set there event listener. |
---|
200 | |
---|
201 | only main proc of I/O cluster: initialise fs cache locally(?); |
---|
202 | initialise devfs/sysfs roots and set devices. |
---|
203 | ----Barier ?------ |
---|
204 | |
---|
205 | |
---|
206 | 4) task_bootstarp_finalize : should not be needed all should be done in task_init (TODO) |
---|
207 | kdmsg_init : a set of lock (isr, exception, printk)_lock and printk_sync |
---|
208 | |
---|
209 | 5) DQDT init: arch_dqdt_init and dqdt_init (TODO) |
---|
210 | |
---|
211 | 6) Forget about bootstrap_replicate_task and cluster_init_table |
---|
212 | a local cluster_init_cores is needed ? |
---|
213 | |
---|
214 | register devices in fs ? |
---|
215 | |
---|
216 | **** Phase 3: all procs (thread idle) |
---|
217 | |
---|
218 | set thread_idle for each proc (parrallèle ?) |
---|
219 | |
---|
220 | load thread_idle: free reserved page (the boot loader reserved pages...), create the event |
---|
221 | thread event manager, kvfsd only in the cluster_IO. |
---|
222 | |
---|
223 | |
---|
224 | *** Phase 4: kvfsd (only main cpu of cluster IO) |
---|
225 | |
---|
226 | enable all irq. |
---|
227 | |
---|
228 | initialise fs -> need __sys_blk |
---|
229 | task load init require devfs file system |
---|
230 | if failed set kminishell |
---|
231 | |
---|
232 | |
---|
233 | |
---|
234 | |
---|
235 | |
---|
236 | |
---|
237 | |
---|
238 | |
---|
239 | |
---|
240 | Kernel Runing Modifications: |
---|
241 | |
---|
242 | *** DQDT (Ressource handling): Must be set using physical addresses ? |
---|
243 | |
---|
244 | *** FS support: Open, read, write ... all physical access or just when reaching the device ? |
---|
245 | |
---|
246 | *** Memory support: when there is no multithreaded application (only kthread) the memory |
---|
247 | management is all done localy. Cross cluster messaging for remote creation. |
---|
248 | |
---|
249 | *** Task support: a replicated taskmanager, pids are now composed of XYN, X and Y are the |
---|
250 | cluster offset, N is the offset in the current cluster. Remote creation can be done |
---|
251 | only using message passing. |
---|
252 | |
---|
253 | *** Device support: |
---|
254 | |
---|
255 | *** Exception, Interruptions (not syscalls): all device interruptions are rooted and handled |
---|
256 | locally, as configured at boot time. |
---|
257 | |
---|
258 | Add cluster span to the arch config or in the cluster_entry. Yes it must be defined by the |
---|
259 | boot code since this the code that decide the offset when using virtual memory. |
---|
260 | |
---|
261 | *** User space support: |
---|
262 | - Syscall: switch adressing mode in case we come or go from a syscall; save the coproc2 extend register |
---|
263 | - copy from/to user must be modified |
---|
264 | |
---|
265 | |
---|
266 | Developement process: |
---|
267 | ********** Phase one ******************* |
---|
268 | Consiste of boting the kernel with no user space support and with a dummy dqdt suport |
---|
269 | |
---|
270 | *** Stage 0: |
---|
271 | Rewrite the kernel in the view of passing to 40 bits: |
---|
272 | Handle gloabal variables: |
---|
273 | 1) remove inused gloabl variables |
---|
274 | 2) simplifie the message passing API |
---|
275 | 3) do a simplified DQDT : replace dqdt files by a dummy : next_cluster++ |
---|
276 | 4) task and thread creation only using message passing |
---|
277 | 5) do a true copy_from_usr and copy_to_usr ! |
---|
278 | 6) delete the assumption that all address superior to KERNEL_OFFSET belongs |
---|
279 | to the kernel(genarally used to verify if an address belongd to user space) |
---|
280 | replace by checking that the address is between USR_OFFSET and _LIMIT |
---|
281 | (see libk/elf.c) for an example. |
---|
282 | |
---|
283 | |
---|
284 | *** Stage 1: |
---|
285 | Develloping boot code: require setting the disk, develloping virtual memory for |
---|
286 | the perspective of a dooble mode of booting, replicate the kernel and put it |
---|
287 | at address zero. |
---|
288 | Develloping kernel boot code (reaching kern_init and printing a message ?), setting boot_dmsg |
---|
289 | |
---|
290 | *** Stage 2: (TODO: synchronise with stage 0) |
---|
291 | Rewrite of most of the kernel: |
---|
292 | ******* GOALS: |
---|
293 | 1) delete (replace) reference to (unused) global variables: |
---|
294 | - cluster_tbl : no such a thing as cluster init... |
---|
295 | reference to cluster struct should be removed to keep only cids: this will affect allot of code! |
---|
296 | No more a access to remote listener ptr (event.c), nor cpu struct, not cluster, nor ppm of remote cluster ... |
---|
297 | |
---|
298 | - devfs_db replaced by the root dentry/inode of the devfs file system and since |
---|
299 | there is only one kernel that use it => allocate it dynamically |
---|
300 | - similar for sysfs_root_entry ? |
---|
301 | - devfs_n_op/devfs_f_op : are const |
---|
302 | - (dma,fb,icu,iopic,sda,timer,xicu,tty)_count are per cluster the |
---|
303 | new naming scheme is device_cidn |
---|
304 | - rt_timer: Not used => removet it |
---|
305 | - (exception, isr, printk, boot)_lock: are all used to lock the printing |
---|
306 | - kexcept_tty, klog_tty, tty_tbl, kisr_tty, kboot_tty ??? |
---|
307 | |
---|
308 | - soclib_(any device)_driver are RO: can we mark them as const ? |
---|
309 | - boot_stage_done: not used |
---|
310 | |
---|
311 | 2) Event Manager to use physical adresses. |
---|
312 | 3) fs |
---|
313 | 4) all interruption (produced by device and WTI) are handled locally |
---|
314 | 5) all exception are handled locally (there is no remote page fault, since |
---|
315 | there is no user space => no multithreaded user space application) |
---|
316 | 6) Complete the kernel boot phase. |
---|
317 | 7) Context switch: adding the saving of the coproc registers: DATA_extend register and Virtual |
---|
318 | mode register |
---|
319 | ?cpu_gid2ptr: should be modified to fetch only local cluster, if a remote cluster is called, it should return an error |
---|
320 | |
---|
321 | *** Stage N: user space support |
---|
322 | $27 is now used by the kerntry code! user space should no longer used it |
---|
323 | Switch to user space need to modify to set off the MMU and reset when going back... |
---|
324 | set in init context the mmu register value (0xF) |
---|
325 | |
---|
326 | ***Structures modif (with study only struct fields)**** |
---|
327 | |
---|
328 | ** NOTATIONS: |
---|
329 | -PB: problem, |
---|
330 | -HD: handled in the corresponding structure. This is for structure that are |
---|
331 | directly embeded in the structure and wich contain a non local pointer |
---|
332 | -NPB: no problem |
---|
333 | -LPTR: local pointer |
---|
334 | -RPTR: remote pointer |
---|
335 | -RPTR-S: RPTR that is static => point to a structure that cannot be moved across clusters |
---|
336 | -RPTR-D: RPTR that is dynmic=> point to a structure that can be moved across clusters |
---|
337 | (which mean that the ptr need to be updated!) |
---|
338 | |
---|
339 | |
---|
340 | ** Structures that need to accessed remotly (and does they need to be dynamic ?) |
---|
341 | struct task_s; |
---|
342 | struct thread_s; |
---|
343 | |
---|
344 | |
---|
345 | ** Structures details |
---|
346 | |
---|
347 | + thread structure (thread.h) |
---|
348 | struct thread_s |
---|
349 | { |
---|
350 | struct cpu_uzone_s uzone;//NOPB |
---|
351 | spinlock_t lock;//PB:HD |
---|
352 | thread_state_t state;//NOPB |
---|
353 | ...//NOPB |
---|
354 | struct cpu_s *lcpu;//NOPB: LPTR /*! pointer to the local CPU description structure */ |
---|
355 | struct sched_s *local_sched; //NOPB LPTR /*! pointer to the local scheduler structure */ |
---|
356 | |
---|
357 | * struct task_s *task; //PB: RPTR |
---|
358 | |
---|
359 | thread_attr_t type;//NOPB /*! 3 types : usr (PTHREAD), kernel (KTHREAD) or idle (TH_IDLE) */ |
---|
360 | struct cpu_context_s pws;//NOPB /*! processor work state (register saved zone) */ |
---|
361 | |
---|
362 | * struct list_entry list;//PB /*! next/pred threads at the same state */ |
---|
363 | * struct list_entry rope;//OB /*! next/pred threads in the __rope list of thread */ |
---|
364 | struct thread_info info;//HD /*! (exit value, statistics, ...) */ |
---|
365 | |
---|
366 | uint_t signature;//NOPB |
---|
367 | }; |
---|
368 | struct thread_info |
---|
369 | { |
---|
370 | ...//NOPB |
---|
371 | struct cpu_s *ocpu;//PB: RPTR-S |
---|
372 | uint_t wakeup_date;//NOPB /*! wakeup date in seconds */ |
---|
373 | void *exit_value;//NOPB /*! exit value returned by thread or joined one */ |
---|
374 | * struct thread_s *join;//PB:RPTR-D /*! points to waiting thread in join case */ |
---|
375 | * struct thread_s *waker;//RPTR-D |
---|
376 | struct wait_queue_s wait_queue;//PB:HD |
---|
377 | * struct wait_queue_s *queue;//PB |
---|
378 | struct cpu_context_s pss;//NPB /*! Processor Saved State */ |
---|
379 | pthread_attr_t attr;//HD |
---|
380 | void *kstack_addr;//NPB:LPTR (always moved with the thread) |
---|
381 | uint_t kstack_size;//OK |
---|
382 | struct event_s *e_info;//never used!!!!!!!!!!! |
---|
383 | struct page_s *page;//LTPR ? |
---|
384 | }; |
---|
385 | typedef struct |
---|
386 | { |
---|
387 | ...//NOPB |
---|
388 | void *stack_addr;//user space ? |
---|
389 | size_t stack_size; |
---|
390 | void *entry_func;//USP /* mandatory */ |
---|
391 | void *exit_func;//USP /* mandatory */ |
---|
392 | void *arg1;//? |
---|
393 | void *arg2;//? |
---|
394 | void *sigreturn_func;//? |
---|
395 | void *sigstack_addr;//USP todo |
---|
396 | size_t sigstack_size;//? |
---|
397 | struct sched_param sched_param;//PPB |
---|
398 | ...//NOPB /* mandatory */ |
---|
399 | } pthread_attr_t; |
---|
400 | |
---|
401 | + task structure |
---|
402 | struct task_s |
---|
403 | { |
---|
404 | /* Various Locks */ |
---|
405 | mcs_lock_t block;//HD |
---|
406 | spinlock_t lock;//HD |
---|
407 | spinlock_t th_lock;//HD |
---|
408 | struct rwlock_s cwd_lock;//HD |
---|
409 | spinlock_t tm_lock;//local:HD |
---|
410 | |
---|
411 | /* Memory Management */ |
---|
412 | struct vmm_s vmm;//HD |
---|
413 | |
---|
414 | /* Placement Info */ |
---|
415 | struct cluster_s *cluster;//local |
---|
416 | struct cpu_s *cpu;//local |
---|
417 | |
---|
418 | /* File system * |
---|
419 | //for cwd and root they should always point to the same |
---|
420 | //file struct (not node) to avoid ensurring the coherence |
---|
421 | //if one of them change |
---|
422 | struct vfs_inode_s *vfs_root;// |
---|
423 | struct vfs_inode_s *vfs_cwd;// |
---|
424 | struct fd_info_s *fd_info;//embed it |
---|
425 | struct vfs_file_s *bin;//Static: embed it |
---|
426 | |
---|
427 | /* Task management */ |
---|
428 | pid_t pid;//NPB |
---|
429 | uid_t uid;//NPB |
---|
430 | gid_t gid;//NPB |
---|
431 | uint_t state;//NPB |
---|
432 | atomic_t childs_nr;//NPB |
---|
433 | uint16_t childs_limit;//NPB |
---|
434 | |
---|
435 | //make them of type faddr |
---|
436 | struct task_s *parent;//PB |
---|
437 | struct list_entry children;//PB |
---|
438 | struct list_entry list;//PB |
---|
439 | |
---|
440 | /* Threads */ |
---|
441 | uint_t threads_count; |
---|
442 | uint_t threads_nr; |
---|
443 | uint_t threads_limit; |
---|
444 | uint_t next_order; |
---|
445 | uint_t max_order; |
---|
446 | |
---|
447 | //add a function to register after we creat it ? |
---|
448 | BITMAP_DECLARE(bitmap, (CONFIG_PTHREAD_THREADS_MAX >> 3)); |
---|
449 | struct thread_s **th_tbl;//PB: TODO: local table of pointer to avoid the page below? |
---|
450 | struct list_entry th_root; |
---|
451 | struct page_s *th_tbl_pg;//NPB: local (make it local) |
---|
452 | |
---|
453 | /* Signal management */ |
---|
454 | struct sig_mgr_s sig_mgr; |
---|
455 | |
---|
456 | #if CONFIG_FORK_LOCAL_ALLOC |
---|
457 | struct cluster_s *current_clstr; |
---|
458 | #endif |
---|
459 | }; |
---|
460 | |
---|
461 | |
---|
462 | |
---|
463 | |
---|
464 | |
---|
465 | File per file modif: |
---|
466 | *** kern dir files: |
---|
467 | *PKB - kern_init.c (see up) |
---|
468 | - atomic.c: handle atomic_t and refcount_t objects (try to keep them local ? It will |
---|
469 | be hard (fs, event handler?)) |
---|
470 | - barrier.c: used only by sys_barrier.c |
---|
471 | - blkio.c: this layer allow an fs to send request to block device, all request pass |
---|
472 | here.(manipulate a device struct. With this it's best to replicate the notion |
---|
473 | of device ? NO). Use blkio async to send an IPI blokio request. |
---|
474 | - cluster.c : some init functions, cid2ptr (to delete ?), manager, key_op (never used) |
---|
475 | - cond_var.c: used only by user space (at least for now) |
---|
476 | - cpu.c : the function cpu_gid2ptr access the cluster structure! see the structure for more |
---|
477 | - do_exec : use copy_uspace! |
---|
478 | - do_interupt : remove thread migration handling ? |
---|
479 | - do_syscall : (N.B. the context save is for the fork syscall) remove thread migration ? |
---|
480 | - event : modify to support the ... |
---|
481 | - (keysdb/kfifo/mwmr/mcs_sync/radix/rwlock/semaphore/spinlock).c: their modification depend on the scope in which their are used |
---|
482 | - kthread_create: local |
---|
483 | - rr-sched: should be local |
---|
484 | - scheduler: (thread_local_cpu) should be local |
---|
485 | - task.c: should get simplified => removing replicate calls (they should may be used to see how the migration goes) |
---|
486 | - thread_create.c: use of cpu_gid2ptr, should be local |
---|
487 | - destroy|dup|idle.c: should be local |
---|
488 | - thread migrate.c: need to be modified |
---|
489 | SYSCALLS |
---|
490 | Miscelanious: |
---|
491 | - sys_alarm.c: manipulte local data (And thread migration is initiated by each thread indepndantly...) |
---|
492 | *PKB - sys_barier.c: not local, to complexe for no reason except performance, we should pospone this functionnality? |
---|
493 | I think we need such a struc for the boot. This mean that posponing is not possible, but we can simplify it |
---|
494 | - sys_clock.c: local |
---|
495 | - sys_cond_var.c: |
---|
496 | - sys_dma_memcpy.c: |
---|
497 | - sys_rwlock.c |
---|
498 | - sys_sem.c |
---|
499 | Task: |
---|
500 | - sys_exec.c |
---|
501 | - sys_fork.c |
---|
502 | - sys_getpid.c |
---|
503 | - sys_ps.c |
---|
504 | - sys_signal.c |
---|
505 | - sys_thread_create.c |
---|
506 | - sys_thread_detach.c |
---|
507 | - sys_thread_exit.c |
---|
508 | - sys_thread_getattr.c |
---|
509 | - sys_thread_join.c |
---|
510 | - sys_thread_migrate.c |
---|
511 | - sys_thread_sleep.c |
---|
512 | - sys_thread_wakeup.c |
---|
513 | - sys_thread_yield.c |
---|
514 | Task Mem: |
---|
515 | - sys_madvise.c |
---|
516 | - sys_mcntl.c |
---|
517 | - sys_mmap.c |
---|
518 | - sys_sbrk.c |
---|
519 | - sys_utls.c |
---|
520 | FS: |
---|
521 | - sys_chdir.c: |
---|
522 | - sys_close.c: |
---|
523 | - sys_closedir.c: |
---|
524 | - sys_creat.c: |
---|
525 | - sys_getcwd.c |
---|
526 | - sys_lseek.c |
---|
527 | - sys_mkdir.c |
---|
528 | - sys_mkfifo.c |
---|
529 | - sys_open.c |
---|
530 | - sys_opendir.c |
---|
531 | - sys_pipe.c |
---|
532 | - sys_read.c |
---|
533 | - sys_readdir.c |
---|
534 | - sys_stat.c |
---|
535 | - sys_unlink.c |
---|
536 | - sys_write.c |
---|
537 | mm/: |
---|
538 | Task related: |
---|
539 | vmm.c: munmap (region:detach, split, resize); mmap (shared, private | file, anomymous); |
---|
540 | skbrk(resize heap region TODO: use the resize func), madvise_migrate, vmm_auto_migrate, |
---|
541 | (modify page table attribute and set migrate flag), madvise_will_need; |
---|
542 | vm_region.c:... |
---|
543 | Other: |
---|
544 | ppm.c: handle page descriptors. We find some use of cluster ptr that should be removed ? |
---|
545 | page.c: to make local |
---|
546 | |
---|
547 | |
---|
548 | |
---|
549 | Question: |
---|
550 | 1) How is the time handled in almos. Does we use a unique timer to keep the time seamleese across node ? |
---|
551 | 2) Copy to/from userspace |
---|
552 | 3) Cross cluster lists: thread lists |
---|
553 | 4) Only the kentry is mapped when entring the kernel from user space... This is going to be a complexe point. |
---|
554 | Three new things need to be done: |
---|
555 | 1- if from user space (or simply if we were in the vitual mode was actif), switch to physical mode of local cluster |
---|
556 | 2- if from kernel save DATA_EXT register. Also, if we do cpy_uspace by switchin to the virtulle space, we need to |
---|
557 | do what we do in one. |
---|
558 | |
---|
559 | |
---|
560 | Remark: |
---|
561 | cross cluster access also keep in mind that other access are possible, like page based access (temporarely map a page). |
---|
562 | |
---|
563 | |
---|
564 | |
---|
565 | |
---|
566 | Task and thread subsystems: |
---|
567 | Per cluster vmm or per thread ? |
---|
568 | |
---|
569 | Per cluster: 1) interest: less physical space cosummed and less coherence to handle |
---|
570 | 2) Problems: "resharing" of the stack zone could complex (make it impossible to migrate the stack of thread and thus the thread) ? |
---|
571 | |
---|
572 | Per thread: 1) interest: virtualise the virtual mapping between thread become easy (for stack and TLS) |
---|
573 | and temporary mappping are allot easier... |
---|
574 | (and we could free the $27 register!) |
---|
575 | 2) Problems: to much use of physical space (cache) + require more coherence message |
---|
576 | |
---|
577 | |
---|
578 | |
---|
579 | Files need to accessible across cluster, since they could be share by tasks! |
---|
580 | |
---|
581 | |
---|
582 | |
---|
583 | TODO: |
---|
584 | Check that we have mapped enough of the kernel, for the kentry ? |
---|
585 | |
---|
586 | |
---|
587 | |
---|
588 | VMM replicated region (mapper) require that the insertion to the page cache be atomic! |
---|
589 | |
---|
590 | |
---|
591 | DEveloppement results: |
---|
592 | event_fifo.c |
---|
593 | remote operation.c |
---|
594 | arch_init.c:ongoing for devices |
---|
595 | cluster_init.c |
---|
596 | kentry.c:k1 is now used by the kernel! No, it's that we k1 only when we were in |
---|
597 | kernel mode... Otherwise when coming in usert mode we don't need it and save it? |
---|