핀토스의 시작점은 pintos/threads/init.c 에 있다
여기에 int main(void)가 있고, 온갖 초기화와 실행 함수가 들어있다.
/* Pintos main program. */
int
main (void) {
uint64_t mem_end;
char **argv;
/* Clear BSS and get machine's RAM size. */
bss_init ();
/* Break command line into arguments and parse options. */
argv = read_command_line ();
argv = parse_options (argv);
/* Initialize ourselves as a thread so we can use locks,
then enable console locking. */
thread_init ();
console_init ();
/* Initialize memory system. */
mem_end = palloc_init ();
malloc_init ();
paging_init (mem_end);
#ifdef USERPROG
tss_init ();
gdt_init ();
#endif
/* Initialize interrupt handlers. */
intr_init ();
timer_init ();
kbd_init ();
input_init ();
#ifdef USERPROG
exception_init ();
syscall_init ();
#endif
/* Start thread scheduler and enable interrupts. */
thread_start ();
serial_init_queue ();
timer_calibrate ();
#ifdef FILESYS
/* Initialize file system. */
disk_init ();
filesys_init (format_filesys);
#endif
#ifdef VM
vm_init ();
#endif
printf ("Boot complete.\n");
/* Run actions specified on kernel command line. */
run_actions (argv);
/* Finish up. */
if (power_off_when_done)
power_off ();
thread_exit ();
}
다음은 gpt의 설명.
위 코드는 Pintos 운영 시스템의 주요 부트스트래핑 (초기화 및 설정) 과정을 나타냅니다. 각 함수는 시스템 부팅 과정에서 다양한 하드웨어 및 소프트웨어 컴포넌트의 초기화를 담당합니다. 아래에서 각 함수의 역할을 자세히 설명하겠습니다:
1. bss_init()
- 목적: 초기화되지 않은 전역 및 정적 변수를 0으로 설정합니다. 이는 데이터 세그먼트의 BSS 부분을 초기화하는 것으로, 프로그램의 안정성과 예측 가능성을 높입니다.
- BSS: Block Started by Symbol
- BSS 세그먼트는 프로그램의 데이터 영역 중 하나로, 초기화되지 않은 전역 변수와 정적 변수를 저장하는 데 사용됩니다. 이러한 변수들은 프로그램 시작 시 자동으로 0으로 초기화됩니다.
2. read_command_line() & parse_options(argv)
- 목적: 부팅 시 전달된 커맨드 라인 인자를 파싱합니다. read_command_line()은 커맨드 라인을 읽어 배열로 반환하고, parse_options()은 이 배열을 분석하여 옵션을 처리합니다.
3. thread_init() & console_init()
- 목적: 스레딩 시스템과 콘솔 I/O 시스템을 초기화합니다. thread_init()은 스레드 관리를 위한 기반을 마련하고, console_init()은 콘솔 잠금을 활성화하며 콘솔 I/O 작업을 준비합니다.
- 콘솔 잠금을 활성화한다는 것은 멀티스레딩 환경에서 콘솔 입출력 작업을 동기화하기 위해 잠금 메커니즘을 사용하도록 설정하는 것을 말합니다. 이를 통해 다양한 스레드가 동시에 콘솔 자원을 사용할 때 발생할 수 있는 충돌이나 데이터의 손상을 방지할 수 있습니다.
- 콘솔 잠금을 활성화함으로써 콘솔 접근을 동기화하고, 스레드 간의 충돌을 방지하여 안정적인 시스템 운영을 돕습니다. 이는 특히 디버깅이나 시스템의 상태를 보여주는 로그 출력 시에 매우 중요한 역할을 합니다.
4. palloc_init() & malloc_init() & paging_init(mem_end)
- 목적: 메모리 관리 시스템을 초기화합니다. palloc_init()은 물리 메모리 할당자를 초기화하고, malloc_init()은 힙 메모리를 위한 동적 할당자를 설정합니다. paging_init()은 페이징 메커니즘을 활성화하여 가상 메모리 관리를 시작합니다.
5. tss_init() & gdt_init()
- 목적: 유저 프로그램(User Program)을 지원하기 위해 태스크 상태 세그먼트(TSS)와 전역 디스크립터 테이블(GDT)을 초기화합니다. 이들은 프로그램의 컨텍스트 전환 및 보안 기능을 관리하는 데 중요합니다.
6. intr_init() & timer_init() & kbd_init() & input_init()
- 목적: 인터럽트 핸들러 및 기본 입력 장치를 초기화합니다. intr_init()은 인터럽트 서비스 루틴을 설정하고, timer_init()은 시스템 타이머를, kbd_init()은 키보드 드라이버를, input_init()은 기타 입력 관련 설정을 초기화합니다.
7. exception_init() & syscall_init()
- 목적: 예외 처리 및 시스템 호출 인터페이스를 초기화합니다. 이를 통해 운영체제가 예외 상황을 적절히 처리하고, 사용자 프로그램이 커널 기능을 안전하게 요청할 수 있도록 합니다.
8. thread_start() & serial_init_queue() & timer_calibrate()
- 목적: 스레드 스케줄러를 시작하고, 직렬 포트 큐를 초기화하며, 타이머를 보정합니다. 이 과정은 시스템의 다양한 부분이 정확히 동기화되고 효율적으로 작동할 수 있도록 보장합니다.
9. disk_init() & filesys_init(format_filesys)
- 목적: 디스크 드라이버를 초기화하고 파일 시스템을 설정합니다.
10. run_actions(argv)
- 목적: 이 함수는 커널 커맨드 라인에서 지정된 동작을 실행합니다. argv는 파싱된 커맨드 라인 인자 배열이며, 이 배열을 사용하여 사용자 또는 시스템 관리자가 지정한 특정 작업을 수행합니다. 이는 시스템 테스트, 특정 프로세스 실행, 또는 다양한 구성 옵션을 동적으로 처리할 수 있도록 설계되어 있습니다.
11. power_off()
- 목적: Pintos 시스템의 전원을 안전하게 꺼는 함수입니다. 이 함수는 모든 중요한 시스템 리소스가 올바르게 종료되고, 데이터가 저장된 후에 시스템 전원을 차단합니다. power_off_when_done 변수가 참인 경우에만 호출되며, 이는 시스템이 모든 작업을 완료한 후 자동으로 종료되어야 할 때 사용됩니다.
12. thread_exit()
- 목적: 현재 실행 중인 스레드를 종료하고, 스레드의 종료 상태를 시스템에 반환합니다. 이 함수는 특히 스레드가 할당된 모든 작업을 완료하고 더 이상 수행할 작업이 없을 때 호출됩니다. thread_exit()는 스레드의 수명주기를 관리하는데 중요한 역할을 하며, 스레드가 시스템 자원을 안전하게 해제하고, 스레드 종료 시 필요한 청소 작업을 수행할 수 있도록 합니다.
'크래프톤 정글 일지' 카테고리의 다른 글
보이어-무어 알고리즘 (0) | 2024.05.14 |
---|---|
[PintOS] Priority Scheduling (0) | 2024.05.13 |
[PintOS] Project 1 - Threads - Alarm clock (0) | 2024.05.11 |
[PintOS] 카이스트 전산학과 권영진 교수님 OS 특강 (0) | 2024.05.11 |
크래프톤 정글 PINTOS Project 0: PintOS 키워드 정리 (0) | 2024.05.11 |