다음 문제는 '리눅스 커널 내부구조(백승재, 최종무)' 책의 연습문제 풀이입니다.
(제가 푼거라 틀릴 수도 있고, 풀지 못한 문제도 있습니다.)
1. heap을 사용하는 프로그램을 작성해보자. stack을 사용하는 프로그램도 작성해보자. 어려울 경우 3장의 그림 3.2를 참고하라.
heap :
#include <memory.h>
int main(void) {
int *numArray = (int*) malloc(sizeof(int) * 10);
free(numArray);
return 0;
}
stack :
int main(void) {
int i = 10; // 지역변수의 값은 스택에 저장되므로 스택에 10을 저장하게 된다.
return 0;
}
2. 함수가 호출될 때는 스택에 어떤 값을 저장할까? 이때 스택에 저장되는 값을 변경함으로써 함수가 종료된 후, 함수를 호출한 원래 위치가 아닌 다른 곳으로 복귀되도록 스택의 내용을 변경해보자.
함수가 호출될 때는 함수가 끝난 후에 실행할 명령어의 주소(eip or rip)를 스택에 저장한다. 이 값을 ret (= return) 라고도 하는데,
이 값을 변경하면 프로그램의 흐름이 바뀌게 된다. 단, 텍스트 영역의 주소가 아닌 다른 영역의 주소를 입력할 경우 세그먼테이션 폴트(Segmentation Fault)가 발생한다.
FTZ 풀 때 오질나게 바꿔봤으므로 패스!
3. 리눅스 메모리 관리에서 Node의 필요성을 논해보자.
책에서 설명했듯, CPU가 여러 개일 경우 CPU에 따라서 빠르게 접근할 수 있는 메모리가 있고, 그렇지 않은 메모리가 있다. 그래서
속도가 같은 메모리의 집합을 하나의 뱅크(Bank)라고 하고 이를 구현한 자료구조가 바로 노드(Node)이다. 그러므로 노드는 메모리를
더 효율적으로 관리하기 위해 필요하다.
4. 가상 메모리의 도입이 야기한 프로그래밍 모델의 변화와 CPU 구조의 변화를 논의해보자.
프로그래밍 모델의 변화 : 뭘 말하는지 잘 모르겠다.
CPU 구조의 변화 : CPU 구조의 변화라고 할 수 있을진 모르겠지만, 가상 메모리 기법이 도입되면서
하드웨어 차원에서 가상 메모리 주소를 물리 주소로 변환하는 것을 도와주는 MMU(Memory Management Unit) 장치가
생겼고 이에 따라 메모리 주소 접근 과정에서 한 단계(가상 주소->물리 주소)가 더 추가되었다.
요 밑에 문제들은 아직 지식이 부족하므로 조사를 해봐야겠다.
5. 만약 사용자 수준 태스크에서 malloc() 함수를 사용했다면 반드시 free()시켜줘야 하는가? kernel 내부에서 메모리를 할당받는 함수인 kmalloc()를 쓸 떄는 어떨까? 해결책은?
6. 사용자 프로그램에서 malloc() 함수를 호출하면 커널 내부에서는 어떤 작업이 수행되는가? strace와 ltrace등의 도구를 사용하면 좀 더 쉽게 파악할 수 있다.
7. kmalloc()/kfree(), alloc_pages()/free_pages(), vmalloc()/vfree() 함수를 사용해 메모르=ㅣ를 할당/해제해보자. 7장 모듈에 대해 배우고 나면 더 수월하게 작성할 수 있을 것이다.
8. 10.3절에 구현된 buddy 할당자를 개선하여 Lazy buddy를 구현해보자.
9. 물리 메모리의 공간이 부족하면, 이미 존재하고 있는 메모리 객체중 일부를 교환해야 한다. 어떤것을 교체해야 할까? 지역성(locality)의 영향을 고려하자.
10. 2^64 크기의 가상 공간을 어떻게 사용해야 할까 논의해보자.
'Programming' 카테고리의 다른 글
코딩 컨벤션 (0) | 2017.12.30 |
---|
댓글