안녕하세요 저는 도전 임베디드 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 바이너리 파일을 생성했습니다.




앞으로 해결방안


1. flash.bin 이미지 파일은 실행된 점을 감안 해볼 때  이미지 메이크가 잘못되었는지 확인해본다.

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 내용을 집어넣는다.





번호 제목 글쓴이 날짜 조회 수
공지 [공지] 프로그래밍 관련 Q&A 게시판 입니다. woos 2016.04.09 22243
457 커널 컴파일 [1] ldy209 2017.04.06 329
456 디바이스 드라이버 모듈에서 작성한 함수를 커널에서 사용하는 방법 [1] 개짖는소리 2017.02.06 27039
455 VMA의 flag에 관해서 미다리로23 2017.02.09 402
454 카메라 잘하시는 분 부탁드립니다. 김영일 2017.02.02 466
453 llvm 관련하여 질문드립니다. [4] June 2016.09.29 1004
452 linux에서 gpio 초기화에 대한 질문입니다. [2] k40007 2016.10.01 1280
451 Android Application 구동에 관한 조언 부탁드립니다. [1] June 2016.09.21 236
450 사운드 관련하여 질문입니다. qtopia 2016.09.22 134
449 커널의 물리적 주소안에 값을 읽고 싶은데 읽어 오지 않습니다 ㅠ 많은 조언 부탁드립니다 [13] 송창인 2010.12.23 12116
448 access_ok 질문 있습니다. qtopia 2016.07.20 513
447 쓰레드 execution time 질문입니다. [3] 쎈쓰쟁2 2016.03.29 560
446 include/asm-generic/topology.h macro 질문드립니다. [2] k40007 2015.09.29 859
445 Arm 어셈블리어 질문입니다. [2] 이루카 2015.09.25 2310
444 raw_spinlock 질문있습니다. tooson 2015.08.28 903
443 어셈블리어 section에 대해 궁금한 것이 있습니다. [1] 해비 2015.08.12 1812
442 2440 보드의 address 신호와 소스상의 주소를 어떻게 이해 하고 있으면 될까요? 변화의물결 2015.07.28 866
» 안녕하세요 ^^ 임베디드 os 관련 질문이 있습니다 배우고싶어요 2015.07.17 1992
440 Linux Kernel Suspend와 같은 상황 질문드립니다. [1] June 2015.04.07 1164
439 freezable_schedule 의 역할이 무엇인가요? [2] CVE 2015.02.23 2741
XE Login