본문 바로가기
프로그래밍/Embeded

도전 임베디드 OS 만들기 - qemu, u-boot 설치(Ubuntu 18.04 64bit ver)

by Hwan2 2019. 8. 27.
728x90
반응형

PC status


OS : Ubuntu 18.04 (64bit)

ram : 8GB

gcc : 7.4.0 ver












QEMU 설치


window에서 가상머신인 virtualbox를 이용하는 것 처럼 embedded 개발도 에뮬레이터 라는걸 이용하면 됩니다.


EZ보드를 사서 해도 되지만..... 돈도 나가고 또 비쌉니다. 국내에선 구하기 힘들구요.


하여, 책에서 소개하고 있는 qemu라는 녀석을 설치해 보겠습니다.




qemu는 최신버전을 사용해도 무방함으로 위와 같은 형식으로 설치해 줍니다.





u-boot 설치


※ 2019년 8월 27일 현재 '도전 임베디드 os 만들기'의 arm-linux-gcc, u-boot, qemu등 소스 파일이 있는 홈페이지가 안들어 가집니다.

때문에 제 github에 일단 올려놨습니다.



'$ git clone https://github.com/dnfwlq8054/u_boot-1.1.4-.git'



.tgz파일을 받으시면 압출을 해제 합니다.



그 후 'gumstix_uboot' 디렉토리로 이동 후 다음과 같은 명령어를 입력해 줍니다.


$ make distclean

$ make gumstix_config

$ make all


완료 되면 u-boot.bin 이라는 바이너리 파일이 생성될 것입니다.




-------------------여기서 부턴 64bit 운영체제 기준입니다.-------------------


※만약, OS가 32bit 이시면 잘 실행 될겁니다. 하지만 64bit 사용자라면 다음과 같은 오류 메시지가 나옵니다.

" make[1]: arm-linux-gcc: Command not found " 

그럴 경우 아래와 같이 libc6-i386을 설치하시면 됩니다.


$ sudo apt-get install libc6-i386


또는


$ sudo apt-get install libc6:i386 libstdc++6:i386



위 u-boot인 경우 32bit실행 파일로 만들어 졌습니다.

때문에 64bit에서 사용할 경우 32bit lib가 참조하여 실행하게 되는데, 운영체제는 64bit 이므로 이를 거부하게 됩니다.

따라서 위와 같은 패키지 설치를 통해 64bit 운영체제에서 32bit 실행파일을 실행 할 수 있도록 해줍니다.



설치가 다 완료되면 다시 make 명령어를 입력해 줍니다.

$ make distclean

$ make gumstix_config

$ make all



그럼 정상 작동되고 u-boot.bin 이라는 바이너리 파일이 생성될 것입니다.


------------------------------------------------------------------------------------



그 다음 qemu 에뮬레이터를 실행시켜 가상 터미널에 접속이 되면 완료가 됩니다.


명령어는 다음과 같습니다.


'$ qemu-system-arm -M connex -pflash u-boot.bin -nographic '



이게 32bit 운영체제에서도 될지 안될지는 모르겠습니다.



우선, 

WARNING: Image format was not specified for 'u-boot.bin' and probing guessed raw.

         Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.

         Specify the 'raw' format explicitly to remove the restrictions.

qemu-system-arm: Initialization of device cfi.pflash01 failed: failed to read the initial flash content


이렇게 뜬다면 u-boot.bin 파일이 잘못된 것입니다.


$ make all 할 때 컴파일 과정을 봐도 error부분은 없었습니다.


u-boot.bin의 용량 크기를 확인해 보면,




용량 크기는 158,844 byte로 대략 160K 라고 보시면 되겠습니다.


flash파일 치곤 작습니다.......


32bit와 64bit의 차이점은 char, short, int까진 자료형 크기가 같으나 long부턴 서로 다릅니다.


아무래도 해더 파일들 중에 long형을 변수가 아닌 숫자로 읽어 들어온 것이 있나.... 싶기도 합니다.

(해더 파일 개수만 684개..... 찾는거 애바......)



어쨌든 error내용을 보면 cfi.pflash01을 읽어오지 못한다고 나와있습니다.



해결 방법을 찾아보니 그냥 null파일을 16MB 만큼 생성한다음에 u-boot.bin 파일을 


dd명령어인 '-notrunc'형식으로 덮어쓰기 하면 해결이 됩니다......


16MB인 이유는 u-boot의 이미지 파일의 가상 매모리 크기가 16MB로 잡혀있어서 그런게 아닌가 하는 생각입니다.....






'$ dd if=/dev/zero of=flash.bin bs=16M count=1'

'$ dd if=uboot.bin of=flash.bin bs=16M conv=notrunc'

'$ qemu-system-arm -M connex -pflash flash.bin -nographic'


여기서 flash.bin의 이름은 바뀌어도 상관 없습니다.


원래 dd명령어는 디스크 복사할 때 주로 사용합니다. 그리고 /dev/zero는 유닉스 계열 운영체제의 특수 파일인데,

일반적인 용도는 데이터를 위와 같이 복사할 때 데이터 크기를 위해, 

읽기 전용으로 null문자를 넣어 용량을 채우는 용도로 사용합니다.


bs는 한번에 읽어올 byte수를 말하며 count는 몇 번 읽어올지 정하는 것입니다.

notrunc는 덮어쓰기라고 보시면 됩니다.



위 qemu 명령어를 실행하면 다음과 같은 터미널 화면이 나오게 됩니다.


여기서 위에 보시면 


WARNING : Image format was not specified for 'flash.bin' and probing guessed raw.

         Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.

         Specify the 'raw' format explicitly to remove the restrictions.


라고 되어 있는데, 무시하셔도 됩니다. raw파일이 정의되지 않아서 자기가 알아서 raw이미지로 일단 실행한다는 뜻이니 말입니다.



마지막으로 u-boot 터미널에서 빠저나가는 방법을 말씀드리겠습니다.

Ctrl + A를 누른 후 키보드에서 손을 때고 X를 눌러주시면 됩니다.(3초 안에 진행해 주세요.)


반응형

댓글


스킨편집 -> html 편집에서