-
[OS] 22. MallocOS/OS from Scratch 2021. 7. 24. 20:40
서론
이번 강의에서는 간단한 malloc 함수를 구현하겠습니다. 해당 Github 강의는 다음과 같습니다.
https://github.com/cfenollosa/os-tutorial/tree/master/22-malloc
GitHub - cfenollosa/os-tutorial: How to create an OS from scratch
How to create an OS from scratch. Contribute to cfenollosa/os-tutorial development by creating an account on GitHub.
github.com
이론
Paging 기법
컴퓨터는 메모리를 가상 메모리로서 관리하는데, 이를 통해 실제 메모리를 추상화해 프로세스들이 연속된 메모리를 사용하는 것처럼 만들 수 있게 합니다. 이때, 가상 메모리와 실제 메모리를 매핑하는 데에 Paging 기법이 사용됩니다. Paging 기법은 가상 메모리의 공간을 일정한 크기로 나눈 블록인 Page을 단위로 사용합니다. 실제 메모리도 Page와 같은 크기로 나눈 블록인 Frame 단위도 사용되며, Page가 하나의 Frame을 할당받습니다. 이 과정에서 Page는 프로세스의 Page 정보와 Page에 대한 Frame의 시작 주소를 값으로 하는 Page Table형태로 관리됩니다.
코드
이번 강의에서는 kmalloc 함수를 구현합니다.
libc/mem.c
// kernel은 0x1000부터 시작 u32 free_mem_addr = 0x10000; u32 kmalloc(u32 size, int align, u32 *phys_addr) { // 0x1000단위로 할당 if(align==1 && (free_mem_addr & 0xFFFFF000)) { free_mem_addr &= 0xFFFFF000; free_mem_addr += 0x1000; } if(phys_addr) { *phys_addr = free_mem_addr; } u32 ret = free_mem_addr; free_mem_addr += size; return ret; }
kernel/kernel.c
void user_input(char *input) { if(strcmp(input, "END")==0) { kprint("Stop System...\n"); // hlt: halt CPU asm volatile("hlt"); } else if(strcmp(input, "PAGE")==0) { u32 phys_addr; u32 page = kmalloc(1000, 1, &phys_addr); char page_str[16] = ""; hex_to_ascii(page, page_str); char phys_str[16] = ""; hex_to_ascii(phys_addr, phys_str); kprint("Page: "); kprint(page_str); kprint(", Physical Address: "); kprint(phys_str); kprint("\n"); } kprint("> Typed: "); kprint(input); kprint("\n"); }
실행 결과
실행 결과 Malloc 기능이 작동하는 것을 볼 수 있습니다.
실행결과 'OS > OS from Scratch' 카테고리의 다른 글
[OS] 23. Finish (0) 2021.07.29 [OS] 21. Shell (0) 2021.07.23 [OS] 20. Interrupt-timer (0) 2021.07.18 [OS] 19. Interrupt-irqs (0) 2021.07.12 [OS] 18. Interrupts (0) 2021.07.03