[1] | 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? |
---|