커널은 시스템이 부팅 될 때 커널을 메모리에 올린다.
32bit 시스템에서는 한번에 처리할수 있는 양이 32bit이다.
문제는 8086에서 세그멘테이션 기법과 페이징 기법중 무엇을 쓰냐가 헷갈렸는데
intel 8086에서는 둘다 사용한다.
세그멘테이션 기법과 페이징 기법의 가장 큰 차이는
세그멘테이션 기법은 서로 크기가 다른 세그멘트를 분리한 후 물리 주소를 논리주소로 변환한다.
하지만 페이징 기법은 가상된 메모리를 고정된 크기로 나누어 메모리를 관리하는 것이다.
각각의 세그먼트들은 Code segment, Stack segment, Data segment로 나누어 진다.
프로세스 메모리 구조를 자세히 보면
프로세스 메모리를 보면 kernel이 0xffffffff에서부터 0xc0000000로 메핑된다.
code영역은 프로그램의 코드가 담겨져 있고 data영역은 rodata, bss, data로 나누어 진다.
rodata는 read only data로 읽기 권한만 가지고 있는 부분이다.
data부분은 전역변수 중 초기화 된 값을 가질 때 사용되고
bss부분은 전역변수 중 초기화 안된 값을 가질 때 사용된다.
지역변수는 stack에 들어간다. push and pop을 이용해서 데이터를 저장하고 빼낸다. stack은 위에서부터 밑으로 쓰고 heap(동적할당)부분은 밑에서부터 아래로 쓴다.
heap영역이 확장 될때는 brk라는 시스템 콜을 이용해서 확장 시킨다.
'system > level1' 카테고리의 다른 글
컴파일 과정(LINUX GCC) (0) | 2017.04.10 |
---|---|
linux 정적 컴파일 동적 컴파일 (0) | 2017.04.09 |
리눅스 파일 권한 설정 (0) | 2017.04.09 |
리눅스 기초(리눅스 디렉토리) (0) | 2017.04.04 |
리눅스 기초(리눅스 구조) (0) | 2017.04.04 |