Skip to content

Commit 5c66b7d

Browse files
committed
撤销冗余的文件内存分配,减少内存占用.
1 parent 7adbfa2 commit 5c66b7d

File tree

2 files changed

+24
-46
lines changed

2 files changed

+24
-46
lines changed

src/arch/x86_64/task/sched_x64.c

Lines changed: 23 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
#include "intctl.h"
66
#include "io.h"
77
#include "krlibc.h"
8-
#include "apic.h"
98
#include "lock.h"
109
#include "mem/frame.h"
1110
#include "mem/page.h"
@@ -19,14 +18,12 @@ spin_t tsc_lock = SPIN_INIT;
1918

2019
__attribute__((naked, noreturn)) void
2120
arch_run_on_kernel_stack(uint64_t stack_top, arch_stack_entry_t entry, void *arg) {
22-
__asm__ volatile(
23-
"mov %rdi, %rsp\n\t"
24-
"andq $-16, %rsp\n\t"
25-
"xorq %rbp, %rbp\n\t"
26-
"mov %rdx, %rdi\n\t"
27-
"call *%rsi\n\t"
28-
"ud2\n\t"
29-
);
21+
__asm__ volatile("mov %rdi, %rsp\n\t"
22+
"andq $-16, %rsp\n\t"
23+
"xorq %rbp, %rbp\n\t"
24+
"mov %rdx, %rdi\n\t"
25+
"call *%rsi\n\t"
26+
"ud2\n\t");
3027
}
3128

3229
void cpuid(uint32_t code, uint32_t *a, uint32_t *b, uint32_t *c, uint32_t *d) {
@@ -90,15 +87,15 @@ void calibrate_tsc_with_hpet() {
9087
}
9188

9289
void arch_context_init(tcb_t thread, struct arch_context_ *context) {
93-
context->kernel_stack = (uint64_t)thread + STACK_SIZE;
94-
context->user_stack = context->kernel_stack;
90+
context->kernel_stack = (uint64_t)thread + STACK_SIZE;
91+
context->user_stack = context->kernel_stack;
9592
context->user_stack_top = context->kernel_stack;
96-
context->regs.rsp = context->kernel_stack;
97-
context->regs.rflags = get_rflags();
98-
context->regs.cs = 0x8;
99-
context->regs.ss = 0x10;
100-
context->regs.es = 0x10;
101-
context->regs.ds = 0x10;
93+
context->regs.rsp = context->kernel_stack;
94+
context->regs.rflags = get_rflags();
95+
context->regs.cs = 0x8;
96+
context->regs.ss = 0x10;
97+
context->regs.es = 0x10;
98+
context->regs.ds = 0x10;
10299
set_kernel_stack(context->kernel_stack);
103100
context->fs_base = read_fsbase();
104101
context->gs_base = read_gsbase();
@@ -201,7 +198,7 @@ void arch_task_switch(tcb_t current, tcb_t next, struct pt_regs *regs) {
201198
static uint64_t push_slice(uint64_t ustack, uint8_t *slice, uint64_t len) {
202199
uint64_t tmp_stack = ustack;
203200
tmp_stack -= len;
204-
tmp_stack -= (tmp_stack % 0x08);
201+
tmp_stack -= tmp_stack % 0x08;
205202
memcpy((void *)tmp_stack, slice, len);
206203
return tmp_stack;
207204
}
@@ -231,9 +228,9 @@ static uint64_t build_user_stack(
231228

232229
uint64_t execfn_ptr = tmp_stack;
233230

234-
uint64_t *envps = (uint64_t *)malloc(1024);
231+
uint64_t *envps = malloc(1024);
235232
memset(envps, 0, 1024);
236-
uint64_t *argvps = (uint64_t *)malloc(1024);
233+
uint64_t *argvps = malloc(1024);
237234
memset(argvps, 0, 1024);
238235

239236
if (envp != NULL) {
@@ -254,35 +251,18 @@ static uint64_t build_user_stack(
254251
tmp_stack -= (tmp_stack - total_length) % 0x10;
255252

256253
uint8_t random_bytes[16];
257-
for (int i = 0; i < 16; i++)
254+
for (int i = 0; i < 16; i++) {
258255
random_bytes[i] = (uint8_t)(i * 17 + 42);
256+
}
259257
tmp_stack = push_slice(tmp_stack, random_bytes, 16);
260258
uint64_t random_addr = tmp_stack;
261259

262260
// push auxv
263-
uint8_t *tmp = (uint8_t *)malloc(2 * sizeof(uint64_t));
261+
uint8_t *tmp = malloc(2 * sizeof(uint64_t));
264262
memset(tmp, 0, 2 * sizeof(uint64_t));
265263
tmp_stack = push_slice(tmp_stack, tmp, 2 * sizeof(uint64_t));
266264

267-
page_map_range_to_random(
268-
task->process->directory,
269-
EHDR_START_ADDR,
270-
task->process->exec->size,
271-
PTE_PRESENT | PTE_WRITEABLE | PTE_USER
272-
);
273-
memcpy((void *)EHDR_START_ADDR, src_data, task->process->exec->size);
274-
275-
if (link_data != NULL) {
276-
page_map_range_to_random(
277-
task->process->directory,
278-
INTERPRETER_EHDR_ADDR,
279-
link_size,
280-
PTE_PRESENT | PTE_WRITEABLE | PTE_USER
281-
);
282-
memcpy((void *)INTERPRETER_EHDR_ADDR, link_data, link_size);
283-
}
284-
285-
Elf64_Ehdr *ehdr = (Elf64_Ehdr *)EHDR_START_ADDR;
265+
Elf64_Ehdr *ehdr = (Elf64_Ehdr *)src_data;
286266
// CP_Kernel 将用户程序本体从 0 地址加载故不加phdrs的偏移
287267
Elf64_Phdr *phdrs = (Elf64_Phdr *)(ehdr->e_phoff + load_start);
288268

@@ -363,7 +343,6 @@ static uint64_t build_user_stack(
363343
}
364344
free_argv(argv);
365345

366-
367346
return tmp_stack;
368347
}
369348

@@ -373,7 +352,7 @@ _Noreturn void arch_switch_to_user_mode() {
373352
tcb_t current = get_current_task();
374353
current->context.regs.rflags = 0 << 12 | 0b10 | 1 << 9;
375354

376-
pcb_t process = current->process;
355+
pcb_t process = current->process;
377356
uint64_t data_phys = 0;
378357
size_t data_pages = 0;
379358
uint8_t *data = NULL;
@@ -404,8 +383,7 @@ _Noreturn void arch_switch_to_user_mode() {
404383
Elf64_Ehdr *ehdr = (Elf64_Ehdr *)data;
405384
uint64_t executor_start = ehdr->e_type == ET_DYN ? EXECUTOR_BASE_ADDR : 0;
406385
uint64_t load_start = 0;
407-
void *entry =
408-
load_executor_elf(data, process->directory, executor_start, &load_start, process);
386+
void *entry = load_executor_elf(data, process->directory, executor_start, &load_start, process);
409387
if (entry != NULL && ehdr->e_type == ET_DYN) {
410388
entry = (void *)((uint64_t)entry + load_start);
411389
}

src/include/mem/vma.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ typedef struct vma {
2727
int vm_fd; // 文件描述符(文件映射用)
2828
int64_t vm_offset; // 文件偏移量
2929
int shm_id; // 共享内存ID
30-
char *vm_name; // VMA 名称
30+
char *vm_name; // VMA 名称 (vma 结构体必须拥有此字段的所有权)
3131
struct vma *vm_next; // 链表下一个节点
3232
struct vma *vm_prev; // 链表前一个节点
3333
} vma_t;

0 commit comments

Comments
 (0)