| 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?
|
|---|