안녕하세요 저는 도전 임베디드 os 만들기 통해 공부하고 있는 학생입니다.
앞서 질문 했던 분을 따라 저도 어쩌다 보니 이렇게 질문 하게 되었습니다 ;;
현재 상황
qemu 2.0.0 설치 완료
arm-linux-gcc3.4.6 크로스 컴파일러 설치 완료
gcc 4.8 네이티브 컴파일러 설치 완료
gumstix_uboot 컴파일 이후 u-boot.bin 와 u-boot 파일 생성 완료
이제 qemu에 uboot를 올려서 돌아가는지 확인을 해야 하는데
부득이 하게 qemu를 루트 디렉토리에 설치 하지 않고 바탕화면에 설치하여 경로가 책과 다릅니다.
----------------------------------------------------------------------------------------------------------------
책의 경우 /usr/local/bin/qemu-system-arm
저의 경우 /home/lee/바탕화면/qemu-2.0.0-rc0/arm-softmmu/qemu-system-arm
----------------------------------------------------------------------------------------------------------------
명령어를 u-boot.bin 파일과 u-boot 파일이 저장된 gumstix_uboot 디렉토리에서 실행하였습니다.
/home/lee/바탕화면/qemu-2.0.0-rc0/arm-softmmu/qemu-system-arm -M connex -pflash u-boot.bin -nographic
실행 시
--------------------------------------------------------------------------------------------------------------------------------------------------------------
lee@lee-900X3C-900X3D-900X3E-900X4C-900X4D:~/바탕화면/gumstix_uboot$ /home/lee/ 바탕화면/qemu-2.0.0-rc0/arm-softmmu/qemu-system-arm -M connex -pflash u-boot.bin -nographic
qemu-system-arm: failed to read the initial flash content
qemu-system-arm: Initialization of device cfi.pflash01 failed
--------------------------------------------------------------------------------------------------------------------------------------------------------------
구글링을 통해 검색해본 결과
----------------------------------------------------------------------------------------------------------------------------------------------------
터미널 commend에
dd if=/dev/zero of=flash.bin bs=4096 count=4096
dd if=u-boot.bin of=flash.bin bs=4096 conv=notrunc
(http://stackoverflow.usin소fonow.com/questions/26203514/qemu-flash-boot-up-does-not-work 에러 해결 참조한 주소)
를 순서대로 입력해주시고 (Flash format으로 바까주는 거래요 잘은 모르겠슴돠 ㅠㅠ)
아래 명령어를 수행해 주시면 됩니다.
qemu-system-arm -M connex -pflash flash.bin -serial stdio
--------------------------------------------------------------------------------------------------------------------------------------------------
위 와 같은 방법이 아니면 -M 옵션 머신을 바꾸는 방법밖에 찾지 못하였습니다.
현재 머신을 connex 즉 gumstix_board(PXA255)로 정하고 -pflash 이미지 파일 형식에 flash.bin 이라는 바이너리 이미지를 올릴경우 실행은 되지만
/home/lee/바탕화면/qemu-2.0.0-rc0/arm-softmmu/qemu-system-arm -M connex -pflash flash.bin -nographic
이 후 U-부트 소스와 나빌눅스 커널 이미지(제가 만든)를 메이크(컴파일)하여 새 이미지를 만들었을 때
/home/lee/바탕화면/qemu-2.0.0-rc0/arm-softmmu/qemu-system-arm -M connex -pflash navilnuximg -nographic
----------------------------------------------------------------------------------------------------
qemu-system-arm: failed to read the initial flash content
qemu-system-arm: Initialization of device cfi.pflash01 failed
-----------------------------------------------------------------------------------------------------
위와 같은 오류가 발생합니다.
확실한 점
1. 64비트 우분투 14.04에서 -> 32비트 크로스 컴파일 환경을 구성한 점 (각종 c 컴파일 라이브러리 업데이트를 했습니다.)
2. zlib를 이용하고 m4 -> autoconfig -> automake 통해서 u-boot 를 오류 없이 메이크 했고 u_boot 바이너리 파일을 생성했습니다.
앞으로 해결방안
2. qemu 버전을 바꾸고 루트 권한에서 설치 해본다.
3. 컴파일러 관련 공부를 더 진행해본다.
전자공학을 전공한 초심자 입니다. 쓴소리도 좋으니 많은 조언을 해주셨으면 합니다.ㅠ
추가로 구글링을 통해 검색 해본 결과 아래와 같이 그냥 flash.bin 을 이용하는 경우도 있는 것 같습니다.
--------------------------------------------------------------------------------------------------------------------------------------------------
1. ARM 크로스 컴파일 환경
ARM 아키텍쳐에서 돌아갈 프로그램을 일반 PC에서 컴파일 하려면
크로스 컴파일이란 환경을 갖춰야 한다.
이 때 필요한 것이 arm-linux-gcc 이고 이는 도서 자료 링크에서 받을 수 있다.
arm-linux-gcc-3.3.2.tar.bz2 파일을 다운 받았으면,
이를 우분투 내의 루트 폴더로 옮긴 후 루트 폴더에서 압축을 해제한다
($ tar xvf arm-linux-gcc-3.3.2.tar.bz2 )
기본적으로 압축을 해제하면, usr/local/arm 구조로 폴더가 생성되는데
루트 폴더에서 풀 경우 기존에 이미 있던 /usr/local/ 와 겹쳐지면서
/usr/local/arm/3.3.2 폴더와 파일들이 생성된다.
파일들이 제대로 생성됐는지 확인하고 넘어가자.
($ ls /usr/local/arm/3.3.2/ )
arm-linux-gcc 파일들이 정상적으로 생성 되었다면,
홈 디렉토리로 이동 후 ($ cd ~ ), 사용자 프로파일을 수정한다. ($ vi .profile )
파일의 맨 아랫줄에 아래 내용을 삽입한다.
PATH=/usr/local/arm/3.3.2/bin:/usr/local/arm/3.3.2/sbin:"${PATH}"
수정이 끝나면 이를 반영시켜준다.
($ source ~/.profile )
이후엔 정상적으로 반영되었는지 확인한다.
($ echo $PATH )
아래와 같이 나왔다면 크로스 컴파일 환경 구성은 갖춰졌다.
(/usr/local/arm/3.3.2 << 이 내용이 있어야 함)
※ Desktop 과 같은 몇몇 디렉토리에선 설정해준 경로가 적용되지 않으므로,
홈 폴더 내에서 작업용 디렉토리를 생성한 후 그곳에서만 작업하길 권장합니다.
2. qemu 설치
다른 블로그를 보면 qemu 를 설치하기 위해 많은 오류를 보고 시행착오를 겪게 된다.
qemu 를 직접 소스를 다운 받은 후 컴파일 하는 과정에서 문제가 생기는 것이다.
그러므로 필자는 깔끔하게 apt-get 을 사용해서 설치했다.
($ sudo apt-get install qemu )
qemu 로 에뮬레이팅을 할 때, qemu-system-arm 이라는 툴을 사용하게 되는데
qemu 만 설치하면 이 명령어가 없다면서 qemu-system 을 설치하라고 한다. 해주자.
($ sudo apt-get install qemu-system)
3. qemu 테스트
qemu 설치가 완료되었으면, qemu 로 돌릴 보드 환경을 갖춰야 한다.
아쉽게도 책에서 사용하는 이지보드는 qemu 에서 기본적으로 제공이 안되고,
대신 같은 칩(pxa255)을 사용하는 gumstix 라는 보드로 진행한다.
gumstix 는 u-boot 라는 부트로더를 사용한다.
도서 자료 링크에서 gumstix_uboot.tgz 를 다운받자.
gumstix_uboot.tgz 파일을 적당한 폴더에서 압축을 해제하고, 폴더 내로 이동한다.
그리고 아래와 같이 차례대로 명령어를 입력한다.
$ make distclean
$ make gumstix_config
$ make all
distclean 명령이 수행되면 몇개의 파일들이 삭제되었다는 로그를 볼 수 있다.
make all 을 진행하면 수많은 오브젝트 파일이 생성되는 로그가 뜨면서
최종적으로 u-boot.bin 파일이 생성된다.
그리고 이 파일을 qemu 를 통해 실행하면 된다.
$ qemu-system-arm -M connex -pflash u-boot.bin -nographic
하지만 실행 결과는 처참하게 에러가 발생할 것이다.
(qemu : Error registering flash memory.)
구글에 검색해볼 경우 불친절하게(?) 해결방법만 나와있고 이유는 설명해주지 않는다.
우선 해결법은 있으니 따라하기라도 해보자.
아래와 dd 명령어를 이용해서 파일을 새로 만들어주고, 다시 실행해본다.
$ dd if=/dev/zero of=flash.bin bs=1k count=16k
$ dd if=u-boot.bin of=flash.bin bs=1k conv=notrunc
$ qemu-system-arm -M connex -pflash flash.bin -nographic
그럼 아래와 같이 gumstix의 u-boot 가 성공적으로 실행된다.
앞으로 사용되는 u-boot 및 추가 커널 내용들도, 이 방법을 통해 수정해줄 것이다.
여기까지 qemu 를 이용한 임베디드 OS 개발 환경 갖추기 과정이었다.
※ 마지막 단계에서 왜 책과 다르게 파일을 만들어줘야 하는지 정확한 이유는 모르겠다.
하지만 일단 책에서 수행하는 u-boot.bin 파일은 158kb에 불과하지만
새로 만들어준 flash.bin 파일은 정확히 16MB 이다.
아마 qemu 에서 flash memory 를 설정하기 위해서 파일이 16MB 를 만족해야 하는 것 같다.
그래서 dd 옵션의 if 로 처음에 준 /dev/zero 는 '0' 값을 채워넣기 위한 소스이고
이를 통해 bs=1k 와 count=16k 만큼의 크기를 생성한다. (1K * 16K = 16M)
이후에 flash.bin 파일에 u-boot.bin 파일을 덮어쓰는 형태로
크기를 유지하고 u-boot 내용을 집어넣는다.
댓글 0
.