에구구...저녁먹고, 이제야 복습하게 되네요..
misc.c의 extern int end 변수를 커널 2.4를 이용해서 테스트좀 해봤습니다.
우선, /usr/src/linux에서 압축하기전의 커널(vmlinux)에서,
'end' 심볼을 찾아봤습니다.
_______________________________________________________________
[root@localhost linux-2.4]# nm vmlinux | grep -w end
[root@localhost linux-2.4]#
[root@localhost linux-2.4]# nm vmlinux | grep -w _end
c048eb18 A _end
[root@localhost linux-2.4]#
_______________________________________________________________
그런데, 위와 같이 end라는 심볼은 없고, _end만 있더군요...
(이건, 저희가 스터디에서, vmlinux에서 end라는 심볼이 있다고, 가정한 것과는 다른 결과죠???)
그래서, 압축된 커널인 bvmlinux에서 end 라는 심볼을 찾아봤습니다.
end, _end 심볼이 모두 보이더군요.
이 심볼은 head.o와 misc.o에서 모두 참조할 수 있는 주
_______________________________________________________________
[root@localhost compressed]# nm bvmlinux | grep -w end
00270360 A end
[root@localhost compressed]# nm bvmlinux | grep -w _end
00270360 A _end
[root@localhost compressed]#
_______________________________________________________________
그래서 이 결과를 종합해보면, 다음과 같은 결론이 나올것 같습니다.
ld(링커)에서 -T 옵션을 사용해서, 링커 스크립트를 명시적으로 지정하지 않는 한,
내부 링커 스크립트(Interal Linker Script)를 사용하더군요.
분명 내부 링커 스크립트에는, 아래와 같이 _end와 end가 명시되어 있습니다.
(생략)
_end = .;
PROVIDE (end = .); // 여기서 PROVIDE (end)는 _end와 같은 위치를 가진, end 심볼을 만든다.
(생략)
head.o misc.o piggy.o 를 링킹해서 bvmlinux를 만들 때는, 내부 링커 스크립트에 의해
_end, end가 삽입될 것 같습니다.
그래서인지, misc.c 에서 end를 참조할 수 있을 것 같구요..
그렇다면, end는 압축된 커널(bvmlinux)의 크기를 나타내느 것이 맞을 듯 싶은데요??
/usr/src/linux에 있는 vmlinux는 vmlinux.lds 라는 자체 링커 스크립트를 사용하고,
그 파일에선 end 심볼이 정의되어 있지 않은 것도 논리적으로 맞을 것 같구요..
즉 end는 스터디에서 예기했던, 압축하기 전의 커널 오브젝트의 크기가 아닌, 압축후의
커널 오브젝트의 크기가 맞을 것 같습니다.
그런, 의미로 low buffer와 high buffer를 setup하고 압축을 푸는 과정을 다시 그림으로 그려봤습니다.
물론, 커널 2.6에서는 정확히 테스트 해보지는 않았지만요..
혹, 누가 해보셨다면 결과를 알려주시면 감사하겠습니다.
댓글 9
-
송형주
2007.04.16 07:14
그런데, x86_64로 커널 컴파일은 어떻게 하는거죠?? -
송형주
2007.04.16 17:32
-
송형주
2007.04.16 17:38
ㅋㅋ 위의 그림이 잘못됐네요..
그리고 end는 bzImage가 아니라 압축 커널의 오브젝트인 bvmlinux의 크기가 되겠죠.?
예리하십니다 ^^ -
지현구
2007.04.16 17:54
오오... 멋집니다.
x86_64용으로 커널 컴파일하는 방법은 아래 웹페이지에 나오네요.
http://moduli.net/articles/2006/06/21/compiling-x86_64-kernels-on-debian-i386 -
송형주
2007.04.16 21:34
오호...역시나 예리하십니다. 좋은 정보 감사합니다. -
선준규
2007.04.17 00:01
오오 대단하시네요.... 내부 링커 스크립트라는것도 있었군요;;
근데 end는 압축커널의 크기가 아니라 압축커널에 메모리에 로딩되었을때 그 압축 이미지의 마지막을 가리키는 것이 아닐까요?? compressed 폴더의 Makefile을 보면 링커 옵션으로 -Ttext IMAGE_OFFSET(???) 이 들어가있던데
제가 생각한 바로는 (IMAGE_OFFSET + 압축커널의 크기)가 end의 주소가 될 것 같습니다. -
송형주
2007.04.17 01:45
네..준규님 말이..맞습니다... 예리하십니다 ^^
IMAGE_OFFSET = 0x100000 가 되야겠네요..
(웬지 뉘앙스가 압축된 커널이미지가 로딩되는 위치일듯 싶은데요 ^^) -
맥주
2007.04.17 02:42
송씨~ 그림 진짜 잘 그렸네요.. 디볼트 링커 스크립터.. ㅋㅋㅋ 이거 였군요.. 드디어 end 의 실체가 드러 난것 같습니다. 이것이 스터디의 힘이 아닐까 생각이 드는군요.. ^^ 모두들 대단하십니다..
-
김정수
2007.04.21 05:45
집에가서 한번해봐야 겠습니다.. ㅋㅋㅋ
.