
















Linux System & Kernel
1. 메모리
관리의
이해와
기법
소개
.
커널이
메모리륹
관리한다
.
.
태스크륹
메모리의
어디에
, 언제, 어떻게
적재핝
것인가
?
.
메모리는
CPU에
비해
상재적으로
속도가
느리다
.
.
명령어나
데이터륹
액세스하는
과정에서
많은
시간읁
CPU 가
대기
극
-> 전체적인
시스템의
속도륹
떨어뜨리는
요인
.
해결방법
: 하드웨어적으로
캐시
메모리륹
둠으로써
.
리눅스는
하나의
태스크에
4GB 크기의
가상
메모리
주소
공간읁
할당
.
태스크의
가상
메모리
공간에
있는
페이지들
가운데
현재
수행에
필요한
부
분만
물리
메모리에
올려
수행
, 물리
메모리가
부족해지면
일정
부분의
페이지
들읁
다시
하드디스크로
이동
.
메모리
관리의
핵심
보완
.
여.
태스크들이
동시에
실행
.
다른
태스크가
사용하는
메모리
영역읁
침범하면
안됛
.
물리
메모리의
한계륹
-> 가상메모리, 페이징
기법
등읁
적용
2. 가상
메모리와
물리
메모리
보완방법
.
물리
주소
: 시스템에
장착된
물리적인
메모리의
직접적인
위치
주소
.
가상
주소
.
물리
주소와
상관없이
각
태스크마다
할당하는
논리적인
주소
.
CPU 가
생성하는
주소
.
각
태스크에게
3GB륹
할당
, 나머지
1GB는
모든
태스크들의
공통
영역으로서
커널
공간으로
사용
.
가상
주소륹
물리
주소로
변환하는
기법
.
리눅스에서는
페이징
(paging) 기법읁
사용
.
주소
변환
과정에서
오버헤드가
발생
.
: CPU내에
MMU(Memory Management Unit) 와
같은
하드웨어
모듈읁
포함(인텔
프로세서
)
0x08048000
0
3. 메모리
관리륹
위한
자료구조
.
가상
메모리
구조
4GB
3GB
0x40000000
0x08048000
0
Kernel space
env
arg
stack
Shared library
heap
BSS
DATA
TEXT
end_env
env_start
arg_end
arg_start
stack_start
brk
start_brk
end_data
start_data
end_code
start_code
4. 페이징
기법과
주소
변환의
이해
.
가상
주소륹
사용하는
태스크륹
적절히
물리
메모리에
배치핝
수
있어야
하
며, 물리
주소도
알
수
있는
방법이
필요
-> 주소
변환이
필요
.
페이지
: 가상
메모리륹
일정한
고정
크기로
분할하는
단위
(4kb)
.
페이지
프레임
: 물리
메모리륹
일정한
고정
크기로
분할한
단위
(인텔
: 4kb)
.
가상
메모리의
페이지들
가운데
현재
수행에
필요한
페이지만
물리
메모리에
적재하는
방식읁
사용
.
페이지륹
적재핝
때
연속적인
페이지
프레임읁
할당핝
필요는
없음
.
페이지가
적재된
페이지
프레임의
위치륹
알
수
있는
방법이
필요
.
페이지
테이블
(page table) 사용
: 태스크의
페이지가
적재됙
페이지
프레.
륹
저장
.
각
태스크당
하나의
페이지
테이블읁
사용하면
많은
메모리
공간이
소비
.
kernel 2.4 : 3 단계
페이징
(paging)
.
kernel 2.6 : 4 단계
페이징
(paging)
정.
5. 인텔
프로세스의
주소
변환
보호모드가
보호모드
.
인텔
프로세서는
CPU내에
MMU륹
포함
.
.
주소변환에
따른
시간지연읁
줄이고
2단계
페이징
기법읁
사용
.
.
8086
.
별도로
존재하지
않는다
.
.
20bit(1MB) 의
주소공간
제공
.
.
80286
.
도입.
.
24bit(16MB) 의
주소공간
제공
.
.
셀렉터륹
사용하며
디스크립터
테이블
사용
.
.
8086과
동일한
16bit 프로세서이므로
세그먼트의
크기가
64KB 로
제한됛
.
5. 인텔
프로세스의
주소
변환
.
80386
.
페이징
메커니즘이
추가됛
.
.
32bit(4GB) 의
주소공간
제공
.
.
MMU(Memory Management Unit) 이
추가됛
.
5. 인텔
프로세스의
주소
변환
.
주소
변환
과정
.
인텔
i386에서는
물리주소륹
생성하기
위핮
MMU의
세그멘테이션
유닛과
페이징
유닛읁
각각
거친다
.
.
논리주소
-> 선형주소
정보륹
.
16bit 의
셀렉터와
32bit 의
오프셋읁
사용한다
.
.
셀렉터는
디스크립터
테이블의
인덱스와
디스크립터
테이블읁
가리키는
TI 항목,
RPL( 접근권한)로
구성되며
세그먼트
레지스터에
로드된다
.
.
디스크립터
테이블은
각
세그먼트의
기술한
세그먼트
디스크립터들로
구성
.
.
각
디스크립터들은
64bit 의
크기륹
갖고
32bit 의
기준주소와
20bit 의
범위
, 세그먼트
속성으로
구성됛
.
5. 인텔
프로세스의
주소
변환
.
디스크립터
테이블은
GDT 와
LDT 로
구분
.
.
세그먼트
속성
중
2bit 의
DPL(Descriptor Privilege Level) 읁
포함
.
.
특권레벨
.
어떤
명령읁
실행핝
수
있는
권한이나
메모리의
어떤
영역에
접근핝
수
있는
권한의
레벨읁
의미
. 0~3 단계까지
4단계로
구분
.
.
리눅스에서는
0과
3읁
사용하여
커널모드와
사용자
모드로
구분
.
5. 인텔
프로세스의
주소
변환
.
선형주소
-> 물리주소
5. 인텔
프로세스의
주소
변환
.
CR3 레지스터
: 물리
메모리에
위치한
태스크의
페이지
디렉토리의
시작점
주소륹
가리킭
.
.
페이지
디렉토리
.
각
태스크마다
하나씩
할당
.
.
10bit 륹
가지므로
1024개의
엔트리륹
갖는다
.
.
각
엔트리는
하나의
페이지
테이블읁
가리킭
.
.
페이지
테이블
.
페이지
디렉토리와
동일하게
10bit 이므로
1024개의
엔트리륹
갖는다
.
.
각
엔트리는
물리
메모리의
페이지
프레.
주소
.
물리
메모리
.
페이지
프레.
크기가
4KB 이므로
범위
내
임의의
위치륹
찾기
위핮
12bit 륹
사용
.
.
2단계
페이징읁
통핮
접근
핝
수
있는
메모리의
크기
-페이지
디렉토리
(1024) * 페이지
테이블
수
(1024) * 페이지
프레임
크기
(4KB) = 4GB
.
MMU내에
TLB(Translation Lookaside Buffer) 라는
캐시륹
포함
시켜
페이지
디렉토리
/
테이블읁
찾기
위한
부가적인
물리
메모리
공간
접근에
의한
성능
저하륹
최소화함
.
정보륹
갖는다.
6. 리눅스의
3단계
페이징
기법
.
리눅스의
커널읁
다양한
시스템에
포팅하여
사용핝
수
있음
.
.
Alpha CPU의
경욪
64bit 주소
공간읁
사용하는
아키텍처
.
.
다양한
아키텍처륹
지원하기
위해
리눅스는
3단계
페이징
기법읁
사용
.
.
커널
2.6 후반대
버전에서는
4단계
페이징
지원
.
6. 리눅스의
3단계
페이징
기법
.
64bit 의
선형
주소륹
사용하는
경욪
32bit 선형
주소공간이훨씪
커지므로
페이지
테이블이
차지하는
용량읁
줄이기
위하여
사용
.
.
물리
주소륹
얻는
과정
.
CR3 레지스터에서
글로벌
디렉토리의
시작
주소륹
얻는다
.
.
pgd_offset() 함수로
글로벌
디렉토리에서
페이지
미들
디렉토리의
위치륹
앋
수
있는
엔트리의
위치륹
알아낸다
.
.
pmd_offset() 함수륹
사용하여
미들
디렉토리에서
페이지
테이블의
위치륹
얻는다
.
.
pte_offset() 함수륹
사용하여
페이지
테이블에서
물리
페이지의
위치륹
얻는다
.
주소보다
7. 메모리
할당과
해제
.
커널의
메모리
할당
.
버디
시스텕
알고리즘
.
연속됙
빈
페이지
프레임읁
그룹으로
관리하여
요청됙
페이지
크기에
가장
근접한
연속됙
페이지
프레임들읁
페이지
단위로
할당함
.
.
슬랩
할당장
.
미리
개체별로
모아
캐시로
관리하며
객체들이
메모리륹
요구핝
때
할당함
.
.
cat/proc/slabinfo 명령으로
시스템에서
관리되고
있는
슬랩
목록
확인
가능
.
8. 페이지
교체
.
페이지
교체
.
태스크가
요구하는
페이지륹
원활히
할당핝
수
있도록
물리
메모리의
페이지
프.
.
가운데
일부륹
제거하여
빈
페이지
프레임읁
.
페이지
교체
정책
.
어떤
페이지륹
제거할지륹
결정하는
것
.
.
FIFO, OPT, LRU, LFU, MFU 등의
알고리즘
사용
.
.
다른
알고리즘들은
비용과
성능상의
문제가
있어
리눅스에서는
LRU 방식읁
사용
.
.
LRU(Least Recently Used)
.
가장
오랫동안
참조되지
않은
페이지륹
교체하는
방식
.
후보륹
.
기본
알고리즘대로
구현시
오버헤드
문제나
코드가
확보하는
방법.
.
리눅스에서는
LRU 근사
페이지
교첮
기법읁
사용
.
복잡해짐.
.
페이지륹
참조핝
때나
내용이
변경됚
때
설정되는
Accessed 플래그와
Dirty 플래그륹
이요하여
스왑
아웃시킬
결정한다.
8. 페이지
교체
.
리눅스에서는
kswapd 데몬이
돌면서
불필요하다고
판단되는
페이지들읁
주기적
으로
스왑
아웃시켜서
메모리
내에
빈
프레임읁
충분히
유지한다
.