[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[tyndur-devel] [PATCH] kernel2: Memory consumption for 'ps'
+ 'ps' now shows the memory consumed by each process
Signed-off-by: Patrick Pokatilo <shyxormz@xxxxxxxxxx>
---
src/kernel2/include/tasks.h | 3 +++
src/kernel2/src/syscalls/mem.c | 6 ++++++
src/kernel2/src/syscalls/pm.c | 4 +++-
src/kernel2/src/tasks/modules.c | 1 +
src/kernel2/src/tasks/pm.c | 2 ++
5 files changed, 15 insertions(+), 1 deletions(-)
diff --git a/src/kernel2/include/tasks.h b/src/kernel2/include/tasks.h
index fc0bc88..df73e1d 100644
--- a/src/kernel2/include/tasks.h
+++ b/src/kernel2/include/tasks.h
@@ -99,6 +99,9 @@ typedef struct pm_process {
* aufgerufen werden
*/
list_t* on_destroy;
+
+ /// Speicherverbrauch des Prozesses
+ uintmax_t memory_used;
} pm_process_t;
typedef struct {
diff --git a/src/kernel2/src/syscalls/mem.c b/src/kernel2/src/syscalls/mem.c
index 20f9e73..4126fdf 100644
--- a/src/kernel2/src/syscalls/mem.c
+++ b/src/kernel2/src/syscalls/mem.c
@@ -54,6 +54,8 @@ vaddr_t syscall_mem_allocate(size_t bytes, syscall_arg_t flags, paddr_t* phys)
vaddr_t address = NULL;
size_t page_count = NUM_PAGES(PAGE_ALIGN_ROUND_UP(bytes));
+ current_process->memory_used += page_count << PAGE_SHIFT;
+
if (flags & 0x80) {
// ISA-DMA-Speicher
// Physisch zusammenhaengend und nur in den ersten 16 MB
@@ -100,6 +102,8 @@ vaddr_t syscall_mem_allocate_physical(
size_t bytes, paddr_t position, syscall_arg_t flags)
{
size_t page_count = NUM_PAGES(PAGE_ALIGN_ROUND_UP(bytes));
+
+ current_process->memory_used += page_count << PAGE_SHIFT;
return mmc_automap(&mmc_current_context(), position, page_count,
USER_MEM_START, USER_MEM_END, MM_FLAGS_USER_DATA);
@@ -117,6 +121,8 @@ void syscall_mem_free(vaddr_t start, size_t bytes)
start = (vaddr_t) PAGE_ALIGN_ROUND_DOWN((uintptr_t) start);
size_t num_pages = NUM_PAGES(bytes);
+ current_process->memory_used -= num_pages << PAGE_SHIFT;
+
// Jetzt werden die Seiten freigegeben
while (num_pages-- != 0) {
// Physische Adresse ausfindig machen und Page in der
diff --git a/src/kernel2/src/syscalls/pm.c b/src/kernel2/src/syscalls/pm.c
index 0b36df3..33cd7bc 100644
--- a/src/kernel2/src/syscalls/pm.c
+++ b/src/kernel2/src/syscalls/pm.c
@@ -172,6 +172,8 @@ void syscall_init_child_page(pid_t pid, vaddr_t dest, vaddr_t src, size_t size)
// Anzahl der Seiten berechnen
size_t num_pages = NUM_PAGES(size);
+ current_proccess->memory_used -= num_pages << PAGE_SHIFT;
+ process->memory_used += num_pages << PAGE_SHIFT;
// Adressen kopieren damit sie veraendert werden koennen
// Sie duerfen nicht ueberschrieben werden, weil sie am Schluss noch
@@ -298,7 +300,7 @@ void* syscall_pm_enumerate_tasks(void)
// hinter die aktuelle setzen.
cmdlines += cmdline_size;
- task_info->tasks[i].memory_used = 0; // TODO
+ task_info->tasks[i].memory_used = task->memory_used; // TODO
}
return task_info;
diff --git a/src/kernel2/src/tasks/modules.c b/src/kernel2/src/tasks/modules.c
index 8dac7a5..cca11c4 100644
--- a/src/kernel2/src/tasks/modules.c
+++ b/src/kernel2/src/tasks/modules.c
@@ -201,6 +201,7 @@ void load_multiboot_modules(struct multiboot_info* multiboot_info)
&init_process->context,
(paddr_t) multiboot_module->start, pages,
MM_USER_START, MM_USER_END, MM_FLAGS_USER_DATA);
+ init->process->memory_used += pages << PAGE_SHIFT;
// TODO: Den Speicher aus dem Kerneladressraum unmappen
diff --git a/src/kernel2/src/tasks/pm.c b/src/kernel2/src/tasks/pm.c
index 94fbbbf..846323a 100644
--- a/src/kernel2/src/tasks/pm.c
+++ b/src/kernel2/src/tasks/pm.c
@@ -168,6 +168,8 @@ pm_process_t* pm_create(pm_process_t* parent, const char* cmdline)
list_push(process_list, process);
+ process->memory_used = 0;
+
return process;
}
--
1.7.0.4