diff --git a/PROJECT1 : THREADS/1. Intoduction.md b/PROJECT1 : THREADS/1. Intoduction.md index 823ecee685760158e2a7d99297099c05bc6cf815..8e3f8d83f3f31013d028a08ce5c9eb43b54de6c1 100644 --- a/PROJECT1 : THREADS/1. Intoduction.md +++ b/PROJECT1 : THREADS/1. Intoduction.md @@ -27,113 +27,148 @@ Warning: Pintos에서는 각 스레드에 4kB 미만의 작은, 고정된 실행 ### threads 코드 •`loader.S`, `loader.h` + 커널 로더. 512바이트의 코드와 데이터로 구성되어 PC BIOS가 이를 메모리에 로드하고, 이후 디스크에서 커널을 찾아 메모리에 로드한 후 `start.S`의 `bootstrap()`으로 점프합니다. 이 코드를 수정하거나 살펴볼 필요는 없습니다. `start.S`는 메모리 보호 설정과 64비트 긴 모드 전환을 위한 기본 설정 코드입니다. loader와 달리 이 코드는 실제로 커널의 일부입니다. -•kernel.lds.S +•`kernel.lds.S` + 커널을 링크하는 데 사용되는 링크 스크립트입니다. 커널의 로드 주소를 설정하고, `start.S`가 커널 이미지의 시작 부분 근처에 배치합니다. 이 코드를 수정하거나 살펴볼 필요는 없지만, 혹시 관심이 있다면 참고할 수 있도록 여기에 포함되어 있습니다. -•init.c, init.h +•`init.c`, `init.h` + 커널 초기화 코드로, 커널의 `메인 프로그램`인 `main()`을 포함합니다. 적어도 `main()`을 살펴보아 어떤 초기화가 이루어지는지 확인하십시오. 필요하다면 여기에 여러분만의 초기화 코드를 추가할 수도 있습니다. -•thread.c, thread.h +•`thread.c`, `thread.h` + 기본적인 스레드 지원을 제공합니다. 여러분의 작업 대부분은 이 파일에서 이루어질 것입니다. `thread.h`는 구조체 스레드를 정의하며, 이는 네 가지 프로젝트 모두에서 수정하게 될 가능성이 높습니다. 자세한 내용은 `Threads` 섹션을 참고하십시오. -•palloc.c, palloc.h +•`palloc.c`, `palloc.h` + 페이지 할당기로, 4 kB 페이지 단위로 시스템 메모리를 할당합니다. 자세한 내용은 `Page Allocator`를 참고하십시오. -•malloc.c, malloc.h +•`malloc.c`, `malloc.h` + 커널용 `malloc()`과 `free()`의 간단한 구현입니다. 자세한 내용은 `Block Allocator`를 참고하십시오. -•interrupt.c, interrupt.h +•`interrupt.c`, `interrupt.h` + 기본적인 인터럽트 처리 및 인터럽트를 켜고 끄는 함수들을 제공합니다. -•intr-stubs.S, intr-stubs.h +•`intr-stubs.S`, `intr-stubs.h` + 낮은 레벨 인터럽트 처리를 위한 어셈블리 코드입니다. -•synch.c, synch.h +•`synch.c`, `synch.h` + 기본 동기화 도구: 세마포어(semaphores), 락(locks), 조건 변수(condition variables), 최적화 배리어(optimization barriers). 이들은 네 가지 프로젝트 모두에서 동기화를 위해 사용해야 합니다. 자세한 내용은 `Synchronization`을 참고하십시오. -•mmu.c, mmu.h +•`mmu.c`, `mmu.h` + x86-64 페이지 테이블 작업을 위한 함수입니다. lab1 이후에 이 파일을 자세히 살펴보게 될 것입니다. -•io.h +•`io.h` + I/O 포트 접근을 위한 함수들입니다. 주로 `devices` 디렉토리의 소스 코드에서 사용되며, 여러분은 이 코드를 수정할 필요가 없습니다. -•vaddr.h, pte.h +•`vaddr.h`, `pte.h` + 가상 주소 및 페이지 테이블 항목을 다루기 위한 함수와 매크로입니다. 프로젝트 3에서 더 중요해질 내용이므로, 지금은 신경쓰지 않아도 괜찮습니다. -•flags.h +•`flags.h` + x86-64 `flags` 레지스터의 몇 가지 비트를 정의하는 매크로입니다. 거의 신경쓰지 않아도 됩니다. + ### devices 코드 기본 스레드 기반 커널에는 `devices` 디렉토리에 다음 파일들도 포함됩니다: -•timer.c, timer.h +•`timer.c`, `timer.h` + 시스템 타이머로, 기본적으로 초당 100번 ticks을 생성합니다. 이 프로젝트에서 이 코드를 수정해야 합니다. -•vga.c, vga.h +•`vga.c`, `vga.h` + VGA 디스플레이 드라이버. 화면에 텍스트를 출력하는 역할을 합니다. 이 코드를 직접 볼 필요는 없습니다. `printf()` 함수가 VGA 디스플레이 드라이버를 호출하므로, 이 코드를 직접 호출할 이유는 거의 없습니다. -•serial.c, serial.h +•`serial.c`, `serial.h` + 직렬 포트 드라이버. printf()가 이 코드를 대신 호출하므로, 직접 호출할 필요는 없습니다. 이 코드는 직렬 입력을 처리하며, 이를 입력 계층(아래 참조)에 전달합니다. -•block.c, block.h +•`block.c`, `block.h` + 블록 디바이스를 위한 추상화 계층으로, 고정 크기 블록 배열로 구성된 랜덤 액세스 디스크 유사 장치입니다. Pintos는 기본적으로 두 가지 유형의 블록 디바이스: IDE 디스크와 파티션을 지원합니다. 블록 디바이스는 프로젝트 2까지는 실제로 사용되지 않습니다. -•ide.c, ide.h +•`ide.c`, `ide.h` + 최대 4개의 IDE 디스크에서 섹터를 읽고 쓰는 것을 지원합니다. -•partition.c, partition.h +•`partition.c`, `partition.h` + 디스크의 파티션 구조를 이해하여 하나의 디스크를 여러 독립적인 영역(파티션)으로 나눌 수 있도록 합니다. -•kbd.c, kbd.h +•`kbd.c`, `kbd.h` + 키보드 드라이버. 키 입력을 처리하고 이를 입력 계층(아래 참조)으로 전달합니다. -•input.c, input.h +•`input.c`, `input.h` + 입력 계층. 키보드나 직렬 드라이버에서 전달된 입력 문자를 큐에 저장합니다. -•intq.c, intq.h +•`intq.c`, `intq.h` + 인터럽트 큐로, 커널 스레드와 인터럽트 핸들러가 모두 접근하고자 하는 순환 큐를 관리합니다. 키보드와 직렬 드라이버에서 사용됩니다. -•rtc.c, rtc.h +•`rtc.c`, `rtc.h` + 실시간 시계 드라이버로, 커널이 현재 날짜와 시간을 확인할 수 있도록 합니다. 기본적으로, 이는 thread/init.c에서 난수 생성기의 초기 시드를 선택하기 위해 사용됩니다. -•speaker.c, speaker.h +•`speaker.c`, `speaker.h` + PC 스피커에서 톤을 생성할 수 있는 드라이버입니다. -•pit.c, pit.h +•`pit.c`, `pit.h` + 8254 프로그래밍 가능 인터럽트 타이머(PIT)를 구성하는 코드입니다. 이 코드는 각 디바이스가 PIT의 출력 채널 중 하나를 사용하기 때문에 `devices/timer.c`와 `devices/speaker.c` 모두에서 사용됩니다. ### lib 코드 마지막으로 `lib`와 `lib/kernel`에는 유용한 라이브러리 루틴이 들어 있습니다. (`lib/user`는 프로젝트 2부터 사용자 프로그램에서 사용되지만 커널의 일부는 아닙니다.) 다음은 몇 가지 자세한 내용 입니다: -•ctype.h, inttypes.h, limits.h, stdarg.h, stdbool.h, stddef.h, stdint.h, stdio.c, stdio.h, stdlib.c, stdlib.h, string.c, string.h +•`ctype.h`, `inttypes.h`, `limits.h`, `stdarg.h`, `stdbool.h`, `stddef.h`, `stdint.h`, `stdio.c`, `stdio.h`, `stdlib.c`, `stdlib.h`, `string.c`, `string.h` + 표준 C 라이브러리의 하위 집합입니다. -•debug.c, debug.h +•`debug.c`, `debug.h` + 디버깅을 돕는 함수와 매크로입니다. 자세한 내용은 `Debugging Tools`을을 참조하세요. -•random.c, random.h +•`random.c`, `random.h` + 의사난수 생성기(pseudorandom number generator, PRNG)입니다. 실제 난수 값의 시퀀스는 Pintos 실행마다 다르지 않습니다. -•round.h +•`round.h` + 반올림을 위한 매크로입니다. -•syscall-nr.h +•`syscall-nr.h` + 시스템 호출 번호입니다. 프로젝트 2까지는 사용되지 않습니다. -•kernel/list.c, kernel/list.h +•`kernel/list.c`, `kernel/list.h` + 이중 연결 리스트 구현입니다. Pintos 코드 전반에 사용되며, 프로젝트 1에서 직접 사용하게 될 것입니다. 시작하기 전에 이 코드를 훑어보는 것이 좋습니다(특히 헤더 파일의 주석). -•kernel/bitmap.c, kernel/bitmap.h +•`kernel/bitmap.c`, `kernel/bitmap.h` + 비트맵 구현. 원한다면 코드에서 사용할 수 있지만, 프로젝트 1에서는 필요하지 않을 것입니다. -•kernel/hash.c, kernel/hash.h -해시 테이블 구현. 프로젝트 3에 유용할 것 같습니다. +•`kernel/hash.c`, `kernel/hash.h` + +해시 테이블 구현. 프로젝트 3에서서 유용할 것 같습니다. + +•`kernel/console.c`, `kernel/console.h`, `kernel/stdio.h` -•kernel/console.c, kernel/console.h, kernel/stdio.h `printf()` 및 몇 가지 다른 함수를 구현합니다. ## 동기화