main( ) 함수 분석
과제의 정확성을 위해 설치해준 버전이 아닌 과제에 첨부된 4.0수정 버전의 코드를 기준으로 작성함
Q1. ThreadedKernel, UserProgKernel 두 class는 어떤 관련이 있는가? (코드 분석 설명)
일단 ThreadedKernel CLASS를 찾기 위해 검색 해주었다.
검색은 grep 명령어와 리눅스 와일드카드를 이용해 nachos-4.0의 하위디렉토리 전부에서 모든 파일을 대상으로 검색해주었다.
threads/ 디렉토리의 kernel.cc, main.h, kernel.h 와 /userporg/ 디렉토리의 userkernel.cc, userkernel.h 파일에서 해당 클래스가 검색된다.
두 클래스 모두 검색되는 파일을 기준으로 하면 main.h, userkernel.cc, userkernel.h 파일로 추려진다.
C++ 문법을 생각해 class가 정의된 부분으로 다시 검색해보았다.
ThreadedKernel 클래스의 정의는 ./threads/kernel.h에서 UserProgKernel 클래스는 ./userpog/userkernel.h에서 정의되었음을 알 수 있다.
UserProgKernel의 class 정의를 보면 public Threadedkernel으로 Threadedkerne을 상속받는 것을 19번 라인을 통하여 알 수 있다.
즉 class UserProgKernel : public ThreadedKernel 을 보아 UserProgKernel가 Threadedkernel를 상속 받는 부모-자식 관계임을 알 수 있다.
(=UserProgKernel이 자식 , Threadedkernel이 부모이다.)
Q2. thread/nachos, userprog/nachos 두 실행 파일을 실행할 때의 main 함수가 수행하는 작업의 차이점은 무엇인가? (main.h, main.cc)
main.h의 내용을 보면 위와 같다 18번째 라인 까지는 thread/nachos, userprog/nachos이 동일하게 작동하기 때문에 생략하겠다.
19번째 라인부터 보면 ifdef를 통하여 USER_PROGRAM이 정의되어 있다면
20번째 라인을 통하여 userkernel.h를 include하고
21번째 라인을 통하여 KernelType을 UserProgKernel로 매크로 지정한다.
만약 그렇지 않다면 23~24를 통하여 kernel.h를 include하고 KernelType을 ThreadedKernel로 매크로 지정한다.
다시 말하자면 userprog/nachos에서는 19~21번 라인을 통하여 KernelType이 UserProgKernel이되어
class UserProgKernel의 함수들이 동작하게 되고
thread/nachos에서는 19~21번 라인을 통하여 KernelType이 Threadedkernel이되어
class Threadedkernel의 함수들이 동작하게 된다
위 사진은 main.cc의 주석부분을 제거한 코드의 캡쳐 사진이다.
5번 라인에서 위에서 본 main.h를 include함을 알 수 있다.
다시 말하자면 userprog/nachos에서 KernelType이 UserProgKernel이되어있고 class UserProgKernel의 함수들이 동작하게 되고
thread/nachos에서는 KernelType이 Threadedkernel이되어 class Threadedkernel의 함수들이 동작하게 된다
위와 마찬가지로 36 번째 라인까지는 공통적으로 동작하므로 설명을 생략하겠다.
37~43번째 라인까지가 두 실행 파일에서 다르게 동작하는 부분임을 코드를 통하여 알 수 있다.
37번째 라인을 보면 new KernelType(argc, argv)를 통하여 각각의 클래스 Threadedkernel,UserProgKernel을
실행하는 프로그램에 맞추어 생성한다.
그리고 38에서 43번째 까지 각각의 클래스에 정의된 함수인 Initiallize(),SelfTest(),Run()을 순차적으로 실행함을 알 수 있다.
Q3. 위의 두 실행 파일에서 사용할 수 있는 option들에는 어떠한 것들이 있는가?
// main.cc
// Driver code to initialize, selftest, and run the
// operating system kernel.
//
// Usage: nachos -u -z -d <debugflags> ...
// -u prints entire set of legal flags
// -z prints copyright string
// -d causes certain debugging messages to be printed (cf. debug.h)
//
// NOTE: Other flags are defined for each assignment, and
// incorrect flag usage is not caught.
//
// Copyright (c) 1992-1996 The Regents of the University of California.
// All rights reserved. See copyright.h for copyright notice and limitation
// of liability and disclaimer of warranty provisions.
main.cc의 상단부 주석을 보면 위와 같이 되어있다. 이를 통하여 -u, -z -d 옵션이 존재함을 알 수 있다.
-u: Legal flags의 전체 셋을 출력한다. (정의된 플래그들의 전체를 보여준다 = )
-z: 저작권 문구를 출력한다.
-d: 디버깅 메세지를 출력한다.
// If the flag is "+", we enable all DEBUG messages.
// Debug::Debug
// Initialize so that only DEBUG messages with a flag in flagList
// will be printed.
//
// If the flag is "+", we enable all DEBUG messages.
//
// "flagList" is a string of characters for whose DEBUG messages are
// to be enabled.
debug.cc의 일부를 발췌해 왔다.
디버그 모드에서는 위의 "+": 가능한 모든 디버그 메세지 와 같이 추가 옵션들이 있음을 알 수 있었다.
+ | 가능한 모든 디버깅 메세지 |
t | Thread(스레드) |
s | Semaphore |
i | Interrupt(인터럽트) |
m | machine(머신) |
d | disk(디스크) |
f | Filesys(파일시스템) |
a | address |
n | Network(네트워크) |
와 같이 추가옵션을 찾을 수 있었다.
'컴퓨터 > OS' 카테고리의 다른 글
[Mac] 터미널에 표시되는 컴퓨터명 바꾸기 (0) | 2022.07.13 |
---|---|
[Linux] 기초 명령어 + 기타등등 정리 (0) | 2021.12.28 |
[OS] NachOS 설치 (binutils&gcc 구버전 설치법 및 NachOS 컴파일) (3) | 2021.04.09 |
[MAC] VIM 하이라이팅 기능 & Vundle 플러그인 설정 과 rust 플러그인 (0) | 2021.01.28 |
[MAC] Rust & ARM 크로스컴파일 툴체인 설치 (0) | 2021.01.10 |