Compiling Linux
Cpu execution cycle

- **Fetch**
- fetch next instruction (pointed by eip)
- 프로그램 카운터 레지스터(eip in x86 cpu) 는 다음에 수행할 메모리 주소가 저장됨
- 메모리 주소 레지스터(MAR) : 프로그램 카운터에게 받은 메모리 주소가 저장되어 방문
- 메모리 버퍼 레지스터(MBR) : MAR에서 방문한 주소에서 data를 가져와서 저장
- 명령어 레지스터(IR) : MBR에 저장된 data가 명령어이면 가져와서 저장
- **Decode**
- update PC(eip in x86 cpu)
- IR에 있는 명령은 CU(제어장치) 로 이동되어 해석(Decode)된다.
- **Execute**
- execute fetched instruction
- CU에서 해석(Decode)되어진 명령어는 누산기 레지스터 등을 통해 ALU(산술연산장치)로 이동되어 실행(execute)된다.
**cpu는 cpu clock 이 tick 할 때마다 위 3단계를 거치고, execute한 이후에는 다시 반복한다.**
booting sequence
- **Power on**
- 전원이 켜지면 메모리 주소는 BIOS 위치인 0xFFFFFFF0을 가리킨다.
- **BIOS**
- 시스템 기초 설정 및 boot loader load/execute (disk A부터 탐색)
- **GRUB**
- OS를 load/execute 한다. 여기선 Linux
- **Linux**
- 인터럽트 설정, 시스템 구조 초기화, 프로세스 생성 등을 수행
- **login**
- Linux kernel booting의 마지막 프로세스는 login process로, user의 input(keyboard interrupt)를 받기 위해 대기한다.
How GRUB finds Linux
- **kernel 수정**
- kernel의 내용을 수정한다. (i.e. main.c 내용 수정)
- **이미지파일 생성**
- kernel 수정 내용을 compile한다.
- make bzImage
- **이미지파일 복사**
- grub가 OS를 찾는 경로는 /boot 이므로 이 경로에 2. 에서 생성한 bzImage를 복사한다.
- cp /root/linux-2.6.25.10/arch/x86/boot/bzImage /boot/bzImage