본문 바로가기
프로그래밍 관련/프로그래밍 관련 잡지식

임베디드 리눅스 그리고 부트로더 그리고 u-boot

by 존버매니아.임베디드 개발자 2021. 11. 25.
반응형

※ 엄청 예전에 교육들은거 기억나는대로 대강 쓴거라 틀리고 부정확한 내용이 많은듯.

   나중에 공부해서 내용 보강 필요.  우선은 대강 개요만 적어놓기

 

임베디드 리눅스 SW가 실행될 타겟보드가 있다.

 

이 SW가 타겟보드에서 실행되려면 이 SW가 타겟보드의 Flash 에 Flashing이 되어있어야 한다.

 

타겟보드에 JTAG이 있다면 JTAG을 이용해서 Flashing을 하면 될 것이다.

 

JTAG이 없는 경우 취할 수 있는 방법중에 부트로더를 사용하는 방법이 있다.

 

부트로더도 종류가 많은데 유명한 것중 하나가 U-Boot 이다. (부트로더 SW이름임)

 

U-Boot를 사용해서 타겟보드에 리눅스 SW를 Flashing 할 수 있다.

 

근데 생각해보면 U-Boot도 SW 니까, U-Boot가 타겟보드에서 실행되려면 U-Boot도 미리 Flashing이 되어있어야한다.

결국 U-Boot를 Flashing 하려면 결국은 JTAG 같은 하드웨어 연결이 필요할 것이다.

 

아무튼, 일단은 U-Boot가 타겟보드에 설치되어있다고 가정하고,

U-Boot의 역할에 대해 간략히 알아보자.


U-Boot가 미리 깔려있다고 가정하면,

보드에 전원을 Power-On 하면 U-Boot가 실행될 것이다.

U-Boot SW는 시리얼 통신으로 우리 PC와 통신을 할 수 있다.

그래서 우리 PC 에서 Putty나 HyperTerminal 같은 프로그램을 설치해서 U-Boot와 시리얼 통신으로 간단한 명령을 날리거나, 현재 상황을 읽어볼 수도 있다.

 

U-Boot SW가 타겟보드에 제대로 설치되어있고, 우리 PC와 시리얼 통신이 제대로 연결되어있다면.

우리 PC에서 Putty 로 시리얼통신 연결 해놓은 상태에서

타겟보드의 전원을 On 하면. 시리얼 통신으로 Uboot의 부팅내용 등을 우리 컴퓨터에게 알려줄 것이다.

그러면 일단 UBoot가 정상적으로 설치됐다는 것을 확인할 수 있다.

 

U-Boot가 켜지면 맨 처음 수행하는 명령이 있는데 그 명령을 bootcmd 라고 한다.

유저는 bootcmd를 무엇으로 할건지 정해줄 수 있는데

 

uboot에게 

setenv bootcmd 'tftp 32000000 zImage  ; bootm 32000000   ※ ;는 주석을 의미한다.

라고 입력하면

uboot의 bootcmd 를 tftp 32000000 zImage 로 하겠다는 의미이다.

그러므로 이렇게 셋팅을 해놓고 보드를 껏다가 다시켜면

U-boot가 실행이 될 거고, U-boot가 실행된 후 가장 먼저 수행하는 명령이

tftp 32000000 zImage가 된다.

 

(참고로 이 명령은 앞에서 말한 시리얼 통신이 정상적으로 동작이 가능할 때 얘기다.

 그래야 내가 setenv 이런 커맨드를 UBoot에게 날려줄 수 있으니까)

 

그러면 우리는 tftp 32000000 zImage 명령이 무슨 의미인지를 알 필요가 있다.

이 명령이 뭐냐면 타겟보드의 32000000 메모리 번지에 zImage 라는 파일을 Host로 부터 받아와서 다운로드 하라는 명령이다.


Tftp 프로토콜 : ftp 프로토콜의 한 종류로 이더넷을 사용하여 파일을 주고 받을 때 사용한다.

  ※ ftp - file transfer protocol

 

우리 컴퓨터(우리 컴퓨터)가 tftp 의 Host로 동작할 수 있도록 하기 위해서, tftp 와 관련된 설치를 해야한다.

apt-get 명령을 이용하여 tftp 관련 파일을 컴퓨터에 설치하고, 관련된 셋팅을 해준다.

(셋팅 내용 설치방법은 추후에 보강)

 

tftp 서버로 사용될 특정 폴더를 지정한다. 

타겟보드에 다운로드 할 리눅스커널 파일을 해당 폴더안에 집어넣는다.

해당 파일의 이름을 zImage로 해놓는다.

 

우리 컴퓨터가 이제 tftp 프로토콜의 Host Server로 동작할 수 있게 된다.

 

타겟보드가 켜지면 uboot가 켜질 것이고, uboot는 tftp 프로토콜을 명령을 우리 컴퓨터(Host)에게 요청할 것이다.

zImage 라는 파일을 다운로드해야 되니까 나한테 달라고.

 

우리 컴퓨터에서는 zImage라는 리눅스커널 이미지파일을 해당 폴더안에 넣어놨고, tftp 프로토콜 호스트 서버로 동작하기 때문에

해당 프로토콜을 통하여 zImage 파일을 타겟보드에게 넘겨주게 된다.

그러면 U-Boot는 이 파일을 받아서 플래싱 하게 된다.

 

이제 타겟보드의 전원을 다시 껐다 켜면

리눅스커널 이미지로 점프해서 리눅스 운영체제가 돌아가게 된다.

 

-- 근데 설명을 좀 빼먹은게 있는데

tftp 프로토콜은 이더넷을 이용하기 때문에,  타겟보드와 우리 PC 간에 이더넷으로 통신하려면 IP 주소 등을 셋팅해줘야 한다.

앞에서 말했듯이 U-Boot와 시리얼통신을 통해서 우리가 커맨드를 날릴 수 있기 때문에..

tftp 프로토콜을 사용하기전에 우선

시리얼통신의 커맨드를 통해서 ip 주소와 관련된 셋팅도 미리 해주어야 한다.

그래야 나중에 tftp 프로토콜이 정상동작 할 수 있을 것이다.

 

 

 

 

 

 

 

 

 

 

반응형