0. NachOS란?
"Not Another Completely Heuristic Operating System"의 약자로, 운영 체제의 원리와 동작을 이해하고 실제로 구현해 볼 수 있도록 하는 데에 사용됨.
1. Visual Box → 가상 환경 세팅
https://www.virtualbox.org/wiki/Downloads
가상 머신이란?
실행 중인 애플리케이션과 운영체제를 포함하여 컴퓨터와 거의 동일한 모든 기능을 수행할 수 있는 컴퓨터의 가상화된 인스턴스이다. 물리적 머신에서 실행되며 하이퍼바이저라고 불리는 소프트웨어에서 컴퓨팅 리소스에 액세스한다.
가상 머신 소프트웨어는 프로그램 및 운영체제를 실행하고, 데이터를 저장하고, 네트워크에 연결하고 기타 컴퓨팅 기능을 수행할 수 있다.
2. Ubuntu 22 다운로드
https://releases.ubuntu.com/22.04/
3. 가상 환경에서 우분투 실행
일반 사용자가 루트(관리자) 권한으로 로그인하기
일반 사용자 권한으로 실행되지 않는 명령어들은 루트 권한으로 로그인해서 사용할 수 있다.
su root
루트 계정의 초기 비밀번호 설정하기
우분투를 처음에 설치하고 나면 루트 계정으로 처음부터 로그인이 불가능하다. 처음에 만든 계정으로 들어가 비밀번호를 설정할 수 있다.
sudo passwd root
4. NachOS 실행
1) root 계정으로 로그인
sudo su
2) C, C++ 컴파일러와 라이브러리 등 설치
sudo apt-get install build-essential
sudo apt-get update
sudo apt-get upgrade #현재 설치된 우분투의 소프트웨어 패키지를 최신 버전으로 업그레이드
3) 32-bit kernel 환경 세팅 및 gcc, g++ 컴파일러 설치
32 bit 환경 세팅을 하는 이유
32-bit 환경을 설정하는 이유는 NachOS가 32-bit 운영 체제로 설계되어 있기 때문이다. 즉, 32-bit 시스템에서 동작하도록 설계되어 있기에, 그에 맞게 환경을 설정해야 NachOS를 올바르게 실행할 수 있다. 그래서 32-bit 컴파일러와 라이브러리를 설치하고 32-bit 커널 환경을 설정하는 것이 필요하다.
dpkg --print-architecture # 시스템이 64-bit kernel 인지 확인
sudo dpkg --add-architecture i386 #32-bit 우분투에 접속
apt-get install gcc-multilib g++-multilib #gcc 및 g++ 설치
apt-get install lib32ncurses5 lib32z1
apt-get install gcc-4.8 gcc-4.8-multilib g++-4.8 g++-4.8-multilib
문제 1
[상황]
apt-get install lib32ncurses5 lib32z1 해당 명령어가 실행되지 않음
[원인]
우분투 22.04에서는 lib32ncurses5 대신 libncurses5:i386 패키지 사용!!
[해결] → 성공
sudo apt-get upgrade
sudo apt-get update → 패키지 리포지토리 정보를 최신으로 업데이트
sudo apt-get install lib32z1 libncurses5:i386 lib32stdc++6
문제 2
[상황]
apt-get install gcc-4.8 gcc-4.8-multilib g++-4.8 g++-4.8-multilib 명령어가 실행되지 않음
[원인]
Ubuntu 22.04.1 기본 저장소에는 GCC 4.8 및 G++ 4.8 패키지가 포함되어 있지 않음
[해결] → 성공
방법 1. PPA(Personal Package Archive) 저장소 추가
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get install gcc-4.8 g++-4.8
방법2. PPA 저장소를 추가하지 않고도 GCC와 G++를 설치 → 선택 sudo apt-get install gcc g++ build-essential
build-essential 패키지는 C/C++ 개발에 필요한 기본 도구들을 포함하고 있음 ***다만, **일부 소프트웨어는 특정 버전의 GCC 및 G++를 요구할 수 있음
아래에 나오는 과정들을 통해 얻은 결론….** 우분투 22.04에서 gcc 4.8 버전 불가!!
→ 그냥 gcc 버전 11로 진행하자…!
- gcc와 g++는 소스 코드를 컴파일하여 운영체제에서 실행 가능한 바이너리 파일로 변환하는 역할을 수행한다.
- 버전이 맞는지 체크 : gcc -v, g++ -v → gcc version 11.4.0 (Ubuntu 11.4.0-1ubuntu1~22.04)
# Switch the low version gcc, g++
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 40
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 40
문제 1
[상황]
alternative path /usr/bin/gcc-4.8이 존재하지 않는다는 에러 발생
[원인]
sudo apt-get install gcc g++ build-essential 명령어를 실행하면 Ubuntu 22.04.1의 기본 저장소에서 최신 버전의 GCC와 G++가 설치됨
[생각]
sudo apt-get install gcc-4.8 g++-4.8 명령어를 실행하여 지금 기본값이 설치된 상태에서 GCC 4.8을 추가로 직접 설치할 수 있지 않을까? → 시도
[문제]
couldn't find any package by glob 'g++-4.8'
couldn't find any package by regex 'g++-4.8' 등등의 에러 발생
왜 ? Ubuntu 22.04.1에는 GCC 4.8 버전이 공식 저장소에 포함되어 있지 않아 발생
[또다른 시도]
GCC 4.8 패키지가 포함된 PPA(Personal Package Archive) 저장소를 추가
sudo add-apt-repository ppa:ubuntu-toolchain-r/test → 에러
[문제 분석]
Ubuntu Toolchain Test PPA에는 디버그 기호 파일(dbgsym)이 포함되어 있기에 디버그 기호 파일을 설치하려면 'main/debug' 컴포넌트를 추가로 포함해야 한다는 문구가 나옴
[해결] → 실패
'main/debug' 컴포넌트를 포함하여 PPA를 추가
1. PPA를 추가
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
2. 패키지 목록을 업데이트
sudo apt-get update
3. GCC 4.8과 G++ 4.8을 설치
sudo apt-get install gcc-4.8 g++-4.8 -t xenial-updates
-t xenial-updates 옵션은 Ubuntu Xenial 릴리스의 업데이트 저장소에서 패키지를 가져오도록 지정
→ the value 'xenial-updates' is invalid for APT::Default-Release as such a release is not available in the sources 라는 에러 발생
4. 기본 GCC 버전을 4.8로 변경
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 40
→ Ubuntu 22.04.1에서는 GCC 4.8과 G++ 4.8 패키지를 직접 설치할 수 없다는 에러발생
→ apt-cache search gcc-4.8 명령어를 실행하여 사용 가능한 GCC 4.8 패키지를 확인해봤는데, 아무것도 안떴다……
⇒ 결국…! GCC와 G++ 최신 버전(버전 11) 설치
sudo apt-get install gcc-11 g++-11
[gcc에 대한 간략한 소개]
gcc는 GNU Compiler Collection의 일부로, C 언어를 포함한 다양한 프로그래밍 언어의 소스 코드를 컴파일하여 실행 가능한 프로그램으로 변환해주는 컴파일러이다. 대부분의 Unix 및 Unix-like 시스템에서 기본적으로 제공되며, C 언어의 표준을 준수하며 여러 플랫폼에서 동작한다.
[간단한 사용 예시]
gcc -o hello hello.c
"hello.c" 파일을 컴파일하여 "hello"라는 실행 파일을 생성한다.
-o 옵션은 출력 파일의 이름을 지정하는데 사용되며, 여기서는 "hello"로 지정되었다. 만약 별도의 이름을 지정하지 않으면 기본적으로 "a.out"이라는 이름의 실행 파일이 생성된다.
./hello
컴파일 후 생성된 "hello" 실행 파일은 위의 명령어로 실행할 수 있다.
4) nachos 디렉토리를 만들고 해당 디렉토리로 이동
mkdir nachos
cd nachos
5) NachOS 소스코드 다운로드
wget https://www.fit.hcmus.edu.vn/~ntquan/os/assignment/nachos_40.tar.gz
# NachOS의 소스 코드가 압축된 tar.gz 파일을 다운로드
wget https://www.fit.hcmus.edu.vn/~ntquan/os/assignment/mips-decstation.linux-xgcc.gz
# MIPS 아키텍처를 위한 크로스 컴파일러가 압축된 파일을 다운로드
wget https://www.fit.hcmus.edu.vn/~ntquan/os/assignment/nachos-gcc.diff.gz
# NachOS와 GCC 버전 간의 패치 파일이 압축된 파일을 다운로드
wget 명령어 설명
wget은 웹에서 파일을 “다운로드”하는 유닉스 및 리눅스 명령줄 도구이다. 주로 HTTP, HTTPS, FTP 프로토콜을 사용하여 파일을 다운로드한다. wget은 다운로드할 파일의 URL을 지정하고 실행하면 해당 파일을 현재 작업 디렉토리로 다운로드한다.
6) zip 파일 추출 및 Makefiles 패치
tar zxvf nachos_40.tar.gz
tar zxvf mips-decstation.linux-xgcc.gz # MIPS cross-compiler
tar zxvf nachos-gcc.diff.gz
patch -p0 < nachos-gcc.diff
7) NachOS 컴파일 및 실행
cd NachOS-4.0
# 현재 작업 디렉토리를 NachOS 소스 코드의 루트 디렉토리인 "NachOS-4.0"으로 변경
cd code/build.linux
# NachOS를 컴파일할 때 사용할 빌드 디렉토리로 이동
make depend
make
실행 결과
make depend
make
# ~/nachos/NachOS-4.0/code/build.linux>
./nachos #현재 디렉토리에 있는 "nachos" 실행 파일을 실행하여 NachOS를 시작
make depend
: 현재 작업 디렉토리에서 사용되는 소스 파일 간의 종속성을 분석하고 각 파일이 의존하는 다른 파일을 확인하여 Makefile에 반영한다. 이 과정을 통해 소스 코드가 변경될 때마다 필요한 파일만 다시 컴파일하도록 보장한다.
make
: Makefile을 기반으로 소스 코드를 컴파일하여 NachOS의 실행 파일을 생성한다. 이 명령은 의존성 분석을 통해 결정된 파일들을 컴파일하고 링크하여 최종 실행 파일을 생성한다.
8) NachOS 환경에서 유저 프로그램을 실행하기 위해 COFF → NOFF 포맷 변환?
cd ../../coff2noff
make #소스 코드를 컴파일하여 NachOS의 실행 파일을 생성
COFF (Common Object File Format)와 NOFF (Nachos Object File Format)는 서로 다른 파일 형식이다. NachOS는 NOFF 형식의 실행 파일을 사용하여 유저 프로그램을 실행한다. 따라서 COFF 파일 형식으로 작성된 유저 프로그램을 NachOS에서 실행하기 위해서는 COFF 파일을 NOFF로 변환해야 한다.
9) test application 실행
cd ../code/test
make
../build.linux/nachos -x halt #Nachos 시뮬레이터에서 시스템을 종료하는 역할
Machine halting! 이라는 문구가 나오며 정상적인 시스템 종료 과정을 보여준다.
시뮬레이터에서 발생한 디스크 I/O, 콘솔 I/O, 페이징 오류, 네트워크 활동 등의 정보도 함께 출력되었는데, 전부 0인 것을 보니 정상적으로 종료가 되었다는 것을 알 수 있다.
[파일 & 디렉토리들]
'CS > 운영체제' 카테고리의 다른 글
[OS] Disk (0) | 2024.07.01 |
---|---|
[OS] File System (0) | 2024.07.01 |
[OS] Memory Management (0) | 2024.07.01 |
[OS] Program -> Process (0) | 2024.07.01 |
[OS] Deadlock (0) | 2024.07.01 |