본문 바로가기

부트로더

부트로더의 기본 구현-2 저 자 : 유영창 출판일 : 2003년 12월호 == 이지부트의 디렉토리 구조 이지부트 소스에서 start와 main의 두 프로그램은 상호 유기적인 관계가 있기 때문에 디렉토리를 하나로 작성하고 하부 디렉토리에 따로 관리한다. 하나의 디렉토리 안에 모든 소스를 관리하면 나중에 무척 힘들게 되고 Makefile이나 링크 스크립트 작성이 어렵다. 그래서 Makefile이나 링크 스크립트의 관리적인 측면에서 따로 나누는 것이 유리하다. 우선 이지부트의 하부 `디렉토리 구조를 살펴보자. 이지부트가 존재하는 디렉토리가 ezboot라는 이름을 갖는다고 가정하면 하부 디렉토리의 모습은 다음과 같다. ◆ ezboot/image/ : 최종적으로 생성되는 부트로더 이미지가 들어가는 디렉토리 ◆ ezboot/include/.. 더보기
보드를 살려보자-4 저 자 : 유영창 출판일 : 2003년11월호 == PXA255의 GPIO EZ-X5의 LED는 GPIO 2, 3, 4, 5에 연결돼 있다. 따라서 LED 시험을 하기 위해서는 PXA255의 GPIO에 대해 알아봐야 한다. GPIO(General Purpose Input Output)는 일반적인 용도의 입출력 포트를 의미하며, 구조는 와 같다. 이처럼 복잡한 구조를 갖는 이유는 하나의 입출력 핀에 여러 가지 기능을 부여하기 때문이다. 기본적으로 입력과 출력이 가능하며, 하나의 핀은 GPIO로 사용될 수도 있지만 다른 기능으로도 사용이 가능하다. GPIO의 구조 이 모든 것을 설명하기는 지면 사정상 곤란하므로 시험 코드를 작성하기 위해 필요한 사항에 대해서만 알아보자. 우선 살펴봐야 할 것은 GPIO에 관.. 더보기
보드를 살려보자-3 저 자 : 유영창 출판일 : 2003년11월호 == 타겟 보드 이전 강좌에서도 독자들에게 양해를 구했듯이 실제 사용 가능한 부트로더를 만들려면 타겟이 분명해야 한다. 여러 프로세서를 지원하는 공개된 부트로더들 역시 환경 설정시에 타겟을 설정하게 하는 것이 그 이유이다. 때문에 필자 회사에서 개발한 EZ-X5 보드를 소개할 수밖에 없는 점을 이해해 주기 바란다. 은 이번 연재를 통해 만들어보게 될 ‘이지부트’라는 부트로더가 실장될 타겟 보드(모델명 EZ-X5)의 외관이다. 실장 내용은 다음과 같다. ◆ PXA255 400MHz ◆ 32MB SDRAM ◆ Boot Flash(NOR FLASH ROM 29LV800) ◆ Data Flash(NAND FLASH K9F1208U0A) ◆ Ethernet CS890.. 더보기
보드를 살려보자-2 저 자 : 유영창 출판일 : 2003년11월호 == 크로스 컴파일러와 gcc 소스 패키지 gcc에서 i386 이외의 실행 파일을 만들기 위해서는 리눅스에 이미 설치된 gcc란 컴파일러는 소용이 없다. 몇 가지 옵션만 바꾸어서 gcc를 실행한다고 i386 이외의 프로세서를 지원하는 코드가 생성되는 것은 아니다. 애초에 다른 프로세서에서 동작될 수 있는 실행 파일을 만들 수 있도록 gcc를 만들어야 하는 것이다. 그렇다고 기존에 i386에서 동작하는 gcc를 아예 다른 프로세서에서 동작하는 실행 파일을 만드는 gcc로 바꿔버리면 문제가 된다. 그 뒤로는 i386에서 동작하는 어떤 프로그램도 만들 수 없기 때문이다. 그래서 보통은 gcc의 이름을 조금 바꾼다. arm 계열의 프로세서에서 동작하는 실행 프로그램.. 더보기
부트로더의 기본 구현 1 저 자 : 유영창 출판일 : 2003년 12월호 부트로더의 주 임무는 커널이 동작할 수 있는 환경을 구성하고 커널을 시작하는 것이다. 정의는 간단하지만 프로세서를 정상적으로 동작시켜야 하기 때문에 그리 만만한 일이 아니다. PXA255 프로세서에서 동작하는 이지부트 프로그램은 두 부분으로 나눠져 있다. 최소한의 환경 설정을 하는 start 프로그램 부분이 있으며, 커널이 부팅하도록 지원하고 개발의 편리함을 제공하는 main 프로그램이 있다. start 프로그램은 모두 ARM 어셈블러로 구성돼 있고 스택이 없기 때문에 다중 호출도 하지 못하는 가장 열악한 환경의 프로그램이다. 이번 호에는 이지부트의 시작점인 start.S를 집중적으로 살펴보고자 한다. 연+재+순+서 1회 2003.10 | 임베디드 프로그래.. 더보기
보드를 살려보자-6 저 자 : 유영창 출판일 : 2003년11월호 == Makefile 리눅스에서 동작하는 gcc는 기본적으로 make 유틸리티를 사용하여 컴파일한다. RAD 툴을 사용하던 프로그래머라면 이 make 유틸리티가 다소 어렵게 느껴질지 모르지만 리눅스 프로그래머거나 기존 펌웨어 프로그래머라면 항상 접하는 유틸리티이다. 리눅스에서 사용되는 make 유틸리티는 매우 유용한 도구이고 개념만 익히고 나면 쉽다는 것을 알 수 있다. make 유틸리티는 기본적으로 Makefile이라는 이름을 갖는 파일을 필요로 한다. 이 Makefile이 바로 컴파일에 관련된 모든 조건을 기록해 놓는 파일이다. 보통 이 Makefile은 구성이 비슷하기 때문에 한번 자신만의 구성을 만들면 이후에 조금씩 수정해서 쓰면 된다. make에 관.. 더보기
보드를 살려보자-5 저 자 : 유영창 출판일 : 2003년11월호 == start.S 어셈블러 에서 가장 먼저 보이는 것은 (1)인데, 이렇게 선언되면 이후 코드의 어드레스 영역이나 기타 조건은 링커 스크립트에 선언된 .text라는 선언에 영향을 받는다. 일반적으로는 프로그램 코드 영역을 의미한다. 하드웨어 리셋이 발생하면 ARM은 0x00000000번지의 명령을 수행한다. 이 번지는 링커 스크립트에 의해서 _start 라벨에 맵핑된다. 좀더 정확히 말하면 링커 스크립트에서 .text에 대해 0x00000000번지에 할당되어 있기 때문이고 _start 라벨이 가장 먼저 기술되었기 때문이다. 이 _start가 0x00000000번지이기 때문에 이 라벨 이후에 인터럽트 벡터 테이블이 들어간다. 그래서 각 벡터 테이블이 수행할 .. 더보기
ARM 부트로더 제작기 보드를 살려보자-1 저 자 : 유영창 출판일 : 2003년11월호 임베디드 시스템에서 하드웨어 설계가 끝나고 제작 후 샘플 보드가 나왔을 때 가장 먼저 하는 것이 보드에 대한 검증이다. 필자가 다니는 회사에서는 이것을 ‘보드 살리기’라는 말로 표현한다. 이 보드 살리기는 운이 좋으면 바로, 운이 나쁘면 언제 끝날지 모르는 피 말리는 시간이 필요하다. 이런 현상이 발생하는 이유는 문제의 원인이 하나가 아니고 여러 가지가 혼재하기 때문이다. 어떤 문제를 해결하는 가장 빠른 방법은 문제의 종류를 구분하는 것이다. 그런데 이 경우에는 이 자체도 매우 어렵다는 것이다. 하드웨어 문제인가? 소프트웨어 문제인가? 때문에 보드 살리기에 필요한 과정을 살펴보고 부트로더와의 관계를 살펴보자. 연+재+순+서 1회 2003.10 | 임베디드 프.. 더보기
임베디드 프로그래머와 부트로더-5 저 자 : 유영창 출판일 : 2003년 10월호 == ARM 프로세서 PXA255는 앞서 언급했듯 ARM 계열이다. 삼성이나 다른 회사에서 만든 프로세서가 ARM 코어를 라이선스한 것과는 다르게 아예 설계 자체를 사서 인텔 자사의 기술을 더한 프로세서이다. 그러나 결국은 이것도 개발자 입장에서 보면 ARM의 한 계열로 봐도 무방하다. 이 프로세서를 이해하면 ARM 코어를 사용하는 다른 프로세서들도 어느 정도 이해가 가능하다 그렇다면 ARM이란 것은 어떤 것일까? 아무래도 이 연재가 ARM용 부트로더를 작성하기 위한 것이므로 ARM 프로세서에 대해 모르고 갈 수는 없다. 그래서 ARM에 대해 잠깐 살펴보자. 우리가 알고 있는 펜티엄은 인텔에서 제작하고 있는 프로세서이다. 하지만 ARM에서 만든 ARM 프로.. 더보기
임베디드 프로그래머와 부트로더-4 저 자 : 유영창 출판일 : 2003년 10월호 == 상태 표시·메시지 표출·명령 입력 및 처리 기능 보드를 시험하는 과정에서 진행된 위치나 상태를 알려주는 기능은 거의 필수적이다. 예전에 동료 한 사람이 펌웨어 프로그램에 자칭 청진기 기능이라고 하는 메모리나 기타 상태를 보여 주는 기능을 항상 넣어 놓고 프로그램을 디버그했다. 당시에는 에뮬레이터가 일반화되어 있지 않기 때문에 이런 기능을 넣어야 했다. 지금도 상황에 따라 이런 기능을 넣어야 프로그램 디버깅이 편하다. 초기에 시리얼 디바이스 초기화가 힘든 상태에서는 LED를 점멸시키거나 LED를 이용해 진행 표시를 한다. 이후 시리얼 디바이스가 초기화되면 시리얼 디바이스를 이용해 프로그램 상태나 기타 메시지를 표출한다. 또한 특정한 문자열을 입력받은 후.. 더보기
임베디드 프로그래머와 부트로더-3 저 자 : 유영창 출판일 : 2003년 10월호 == 리눅스 커널의 구동 환경 앞서 잠깐 언급했지만 임베디드 시스템에서 리눅스 커널이 원활하게 동작하기 위한 최소 조건이 있다고 했다. 물론 절대적인 것은 아니지만 필자의 현장 경험상 다음과 같은 조건은 충족돼야 한다. ◆ 32비트 프로세서 ◆ 8MB 램(일반적으로 SDRAM을 사용한다) ◆ 8MB 롬(일반적으로 플래시를 사용한다) ◆ 시리얼 포트 1개 이 정도 사양만 있어도 리눅스 커널이 동작한다. 더 이하 사양의 시스템에 리눅스 커널을 올려 동작시킬 수도 있지만 응용 프로그램이 조금만 커져도 문제가 발생하고 프로그램 작성시 상당한 주의를 요한다. 여기에 한 가지 더 조건을 붙인다면 MMU(Memory Management Unit) 즉 메모리 관리 장치의.. 더보기
임베디드 프로그래머와 부트로더-2 저 자 : 유영창 출판일 : 2003년 10월호 == 임베디드 시스템 개발자의 고민 필자가 다니는 회사의 한 개발자는 처음 배운 프로세서가 32비트 원칩 프로세서이다. 특정한 장비 개발 건으로 8비트 원칩을 다룰 일이 생겼는데 프로세서 매뉴얼을 보더니만 씨익 웃고서 “정말 간단한 구조를 가졌네요” 하는 것이다. 필자는 조금 놀랐다. 왜냐하면 예전에 8비트 원칩을 보고 매우 복잡하다는 생각을 많이 했기 때문이었다. 물론 이전에는 Z-80이나 6502 같은 좀더 단순한 프로세서만 보다가 8비트 원칩을 보았기 때문이기도 하다. 문제는 필자와 같이 기존 8비트 원칩 프로세서를 다루던 개발자들이 32비트 원칩 프로세서를 보면 매우 복잡해 보인다는 것이다. 8비트 원칩 프로세서가 다루던 4MHz와는 차원이 다르게 .. 더보기
임베디드 프로그래머와 부트로더-1 임베디드 프로그래머와 부트로더-1 저 자 : 유영창 출판일 : 2003년 10월호 필자는 이 세상에 PC라는 시스템이 나오기 전에는 임베디드 시스템이라는 구별이 따로 없었던 것으로 기억한다. 또 한 가지 ‘펌웨어’라는 단어도 별로 사용하지 않았다. 그러다가 PC가 나온 후 어느 정도 시간이 지나면서 임베디드 시스템이라는 말이 사용되기 시작했고 또한 펌웨어라는 단어를 접하게 되었다. 임베디드(embedded)를 인터넷의 야후 사전에서 찾아보면 이렇게 나온다. embed[imbd, em-] vt. (-ded; -ding) [1] 깊숙이 박다, 파묻다 [2] (마음 속 등에) 깊이 간직하다((in)) [3]【언어수학】 끼워 넣다 임베디드 시스템을 통상적으로는 내장 시스템이라고 말한다. 하지만 필자는 PC 이외.. 더보기