■ 커널 이미지 파일의 구조를 먼저 알아야 LILO(Linux Loader)가 커널을 어떤식으로 부팅하게 해주는지 이해가 빠를 것이다.

■ zImage 와 bzImage의 구조는 같다. 단지 메모리에 올려지는 위치나 동작 방식이 약간 차이가 있기 때문에, 이것이 감안된 각각에 맞는 코드가 사용될 뿐이다.


(1) bzImage 의 구조 (big kernel)




- piggy.o : 이 부분이 진짜 리눅스 커널이고, 압축되어 있는 상태다.
- head + misc : 'piggy.o'에 압축을 풀어주기 위해 앞부분에 붙어있다.
bsetup : 'piggy.o'와 'head+misc' 한 덩어리의 이미지에, 메모리에 올려진 커널의 압축이 제대로 풀리도록 미리 준비한다.
- bbootsect : 플로피로 부팅될 때 즉, 부트로더가 없이 커널이 직접 읽혀져 부팅될 때 필요한 부트섹터이다. (lilo에 의해 부팅시 불필요)

이렇게 4부분이 붙어 최종 커널 이미지 파일을 만든다.


(2) 커널의 부팅
● lilo에 의해 부팅이 시작되면 LILO는 bzImage를 하드 디스크에서 읽어 메모리에 올려 놓고 LILO에 의한 부팅일 경우 필요 없는 bbootsect를 건너뛴 bsetup에서부터 실행되도록 해준다. LILO의 역할은 bsetup에 실행 권을 넘겨주는데 까지다.

● 실행된 bsetup은 메모리 세팅을 마치고 압축된 커널 이미지의 압축을 풀기 위한 코드로 실행을 옮긴다. "head + misc"로 표시된 부분이고 이곳이 실행되면 piggy.o는 압축이 풀려 실행 가능한 리눅스 커널이 메모리에 존재하게 된다. 압축이 풀릴 때 화면에 "Uncompressing Linux... "란 메시지가 출력된다.

● 그러나 압축이 풀렸다고 해서 바로 커널을 실행하는 것은 아니고 메모리 낭비를 막기 위한 정리를 한번 다시 하고 나서 커널이 실행된다. 압축이 풀리고나면 처음 LILO에 의해 읽혀진 커널 이미지는 필요 없게 된다. 그러므로 이 부분을 내버려두면 그만큼 메모리 낭비이므로 압축 풀린 커널 이미지를 옮겨와 되도록 많은 메모리를 사용하도록 한 후 커널을 실행해 준다. 커널이 실행되기 시작하면 "ok, booting the kernel."이 출려되고 커널에 의한 출력이 화면에 나타나게 된다.


(3) zImage 와 bzImage 의 차이
: z는 gzip으로 압축되어있단 의미이고 b는 big kernel이란 의미이다. 커널의 크기가 너무 커서 압축 후에도 일정 크기를 넘어가면 zImage 대신 bzImage를 사용해야한다.

리눅스 커널의 크기가 커서 커널을 읽어들이는 프로그램 크기나 시스템에서 사용되는 약간의 메모리를 제외한 나머지 램의 빈공간에 읽어 들이지 못하면 하위 1MB가 아니라 그 이상의 연속된 메모리에 커널을 읽어 들이고 압축을 푸는 등의 일을 해야할 것이다. 반대로 남은 용량에 커널이 들어갈 수 있다면 당연히 읽어 들이고 압축을 풀면 끝날 것이고...

이렇게 메모리에 처음 적재되고 압축 풀리고 하는 절차와 위치가 다르기 때문에 zImage와 bzImage오 나뉜 것이고 커널 이미지 파일의 앞부분 bootsect와 setup이 각각에 따라 맞는 것으로 합쳐지게된다. 그리고 bzimage의 경우 하위 1M는 사용하지 못하는데 리눅스에선 그렇다!

컴파일 단계에서 make zImage 했을 경우 System is too big. Try using bzImage or modules. 라고 에러가 난다면 더 많은 부분을 module로 만들거나 bzImage를 사용해야한다.

by 민트앤라떼 2011. 10. 5. 16:16