1. [UNIX V6로 배우는 커널의 원리와 구조]
chapter1. UNIX V6 / chapter2. 프로세스
김지은
yeswldms@gmail.com
2. 교재
UNIX V6 :
UNIX V6로 배우는 커널의 원리와 구조
아오야기 타카히로 지음
조만석 옮김(IAMROOT OB님^^)
한빛소프트
3. 지은이의 말
• 1975년에 벨 연구소에서 배포한 Sixth Edition Unix(이하 UNIX V6)의 커널 해석
• 커널소스 읽기
커널(Kernel) – OS의 핵심, 컴퓨터 시스템을 사용하는 데 /꼭 필요한 기능을 제공
쉘프로그램(shell program) – 커널의 기능을 이용해서 만들어진 SW
OS는 프로그램을 “커널프로그램”, “사용자프로그램”으로 구분
- 컴퓨터 시스템을 큰 그림으로 이해
- 컴퓨터가 더 재밌어짐
- 컴퓨터 시스템을 구성하는 기능에 대해 더 깊게 이해할 수 있음
- 한 단계 높은 기술자로 성장할 수 있음
• 왜 UNIX V6가 교재로 좋은가?
- 약 10,000의 코드(리눅스 최신 버전의 커널소스는 약 1,000줄)
- 충실한 자료, Lions’ Commentary on UNIX V6 Edition with Source Code(PDP-11/40용 어셈블러 사양과 어셈플러
코드에 대한 해설도 담고있어서 함께보는 걸 권장)
- PDP-11이나 주변장치 기술 사양도 검색이 쉽게 됨
- OS의 기본 아이디어 뿌리, 기초를 다지는데 적합함
- 복잡하지 않은 기능 구현
- 전체 시스템의 그림을 이해
- 에뮬레이터, 여러 프로세서를 에뮬레이션하는 simh소프트웨어를 사용해 PDP-11시리즈 기반에서 UNIX V6fmf 동
작해볼 수 있음
- 몇가지 문제점,…….. Pre K&R
4. 지은이의 말
• 책의 구성
#2~4장 프로그램을 실행하고 관리하는 프로세스
2 프로세스 구조
3 프로세스 관리방법
4 스와핑처리
# 5,6장 인터럽트 처리
5 주변장치나 CPU내부에서 발생한
인터럽트처리 와 시스템 콜
6 프로세스 중단 및 변경시키는 시그널
# 7,8장 디스크 I/O처리
7 블록디바이스
8 블록 디바이스 드라이버
# 9,10장 파일시스템
9 파일시스템의 구성요소
10 파일시스템을 다루는 방법
# 11장 프로세스 간 데이터 통신인 파이프
# 12장 라인프린터같은 문자 입출력
# 13장 터미널
# 14장 시스템 초가 부팅 과정
◀ Kernel의
전체구조ㅊ
Kernel
사용자프로그램
파일 시스템
블록데바이스
문자디브바이스
서브시스템
주변 장치 터미널
CPU
메모리
디바이스 드라이버
프로세스 제어
process
버퍼
5장. 시스템 콜
5장.인터럽트
process
process
6장 시그널
2,3,4장
9,10,11장
7,8,12장 13장
5. 지은이의 말
• 기술방식
기본 동작을 설명하는 것을 가장 우선적인 목표
• 소스코드 설명
구조체, 함수, 스택, 레지스터, 숫자의 표기
진법 변환
• 소스코드 분석 방법
커널 명세서, 사용자 프로그램 매뉴얼
구조체
어드레스 공간, 커널어드레스 공간/사용자어드레스 공간
7. Chapter 1. UNIX V6의 전체 큰 그림
1.1 UNIX V6란?
- Kenneth Lane Thompson과 Dennis Mac Alistair Richie가 개발
- 1975년 벨 연구소에서 발표
- 특징
1) 대부분이 C언어로 작성
2) 저작권을 허가된 사람들에게 공개함으로써, 대학등에서 각 환경에 맞게 이식되며 널리 퍼짐
3) 자신만의 독창적인 추가기능이 필요하면 소스코드를 고쳐서 사용하는 일도 많았음
이 책은, DES사의 DPD11/40이라는 프로세서에서 동작하는 커널을 다룸
1.2 UNIX 역사
- 벨 연구소에서 UNIX V6를 발표
- 1979년 Seventh Edition Unix(UNIX V7) 배포
- 1978년 버클리 대학에서 UNIX V6로 BSD 발표
- 파편화의 문제
: 표준화 규칙 POSIX라는 OS공통 API 규격발표
8. Chapter 1. UNIX V6의 전체 큰 그림
1.3 UNIX V6 커널
# 시스템 자원의 사용
> 시스템자원의 사용을 위한 기능
- 프로세스 관리
- 메모리 관리
- 파일 시스템
- 파일과 주변 디바이스를 위한 공통 I/O
- 인터럽트
- 터미널 지원
> 시스템의 메모리, CPU, DISK 등은 커널이나 드라이버는 추상화되어 사용자는 시스템을 편안히 사용할 수 있음
> 시스템 콜(system call)을 사용하여 시스템 자원을 사용
> 시스템에 영향을 주는 처리를 커널에서 관리, 안정성과 보안성 유지
어플리케이션 프로그램
Kernel
라이브러리,
시스템 프로그램 등
시스템 콜
라이브러리 함수 호출,
커맨드 실행 등
▲ UNIX V6를 구성하는 소프트웨어
사용자 애플리케이션 프로그램도
직접 시스템콜 호출도 가능
9. Chapter 1. UNIX V6의 전체 큰 그림
1.4 UNIX V6의 하드웨어
1.4.1 PDP-11 하드웨어
PDP-11 시리즈, Digital Equipment Corporation (DES) 사에서 제작한 프로세서
본 교재는 PDP-11/40을 대상으로 함
◀ PDP-11/40
10. Chapter 1. UNIX V6의 전체 큰 그림
- 16bit 장비, 명령어와 데이터를 기본 16bit 단위로 처리
PDP-11/40의 1워드는 16bit (word는 프로세서가 처리리하는 데이터 단위)
- 전용 I/O버스가 아닌 Unibus로 입/출력 (Unibus는 18bit 어드레스 사용)
- PDP-11/40의 레지스터와 주변장치의 레지스터는 메모리의 최상위 8KByte에 위치
- 메모리를 읽고 쓰듯이 각 레지스터를 읽고 씀, “메모리 맵 입출력(Memory Mapped I/O)”
- MMIO(Memory Mapped I/O)방식이란?
: 메모리중 일부분이 I/O장치에 할당되어, 그 주소로 읽고쓰는 것이 그 입출력 장치로의 명령으로 해석되는 방식
- UNIX V6은 왜 Unibus를 썼을까?
: 그 당시 UNIX V6의 버스에 붙은 장치들이 총 4개였나? 그래서 2bit으로 표현이 가능해서.. 16bit + 2bit(주변장치
위치참조부분) = 18bit으로 주소를 참조하는 건가?
PDP-11 Memory DISK Terminal
unibus
•DISK레지스터는 최상위 8KByte의 어드레스에 위치,
MMIO(Memory Mapped I/O)방식으로 주변 장치를 조작 I/O 용
메모리
8KByte
0 어드레스
11. Chapter 1. UNIX V6의 전체 큰 그림
1.4.2 PSW
- Process Status Word, 프로세서 상태 워드
- 16bit 레지스터
bit 의미
15-14 현재모드(00:커널, 11:사용자)
13-12 이전모드(00:커널, 11:사용자)
7-5 프로세서 우선순위(7~0)
4 트랩 비트(trap bit)
3 N. (negative), 명령을 실행한 결과가 음수가 되었을 때 성립됨
2 Z. (zero), 명령을 실행한 결과
1 V. (overflow), 명령을 실행한 결과 오버플로우가 발생했을 때 설정
0 C. (Carry), 명령을 실행한 결과 캐리가 발생했을때 설정
•Trap bit : 스트립트 또는 쉘이 인터럽트를 가로채서 스크립트내에서 어떤 작업을 할 수 있도록 하는 기능을 제공
일반적으로 ctrl+c 등의 작업이 일어나면 시스템 관점에서는 적절한 시그널을 발생하여 처리하게 되어있다. 하지만 이러한 시그널은 어
느 시점이 발생하였는지 정확히 알 수 없어 예상치 못한 결과나 에러를 발생한다. 이때 Trap을 사용하여 미리 정의된 작업을 할 수 있
도록 한다….. 어떻게?
* Carry vs OverFlow ??
12. Chapter 1. UNIX V6의 전체 큰 그림
1.4.3 범용레지스터
- 8개의 범용 레지스터, r0 ~ r7
- r6레지스터(SP)는 사용자모드, 커널모드로 구분
- PSW 레지스터의 현재모드(15-14)값이 변하면 r6(SP)도 하드웨어에 의해 자동으로 보드가 바뀜
1.4.4 MMU
- Memory Management Unit
- 어드레스 변환과 접근 권한을 관리
- PDP-11/40은 메모리를 8KByte의 세그먼트나 페이지 단위로 관리
- 권한없는 메모리 영역에 접근하면 MMU에서 트랩 발생
- MMU는 APR레지스터를 사용해 각 세그먼트 설정 및 가상 어드레스를 물리어드레스로 변환
- MMU에는 SR0, SR2라는 2개의 상태 레지스터가 있음
- ….
Bit 의미
r0, r1 계산용, 함수의 리턴값
r2, r3, r4 로컬처리
r5 프레임포인터, 환경포인터
r6(SP) 스택포인터
r7(pc) 프로그램 카운터
13. Chapter 1. UNIX V6의 전체 큰 그림
1.4.4 MMU
- …
- MMU에는 SR0, SR2라는 2개의 상태 레지스터가 있음
SR0, 메모리 관리 유효화 플래그와 에러정보에 사용, 에러발생에도 사용(SR0[15~13])
SR2 , 실행할 명령어의16비트 가상 어드레스
Bit 의미
15 설정에 맞지 않는 페이지를 접글하려 했을때 1
14 PDR이 표시하는 페이지 길이보다 바깥 영역을 액세스 했을때 1
13 읽기 전용 영역에 값을 쓰려 했을때, 1
8 유지보수모드
6-5 에러를 발생시킨 프로세스 모드(커널:00, 사용자:11)
3-1 페이지 번호, 에러번호를 발생시킨 페이지를 참조하려는 경우 등에 사용
0 1이 되면 MMU에서 메모리 관리를 활성화
Bit 의미
15-0 실행할 명령어의 가상 어드레스를 나타냄
명령어를 가져오는데 실패하면 값이 갱신되지 않음
SR0[15-13]에 어떤 값이라도 1이면, 값이 갱신되어 원래 값을 잃어버리게 됨
14. Chapter 1. UNIX V6의 전체 큰 그림
1.4.5 메모리
- PDP-11/40은 자기코어 메모리를 사용
- 8bit(1byte) 단위로 어드레스를 붙임.
- 메모리는 18bit의 어드레스 단위를 가짐
- 용량은 2^18 = 256KByte
- 상위 8KByte는 주변 장치를 위한 레지스터 매핑에 사용
- 프로세서는 메모리에 저장된 명령어와 데이터를 처리
1.4.6 블록 디바이스
- 대량의 데이터를 다루는 장치
- 일부를 swap영역으로 사용
- 스와핑 : 한정된 메모리 용량을 많은 프로그램이 사용하기 위해 커널이 데이터를 메모리에서 스와프 영역으로 밀어
놓거나, 데이터를 스와프 영역에서 메모리를 복구
1.4.7 라인 프린터
- 종이에 문자를 출력하는 장치
1.4.8 터미널
- 시스템과 사용자를 연결하는 장치. 대화형
15. Chapter 1. UNIX V6의 전체 큰 그림
1.5 소스코드
- UNIX V6는 현재 BSD 라이선스
- 인터넷에서 구할 수 있음
1.6 매뉴얼
- UNIX V6는 UNIX Programmer’s Manual(UPM)이라는 사용자 매뉴얼이 있음
- 9개의 장으로 구성
- 커널의 이해에는 2장, 4장이 중요
- 실행 프로그램의 파일(a.out) 포맷을 알기위해 5장도 중요
- 사용자 영역의 시스템 프로그램을 한다면 1,3,5,8장이 중요
16. Chapter 2. 프로세스
2.1 프로세스의 요소
2.1.1 프로세스란?
- 어떤 프로그램이 실행되면 커널이 실행한 프로그램을 프로세스라고 함
- 커널이 관리
1) 프로그램 실행
2) 파일시스템에 파일형태로 메모리로 로드
3) 물리메모리 가상메모리공간에서 실행
4) MMU에서 가상어드레스가 물리어드레스로 변환
# 프로세스 ID
- 고유의 프로세스 ID를 가짐
- 각 프로세스는 독립적인 가상어드레스 공간을 할당받음
17. Chapter 2. 프로세스
2.1.2 프로세스 병렬처리
: UNIX V6는 멀티유저 모드를 지원
# TSS, Time Sharing System
- 물리CPU는 1개.. 즉, 여러개의 프로세스를 실행하는 실제 프로세스는 단 하나
다른 여러 프로세스는 대기
- 물리 CPU는 한 개의 프로세스만 실행
- 짧은 시간단위로 실행할 프로세스를 바꾸어 처리하여, 여러개의 프로그램이 동시에 처리되는 것처럼 보이게 함
시간
프로세스 1 프로세스 2 프로세스 3
실행 프로세스
18. Chapter 2. 프로세스
2.1.3 프로세스 상태
- 커널은 실행 가능한 상태에 있는 프로세스 중 한 개를 실행 프로세스로 선택
2.1.4 사용자 모드와 커널 모드
# 프로세서 모드
- 모드가 바뀌면, MMU에서 가상 어드레스에 대응하는 메모리 공간도 바꿈
- PSW(Process Status Word)를 사용하여 바꿈
상태 의미
실행가능상태 실행 프로세스와 실행 가능한 상태로 대기하는 프로세스
슬립상태 - CPU자원이 해제되기 전까지 기다림
- 주변 장치에서 처리가 끝나기를 기다림
- 처리를 계속 진행하지 않는 프로세스
모드 가상 어드레스 공간, 프로세스
사용자모드 사용자 공간, 사용자 프로세스
커널모드 커널 공간, 커널 프로세스
19. Chapter 2. 프로세스
# 시스템 콜
- 커널 기능을 사용하기 위해선 시스템 콜을 호출하여 원하는 커널 기능을 실행 할 것을 요청
- 시스템 콜 호출 시, 커널모드로 전환
- 커널 처리 종료 후, 사용자 모드로 전환
- 사용자 공간 커널 공간
: fubyte(), fuibyte(), fuword(), fuiword(), subyte(), suibyte(), suword(), suiword() 함수 사용
(u :user, s :store, f: fatch, i :interupt)
# 커널 모드
- 시스템 자원을 직접관리
- 커널 기능을 사용하려면 커널에 정식 수단으로 요청해야함
사용자 모드 커널 모드
커널 기능 사용요구
커널 모드로 바뀜
사용자 모드로 되돌아감
20. Chapter 2. 프로세스
2.1.5 스와핑
- 스와핑은 시스템이 부팅할 때 생성된 프로세스가 처리
2.2 Proc 구조체와 User 구조체
- 각 프로세스 상태정보와 제어정보를 한 쌍의 Proc 구조체와 User 구조체로 관리
- 프로세스 당 각각 한 개씩 할당
- Proc 구조체 : 메모리에 항상 로드되어있음
- User 구조체 : 스와프 아웃 대상이 됨
종류 의미
Swap out 프로세스가 늘어나 메모리가 부족해지면,
커널은 슬립 상태에 있는 프로세스나 우선순위가 낮은 프로세스를 메모리에서 스와핑 역역으로
이동
Swap in 스와프아웃된 프로세스 중, 실행 상태로 된 프로세스를 다시 스와핑 역역에서 메모리오 이동
21. Chapter 2. 프로세스
2.2.1 Proc 구조체
- proc[]
- 각 엔트리는 한 개의 프로세스에 대응
- 프로세스에 관련된 정보 중, 프로세스 상태나 실행 우선순위등의 정보를 포함 커널에서 항상 필요한 정보(메모리
에 항상 상주)
- proc[]의 엔트리 수 : #define NOROC 50, 시스템은 proc[]의 엔트리 수보다 더 많은 프로세스를 가지지 못함
표, proc 구조체
- Proc[]는 배열로써 정적할당(50개의 엔트리)되어있고,
swap-out되면 p_stat의 상태를 바꾸고, 새로운 프로세스가 swap-in되면 새로 써줌
요소 의미
p_stat 상태, NULL인 경우 해당하는 PROC[]를 비었다고 파난
p_flag 플래그
p_pri 우선순위, 값이 작을수록 높음
p_sig 수신된 시그널
p_uid 사용자 ID
p_time 메모리나 스와프 영역에 머무린 시간
p_cpu CPU 누적시간(tick)
p_nice 실행 우선순위를 낮추기ㅏ 위한 보정 값, 초기값은 0으로 nice 시스템 콜로 사용자가 값을 설정
p_ttyp 프로세스를 실행한 터미널
…
22. Chapter 2. 프로세스
표, 프로세스 상태
표, 플래그
상태 의미
SSLEEP 슬립, 실행 우선순위가 음수값으로 슬립상태
SWAIT 슬립, 실행 우선순위가 0이상으로 슬립상태
SRUN 실행가능 상태
SIDL 프로세스 생성 중
SZOMB 좀비 상태
SSTOP 트레이스 개입을 기다림
플래그 의미
SLOAD 메모리에 있음(스와프 아웃되지 않음)
SSYS 시스템 프로세스로, 스와프 대상이 아님. UNIX V6에서 procp[0]만 가능
SLOCK 스와프 아웃되는 것을 막음
SSWAP 스와프 아웃으로 user.u_rsav[]의 값이 부정됨
STRC 트레이스 중
SWTED 트레이스 처리에 사용
23. Chapter 2. 프로세스
2.2.2 user 구조체
- user[]
- 프로세스가 오픈한 파일이나 현재 디렉터리 정보등을 담고있음
- 실행 프로세스를 제외한 user 구조체에서는 커널에서 필요하지 않기 때문에,
프로세스가 스와프아웃되면 user 구조체도 함께 스와프 아웃
표, user 구조체
요소 의미
u_procp 이 user구조체에 대응된 proc[]엔트리를 가리킴
u_base 파일을 읽고 쓸 때 매개변수를 넘겨 줄 때 사용
u_count 파일을 읽고 쓸 때 매개변수를 넘겨 줄 때 사용
u_offset[] 파일을 읽고 쓸 때 매개변수를 넘겨 줄 때 사용
u_cdir 현재 디렉터리의 inode[] 엔트리
u_dirp 사용자 프로그램, 혹은 커널 프로그램에서 가리키는 파일의 경로를 읽을 때 사용
u_pdir namei()에 대상되는 파일, 데렉터리의 부모 디렉터리를 저장
u_ar0 시스템 콜 처리시 사용자 프로세스의 범용레지스터나 PSW 조작을 할 때 사용
…
24. Chapter 2. 프로세스
2.2.2 user 구조체
표, 에러코드 (u_error)
# 전역변수 u
- 커널은 전역변수 u를 사용하여 실행 프로세스의 user 구조체에 접근
- u를 사용해서 접근해야 하는 이유? (더 뒤에서 설명…)
u(conf/m40.s)
1 .globl _u
2 _u = 0140000
요소 의미
EFAULT 사용자 공간과 커널 공산 사이에 데이터 전송이 실패했을 때 등
EPERM 슈퍼 유저가 아님
ENOENT 지정돈 파일이 없음
ESRCH 시그널을 받는 프로세스가 없거나 이미 사라짐
EINTR 시스템 콜 처리 중에 시그널 처리를 했음
EIO I/O 에러
…
25. Chapter 2. 프로세스
2.3 프로세스의 메모리 할당
- 하나의 프로세스는 텍스트 세그먼트와 데이터 세그먼트라는 연속된 두 개의 물리 메모리 영역을 할당
- 물리 메모리 공간은 프로세스의 가상 어드레스로 변환
2.3.1 텍스트 세그먼트
- 프로그램의 실행코드
- 읽기전용
- 여러 프로세스가 공유 (하나의 프로그램을 동시에 여러개를 실행하는 경우)
- text[]로 관리, 텍스트 세그먼트의 크기는 uer.u_tsize
26. Chapter 2. 프로세스
2.3.2 데이터 세그먼트
- 프로그램이 사용하는 변수같은 데이터를 저장
- 여러 프로세스가 공유 할 수 없음, 공유된다면 다른 프로그램에 영향을 끼침
- 데이터 세그먼트의 물리 어드레스: proc.p_addr, 크기 : proc.p_size
- 데이터 세그먼트의 구조
요소 의미
PPDA Per Process Data Area
User구조체와 커널 스택영역으로 구성
크기 : USIZE x 64byte = 1KByte(사용자 공간에서는 사용할 수 없음)
커널스택영역 : 커널동작을 위한 작업영역으로 사용. 프로세스마다 커널모드용으로 작업영역을 설정
Data 영역 전역변수나 bss가은 정적 변수가 위치하는 영역과 프로세스가 동적 메모리 영역으로 관리하는 힙영역
으로 구성
힙 영역 확장 시 시스템 콜을 호출
힙 영역은 가상 어드레스의 작은 값에서 큰 값으로 확장
크기 : user.u_dsize
스택 영역 함수의 매개변수나 로컬 데이터등을 임시로 저장하는 영역
필요에따라 자동으로 확장
스택영역은 가상 어드레스의 최상위 어드레스에서 작은 값으로 확장
크기 : user.u_ssize
27. Chapter 2. 프로세스
# USIZE(param.h)
1 #define USIZE 16
그림. 데이터 세그먼트
user 구조체
커널 스택 영
역
데이터 영역
(힙)
PPDA
스택 영역
물리 메모리
USIZE
user_u.dsize
user_u.ssize
proc.p_size
proc.p_addr
28. Chapter 2. 프로세스
2.3.3 가상 어드레스 공간
프로세스는,
- 64KByte의 가상 어드레스 공간을 사용
- 16bit의 가상 어드레스 공간을 가짐
- 가상어드레스는 MMU에서 18bit 물리 어드레스로 바뀌어 물리 메모리에 접근
표, 가상 어드레스 공간과 물리 어드레스 공간
- 텍스트 세그먼트(process의 실행코드 저장)는 가상 어드레스 공간의 최하위 어드레스(0x0)를 할당받음
- 데이터 영역은 텍스트 세그먼트에서 8KByte 더한 어드레스를 할당
- 스택 영역은 최상위 어드레스 (0xffff)를 할당
공간 어드레스 용량
가상 어드레스 공
간
16비트 가상 어드레스 64 KByte
물리 어드레스 공
간
18비트 가상 어드레스 256 KByte
29. Chapter 2. 프로세스
2.3.3 가상 어드레스 공간
cf. 데이터영역이 고정사이즈인 이유.. 요즘은 작은 영역을 모아서 하나의 논리 메모리 영역으로 만들고, 다시 쪼개서 사
용할 수 있었지만 과거 UNIX V6에서는 해당 기술이 가능하지 않았다. 그냥 고정으로 할당받은 후 쪼개 쓰는 것까지만 가
능했다.
- 프로세스마다 독립된 가상 어드레스 공간을 사용
- 커널은 데이터영역과 스택영역으로 별도의 세그먼트로 나누어 APR을 설정(뒤에서 설명)
- 데이터영역: 데이터세그먼트, 스택영역: 스택세그먼트
# 가상메모리의 이점
- 프로그램을 임의의 어드레스부터 시작할 수 있음
- 메모리 접근을 관리할 수 있음
- 메모리 효율을 높일 수 있음
0xffff
가상 어드레스 공간
텍스트 세그먼
트
user_u.tsize
스택 영역
user_u.ssize
데이터 영역
user_u.dsize
0
“u” 변수가
시작부분을 가리킴
0 mod 8k
힙 확장영
역
스택 확장영
역
데이터 세그먼트
30. Chapter 2. 프로세스
2.3.3 가상 어드레스 공간
그림. 물리어드레스와 가상어드레스 공간
물리 어드레스 공간
텍스트 세그먼트
0x3fff
PPDA
데이터 영역
PPDA
데이터 영역
물리 어드레스
0
텍스트 세그먼트
데이터 영역
스택 영역
텍스트 세그먼트
데이터 영역
스택 영역
가상 어드레스
0
0xffff
프로세스 B의
가상 어드레스 공간
프로세스 A의
가상 어드레스 공간
가상 어드레스
0
0xffff
31. Chapter 2. 프로세스
2.3.4 어드레스 변환
- MMU : 가상 어드레스를 물리 어드레스로 변환
- MMU는 변환을 위해 두 개의 레지스터를 가짐(PAR, PDR)
- PAR(Page Address Register) + PDR(Page Description Register) = APR(Active Page Register)
- 각 사용자 프로세스마다 APR값을 user구조체에 저장, 프로세스가 실행되면 user 구조체를 가지고 사용자 APR값
을 설정
물리어드레
스
PAR PDR
APR
User 구조체
MMU가상어드레
스
그림. 어드레스
변환
bit 의미
11~0 베이스 어드레스(64byte 단위)
bit 의미
14~8 페이지 블록 수
6 데이터 비트, 갱신됨을 나타냄
3 비트가 1이면, 큰 어드레스에서 작은
어드레스 방향으로 할당
2~1 접근제어
00 : 할당하지 않는다.
01: 읽기전용
11 : 쓰기가능
표. PAR
표. PDR
32. Chapter 2. 프로세스
# PDP-11/40
- 2개의 APR을 가짐: 커널모드용, 사용자 모드용
- PSW의 현재 모드가 바뀌면 APR이 하드위어적으로 바뀌면서(물리적인 정보들이 갱신됨을 의미하는 것 같음),
MMU가 가상 어드레스 공간을 변환
- APR은 0부터 7까지 총 8쌍이 있음.
- 실행 프로세스에 커널이 사용자 프로세스용의 APR을 설정하면, 각 사용자 프로세스는 독립된 가상 어드레스 공간
을 확보
- 각 사용자 프로세스의 APR 값은 user 구조체에 저장
- 각각의 프로세스가 실행 프로세스가 되면, 사용자 프로세스용으로 APR 값이 설정됨
PSW
15 14 13 0
커널(00) 사용자(11)
APR1
APR0
APR2
…
APR7
APR1
APR0
APR2
…
APR7
그림. APR의 전환
33. Chapter 2. 프로세스
- APR은 0부터 7까지 8쌍
- 프로세스의 가상 어드레스 공간을 페이지, 혹은 세그먼트 단위로 관리
- 한쌍의 APR은 한 페이지에 대응
- PAR은 각 페이지가 가리키는 물리 어드레스의 베이스 어드레스 저장
- PDR은 각 페이지의 블록(64byte 단위)수나 접근 여부 등의 정보 저장
- 한 페이지에 최대 128블록(8KByte)을 할당
페이지( or 세그먼트) : 프로세스의 가상 어드레스 공간
1개의 프로세스는 총 8쌍의 APR을 가질 수 있음(커널영역8개, 사용자영역8개)
PDR은 128개의 블록으로 쪼개어 관리 될 수 있다.
Q. 프로세스 하나당 한쌍의 APR을 가지면, 최대 8개의 프로세스만 메모리가상화기법을 사용하는 건가? 앞에서는 각 프
로세스마다 APR을 user 구조체에 넣는다고 했고, user구조체는 proc구조체에 매핑되고, 즉 최대 50개의 프로세스가 돌
아 갈 수 있는데… 무슨 말인지 잘 이해가 안감
34. Chapter 2. 프로세스
그림. 물리 어드레스 계산
u (0140000(8))
1100 0000 0000 0000(2)
- 가상 어드레스의 상위 3비트 [15~13]로 페이지(APR)가 선택되면,
- 선택된 APR의 PAR(11~0]비트는 물리 어드레스의 베이스 블록 어드레스(베이스 블록 No.)값이 결정
- 물리 어드레스의 베이스 블록 어드레스값과 가상어드레스의 [12~6]비트(가상 어드레스의 블록 No.)를 더해서 물리
메모리의 블록 어드레스(물리블록 No.) [17~6]비트를 구함
0
베이스 블록 No.
12 1115
블록No. 블록 내에 오프셋
15 13 12 6 5 0
PAR[0]~[7]
가상 어드레스
블록 내에 오프셋물리 블록 No.
17 6 5 0
물리 어드레스
ADD
: 110(2)6(10), 즉 PAR[6] : 00 0000: 0 0000 00
가상어드레스의 [12~6]
PAR[11~0]
: 물리 어드레스의 베이스
블록 어드레스 값
: 물리 메모리의
블록 어드레스[17~6]
물리메모리의 블록 어드레스
[17~6]비트와 가상어드레스 블록
내의 오프셋값[5~0]비트를 더하여
물리 어드레스 [17~0]비트를 구함
35. Chapter 2. 프로세스
그림. u에서 user 구조체 액세스
- 커널이 전역변수 u(0140000)을 사용하여 실행 프로세스의 user 구조체에 접근 가능
- 커널 모드용으로 실행 프로세스의 6번째 PAR을 데이터 세그먼트의 물리 어드레스(proc.p_addr)로 설정
- 커널 모드용 APR : 커널 APR
- 사용자 모드용 APR : 사용자 APR
- 0~n번째 까지의 APR : APRn
- 메모리 블록은 블록 디바이스의 블록(512byte)과 혼동되므로, 이 책에선 메모리 블록을 “64바이트 단위의 영역” 이
라 함
커널 APR
APR1
APR0
APR2
APR3
APR7
APR4
APR5
APR6
User 구조체
커널스택
물리메모리
실행 프로세스의
데이터 세그먼트
0x00000
0x3FFFF
물리 어드레스
proc.p_addr (각 프로세
스마다의 addr)
1100 0000 0000 0000
: u는 커널공간의
6페이지째 처음
을 가리킴