보드 부팅시에 램디스크로 부팅시에 length error 가 나는 것을 가끔 볼수 있다.


나의 작업 환경은 데스크탑 우분투 9.10 이다.

tftp 서버를 사용하고 있고 보드에서는 나의 데스크탑으로 부터 램디스크를 다운받는다.


가끔 램디스크를 만들어서 다운로드를 하면 이상하게 length error 에러가 발생한다.


RAMDISK: Compressed image found at block 0

length error


사이즈도 맞춰보고 해도 이상하게 에러가 발생하는 것이었다.
도저히 이런 에러를 묵과할수 없어 디버깅을 시작했다(이런거 정말 찜찜하다)
물론 부팅도 잘되고 동작에는 문제가 없었지만...

gzip 으로 묶인 램디스크의 맨 마지막 4바이트는 size 정보이다.
이파일이 몇메가짜리 램디스크냐 하는 사이즈 정보이다.
나는 16M 를 사용하므로 당연히 0x01000000 이라는 데이타가 램디스크의 마지막에 들어있다.

하지만... 커널의 압축을 푸는 lib/inflate.c 파일에는 gunzip 이라는 함수가 있고
이곳에서 압축을 풀고 나서 맨 마지막에 확인하는 4바이트의 숫자는 잘못된 값이었다.

어디에서 부터 잘못되었을까???

일단 커널에서 확인한 데이타는 잘못된 데이타를 갖고 있었다.
그럼 램디스크에서 로딩하는 데이타가 문제인가? 

부트로더에서 램디스크를 저장하는 낸드 플래쉬를 확인해 보았다.
헉... 잘못된 데이타가 들어있었다.

흠... 
tftp 로 메모리에 다운로드후에 데이타를 확인해 보았다.
EZBOOT>md 0x50CA4820
50CA-4820 :C522BF22 755A4B35 A1300A5B A38C62E7   ."."uZK5.0.[..b.
50CA-4830 :AD4A074F 16F91AB8 EFBF018F BFC1E700   .J.O............
50CA-4840 :00000B47 6256FFFF FFFFFFFF FFFFFFFF   ...GbV..........
50CA-4850 :FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF   ................

483f 부터 데이타인데... 0x0B000000 이다.
원래는 0x01000000 인 16M 를 표시해야 하는데 잘못되었다.
ezboot 의 tftp 에 문제가 있는가 하여... 실제 데이타보다 더 받아 보았지만 역시 마찬가지...

이때... 눈에 띄는 것이 있었다....
램디스크의 파일 크기...
파일 사이즈가 2771011 
흠.. 뭔가 냄새가 난다.
홀수로 끝나는 저 크기는 뭔가 문제를 일으킬것 같았다.
hexedit 로 파일을 열어서 뒤어 1byte 를 더 넣어 주었다.
부트로더에서 다운로드후에 덤프해 보았다.

EZBOOT>md 0x50CA4820
50CA-4820 :C522BF22 755A4B35 A1300A5B A38C62E7   ."."uZK5.0.[..b.
50CA-4830 :AD4A074F 16F91AB8 EFBF018F BFC1E700   .J.O............
50CA-4840 :00000100 F0F0F0F0 F0F0F0F0 F0F0F0F0   ................
50CA-4850 :F0F0F0F0 F0F0F0F0 F0F0F0F0 F0F0F0F0   ................

정상적으로 데이타가 들어왔다.
정확한 원인은 알수 없으나...........
tftp 서버가 데이타의 크기가 홀수 인경우.... 마지막 1byte 가 제대로 오지 않는다.

이지부트의 문제인가? tftp 서버의 문제인가???
다음주에는 윈도우 서버에서 tftp 서버를 돌려서 확인해 봐야 겠다.






꼬릿말.
커널에서 램디스크는 램디스크에 있는 파일 사이즈를 나타내는 데이타가 틀린 경우
계속 해서 함수들이 에러를 리턴하지만....
해당 결과는 커널에서 처리될때 마지막에 rd_load_disk 에 리턴값과는 
관계없이 동작하는 기가막힌 행운을 가지고 있었다.