[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[tyndur-devel] [PATCH 06/11] kernel2: Synchronisieren von mm-Kontexten mit dem Kernel-Kontext
+ mmc_sync: Wird unter amd64 tendenziell eher selten gebraucht,
da der Kernel-Speicher sich kaum über 512GiB bewegen wird. Diese
Möglichkeit wollen wir dem Kernel aber dennoch nicht nehmen.
Signed-off-by: Andreas Freimuth <m.nemo@xxxxxxx>
---
src/kernel2/src/arch/amd64/mm/mm_context.c | 37 ++++++++++++++++++++++++++++
1 files changed, 37 insertions(+), 0 deletions(-)
diff --git a/src/kernel2/src/arch/amd64/mm/mm_context.c b/src/kernel2/src/arch/amd64/mm/mm_context.c
index 7d4670b..5438e78 100644
--- a/src/kernel2/src/arch/amd64/mm/mm_context.c
+++ b/src/kernel2/src/arch/amd64/mm/mm_context.c
@@ -51,6 +51,43 @@
/// Bestimmt ob das NX-Bit benutzt werden soll.
bool mmc_use_no_exec = false;
+mmc_context_t kernel_ctx = {
+ .version = 0,
+ .lock = LOCK_UNLOCKED
+};
+
+/**
+ * Synchronisiere einen MM-Kontext mit dem Kernel-Kontext
+ *
+ * @param ctx MM-Kontext
+ */
+void mmc_sync(mmc_context_t* ctx)
+{
+ // TODO ctx und kernel_ctx locken (Philosophenproblem)
+ if(ctx->version < kernel_ctx.version) {
+
+ mmc_pm_entry_t* user_pm = MAPPED_PHYS_MEM_GET(ctx->pml4);
+ mmc_pm_entry_t* kernel_pm = MAPPED_PHYS_MEM_GET(kernel_ctx.pml4);
+
+ // Kopiere die vom Kernel belegten Page Maps
+ unsigned int kernelStartIndex = PAGE_MAP_INDEX(KERNEL_MEM_START);
+
+ memcpy(&user_pm[kernelStartIndex], &kernel_pm[kernelStartIndex],
+ sizeof(mmc_pm_entry_t) *
+ NUM_PAGE_MAPS(KERNEL_MEM_END - KERNEL_MEM_START));
+
+
+ // Kopiere Identity Map
+ unsigned int idMapStartIndex =
+ PAGE_MAP_INDEX(MAPPED_PHYS_MEM_START & ~ADDRESS_SIGN_EXTEND);
+
+ memcpy(&user_pm[idMapStartIndex], &kernel_pm[idMapStartIndex],
+ sizeof(mmc_pm_entry_t) *
+ NUM_PAGE_MAPS(-1L - MAPPED_PHYS_MEM_START));
+ ctx->version = kernel_ctx.version;
+ }
+}
+
/**
* Erstellt einen neuen MM-Kontext (PM) für einen Prozess
*
--
1.7.3.4