Changeset 585 for trunk/kernel/mm/vmm.h
- Timestamp:
- Nov 1, 2018, 12:22:17 PM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/kernel/mm/vmm.h
r567 r585 89 89 /********************************************************************************************* 90 90 * This structure defines the Virtual Memory Manager for a given process in a given cluster. 91 * This local VMM provides four main services:91 * This local VMM implements four main services: 92 92 * 1) It contains the local copy of vseg list (VSL), only complete in referrence. 93 93 * 2) It contains the local copy of the generic page table (GPT), only complete in reference. … … 96 96 ******************************************************a************************************** 97 97 * Implementation notes: 98 * 1. The VSL contains only local vsegs, but it is implemented as an xlist, and protected by 98 * 1. In most clusters, the VSL and GPT are only partial copies of the reference VSL and GPT 99 * structures, stored in the reference cluster. 100 * 2. The VSL contains only local vsegs, but it is implemented as an xlist, and protected by 99 101 * a remote_rwlock, because it can be accessed by a thread running in a remote cluster. 100 102 * An exemple is the vmm_fork_copy() function. 101 * 2. In most clusters, the VSL and GPT are only partial copies of the reference VSL and GPT 102 * structures, stored in the reference cluster. 103 * 3. The GPT in the reference cluster can be directly accessed by remote threads to handle 104 * false page-fault (page is mapped in the reference GPT, but the PTE copy is missing 105 * in the local GPT). It is also protected by a remote_rwlock. 103 106 ********************************************************************************************/ 104 107 … … 106 109 { 107 110 remote_rwlock_t vsegs_lock; /*! lock protecting the local VSL */ 108 xlist_entry_t vsegs_root; /*! V SL root (VSL only complete in reference)*/111 xlist_entry_t vsegs_root; /*! Virtual Segment List (complete in reference) */ 109 112 uint32_t vsegs_nr; /*! total number of local vsegs */ 110 113 114 remote_rwlock_t gpt_lock; /*! lock protecting the local GPT */ 111 115 gpt_t gpt; /*! Generic Page Table (complete in reference) */ 112 116 … … 213 217 214 218 /********************************************************************************************* 215 * This global function modifies a GPT entry identified 219 * This global function modifies a GPT entry identified by the <process> and <vpn> 216 220 * arguments in all clusters containing a process copy. 217 221 * It must be called by a thread running in the reference cluster. … … 352 356 353 357 /********************************************************************************************* 354 * This function is called by the generic exception handler in case of page-fault ,355 * or copy-on-write event locally detected for a given <vpn> in a given <process>356 * as defined by the <is_cow> argument.357 * 1) For a Page-Fault:358 * - If the local cluster is the reference, or for the STACK and CODE segment types,359 * it call directly the vmm_get_pte() function to access the local VMM.360 * - Otherwise, it send a RPC_VMM_GET_PTE to the reference cluster to get the missing361 * PTE attributes and PPN.362 * This function check that the missing VPN belongs to a registered vseg, allocates363 * a new physical page if required, and updates the local page table.364 * 2) For a Copy-On-Write:365 * - If no pending fork, it reset the COW flag and set the WRITE flag in the reference366 * GPT entry, and in all the GPT copies.367 * - If there is a pending fork, it allocates a new physical page from the cluster defined368 * by the vseg type, copies the old physical page content to the new physical page,369 * and decrements the pending_fork counter in old physical page descriptor.358 * This function is called by the generic exception handler in case of page-fault event, 359 * detected for a given <vpn> in a given <process> in any cluster. 360 * It checks the missing VPN and returns an user error if it is not in a registered vseg. 361 * For a legal VPN, there is actually 3 cases: 362 * 1) if the missing VPN belongs to a private vseg (STACK or CODE segment types, non 363 * replicated in all clusters), it allocates a new physical page, computes the attributes, 364 * depending on vseg type, and updates directly the local GPT. 365 * 2) if the missing VPN belongs to a public vseg, it can be a false page-fault, when the VPN 366 * is mapped in the reference GPT, but not in the local GPT. For this false page-fault, 367 * the local GPT is simply updated from the reference GPT. 368 * 3) if the missing VPN is public, and unmapped in the reference GPT, it's a true page fault. 369 * The calling thread allocates a new physical page, computes the attributes, depending 370 * on vseg type, and updates directly (without RPC) the local GPT and the reference GPT. 371 * Other GPT copies will updated on demand. 372 * In the three cases, concurrent accesses to the GPT are handled, thanks to the 373 * remote_rwlock protecting each GPT copy. 370 374 ********************************************************************************************* 371 375 * @ process : pointer on local process descriptor copy. 372 * @ vpn : VPN of the missing or faulting PTE. 373 * @ is_cow : Copy-On-Write event if true / Page-fault if false. 374 * @ returns 0 if success / returns ENOMEM if no memory or illegal VPN. 376 * @ vpn : VPN of the missing PTE. 377 * @ returns EXCP_NON_FATAL / EXCP_USER_ERROR / EXCP_KERNEL_PANIC after analysis 375 378 ********************************************************************************************/ 376 379 error_t vmm_handle_page_fault( struct process_s * process, 377 vpn_t vpn ,378 bool_t is_cow ); 379 380 /********************************************************************************************* 381 * This function is called by the vmm_handle_page_fault() to handle both the "page-fault",382 * and the "copy-on_write" events for a given <vpn> in a given <process>, as defined383 * by the <is_cow> argument.384 * The vseg containing the searched VPN must be registered in the reference VMM.385 * - for an page-fault, it allocates the missing physical page from the target cluster386 * defined by the vseg type, initializes it, and updates the reference GPT, but not387 * the copies GPT, that will be updated on demand.388 * - for a copy-on-write, it allocates a new physical page from the target cluster,389 * initialise it from the old physical page, and updates the reference GPT and all390 * the GPT copies, for coherence.391 * It calls the RPC_PMEM_GET_PAGES to get the new physical page when the target cluster392 * is not the local cluster,393 * It returns in the <attr> and <ppn> arguments the accessed or modified PTE.394 * ********************************************************************************************395 * @ process : [in] pointer on processdescriptor.396 * @ vpn : [in] VPN defining the missing PTE.397 * @ is_cow : [in] "copy_on_write" if true / "page_fault" if false.398 * @ attr : [out] PTE attributes.399 * @ ppn : [out] PTE ppn.400 * @ returns 0 if success / returns ENOMEM if error.401 * *******************************************************************************************/402 error_t vmm_get_pte( struct process_s * process, 403 vpn_t vpn,404 bool_t is_cow,405 uint32_t * attr,406 ppn_t * ppn );380 vpn_t vpn ); 381 382 /********************************************************************************************* 383 * This function is called by the generic exception handler in case of copy-on-write event, 384 * detected for a given <vpn> in a given <process> in any cluster. 385 * It returns a kernel panic if VPN is not in a registered vseg or is not mapped. 386 * For a legal mapped vseg there is two cases: 387 * 1) If the missing VPN belongs to a private vseg (STACK or CODE segment types, non 388 * replicated in all clusters), it access the local GPT to get the current PPN and ATTR. 389 * It access the forks counter in the current physical page descriptor. 390 * If there is a pending fork, it allocates a new physical page from the cluster defined 391 * by the vseg type, copies the old physical page content to the new physical page, 392 * and decrements the pending_fork counter in old physical page descriptor. 393 * Finally, it reset the COW flag and set the WRITE flag in local GPT. 394 * 2) If the missing VPN is public, it access the reference GPT to get the current PPN and 395 * ATTR. It access the forks counter in the current physical page descriptor. 396 * If there is a pending fork, it allocates a new physical page from the cluster defined 397 * by the vseg type, copies the old physical page content to the new physical page, 398 * and decrements the pending_fork counter in old physical page descriptor. 399 * Finally it calls the vmm_global_update_pte() function to reset the COW flag and set 400 * the WRITE flag in all the GPT copies, using a RPC if the reference cluster is remote. 401 * In both cases, concurrent accesses to the GPT are handled, thanks to the 402 * remote_rwlock protecting each GPT copy. 403 ********************************************************************************************* 404 * @ process : pointer on local process descriptor copy. 405 * @ vpn : VPN of the faulting PTE. 406 * @ returns EXCP_NON_FATAL / EXCP_USER_ERROR / EXCP_KERNEL_PANIC after analysis 407 ********************************************************************************************/ 408 error_t vmm_handle_cow( struct process_s * process, 409 vpn_t vpn ); 407 410 408 411 /*********************************************************************************************
Note: See TracChangeset
for help on using the changeset viewer.