logo
한국어 Select Language
FF 포럼
포럼지기에게 한 마디
공지사항
뉴스 EZ보드 통합 메뉴얼
FA-VUS 개발환경 !강추! 타켓보드 부팅-HyperTerminal 타켓보드 부팅-Tutty 타켓보드 부팅-minicom Windows환경-타겟 Linux 구동 Linux환경-타겟 Linux 구동 개발 시스템 구축 유형 페도라 설치 CentOS 설치 크로스 컴파일러 설치 TFTP 환경 구축 NFS 파일 시스템 구축 삼바 서버 구축 부트로더 부트로더 쓰기 커널 이미지 제작 및 설치 램디스크 이미지 제작 및 설치
임베디드 제품 사용기 오늘의 영어 휴게실 Appliance
강좌 & 팁
강좌 & 팁 EZ-보드 그래픽 & 멀티미디어 네트워크 프로그래밍 디바이스 드라이버 ImJa 솔루션 임베디드 FLEX 안드로이드 iOS 개발 FAIDE 하드웨어 C/C++ go언어 GNU C 레퍼런스 메뉴얼 ARM 루아 응용 프로젝트 이클립스 지그비 개발자 노트 권장도서 FPGA
VIVADO DSP HSIO Logic Zynq
함수설명
C 라이브러리 함수 커널 API 그래픽 라이브러리 - gxLib
자료실
자료실 FALINUX SDK ARM PC-V210 S3C6410
G100-S3C6410 S100-S3C6410 C221-S3C6410 N200-S3C6410 EZ-S3C6410
S5PV210
G100-S5PV210 S100-S5PV210 N200-S5PV210 C221-S5PV210
EZ-S3C2440 EZ-PXA270 EZ-X5 EZ-S2410 Auto Package
도와주세요
FAQ 도와주세요

  • 회원가입
  • ID/PW 찾기
 
  1. FAQ

  2. 도와주세요


최근 글

  • [특판][성Y인Y용Y품][...
  • 요즘 잘 나가는,,,
  • 요즘은 vmware 말고 ...
  • [docker] buildx 를 ...
  • buildroot 사용 관련
  • GPIO 제어 방법 문의 [1]
  • 임베디드 리눅스 개발...
  • make wandboard_quad ...
  • LCD 초기화 코드 좀 ... [1]
  • 임베디드 리눅스 커널...

최근 댓글

  • 오래 전에 해결법을 터득해서 ...
  • 비트 코인으로 작업하는 것은 ...
  • 10년차 임베 엔지니어 입니다. ...
  • 임베디드쪽이라면 SOC 쪽 displ...
  • 그렇군요 제가 질문이 잘못됬었...
  • 취준생으로서 포트폴리오를 만...
  • 제가 현재 취업준비생입니다. ...
  • 에프에이리눅스 보드는 아래 링...
  • 전체
  • 일반
  • X5
  • S2410
  • ESP-NS
  • S3C2440
  • EP9312
  • 구매
  • 기타

일반 [re] start.s에서 의문점이 있어서 문의드립니다.

2005.12.19 23:25

wizardcori 조회 수:8664


>안녕하세요..부트로더를 분석하다가 이해가 안되는 부분이 있어서 이렇게 질문을 올립니다.
>ez_m01부트로더 start.s에서
>bl        MemClear
>bl        LoaderRamCopy
>이부분에서 부트코드를  램에 다운로드 시킵니다.그런데
>ldr        r0, =EZ_M01_RAM_BOOT
>add        r0, r0, #0x400
>mov        pc, r0
>이부분에서 0x400을 더해주는데 start.o파일은 용량이 1킬로바이트가 넘는데,
>0x400이상을 더해주는게 맞는거 같은데..그런데 코드나 스크립트 파일을 보면은
>0x400을 더해주어서 main으로 가게 되있습니다.
>그러면 start코드 영역하고 main하고 겹쳐지지 않나 생각이 듭니다.
>왜 여기서 0x400을 더해주는지 알고 싶습니다.


0x400 = 1024 = 1k
0x800 = 2048 = 2k

부트로더에서 start.s -> start.o -> start.org

마지막 start.org 의 크기에 따라서 1k보다 작으면 0x400, 2k보다 작으면 0x800 아닐까요

start.org 가 1k보다 큰데도 0x400 오프셋을 적용햇다면  에러가 날것같고요

예전에 작은 start.org를 가지고 작업할때 썻던 오프셋이 아닐까 추측해봅니다.


인용 < 부트로더의 기본구현 1 - 유영창 > 중에서 발췌

어셈블러 구현 루틴과 C 함수 구현 루틴의 차이
부트로더를 어떤 언어로 구현하는가는 프로그래머가 어떤 언어를 더 자유롭게 구현하는가에 달린 문제이다. 꼭 C 언어로 부트로더를 구현할 이유는 없다. 하지만 부트로더를 C 언어로 구현하면 어느 정도 아키텍처에 의존적인 부분을 줄여서 작성할 수 있다. 필자는 ARM에서 사용한 부트로더인 ‘이지부트’를 i386EX에도 적용한 적이 있다. 이때 ARM에서 사용된 C로 작성된 부분 중 초기화 부분 이외에는 그대로 사용이 가능했다.
초기에 부트로더를 만들기 위해서는 다른 부트로더의 소스에서 루틴을 가져오거나 커널 소스에 있는 루틴을 가져오게 된다. 이렇게 다른 소스를 가져와 사용할 때는 아무래도 어셈블러보다 C 언어가 유리하다. 결국 C 언어로 부트로더를 작성하는 것이 여러모로 유리하기 때문에 대부분의 공개된 부트로더는 C 언어로 사용된다. 그런데 C 언어는 함수 호출 구조상 스택(stack)이라는 것이 필요하다. 그러나 스택은 롬 시스템에서는 원초적으로 사용이 불가능하다. 따라서 C 언어로 작성된 프로그램은 램에서 동작하여야 한다. 부트로더는 이런 언어적인 차이도 롬으로 동작하는 것과 램에서 동작하는 것으로 나누어야 하는 이유가 된다.
이런 이유로 EZ-X5에서 동작하는 이지부트 프로그램은 start 프로그램과 main 프로그램으로 나누어져 있다. start 프로그램은 어셈블러로 작성되어 있고 아주 기초적인 부분을 수행한다. main은 C 언어로 작성되어 있고 start 프로그램에서 구현한 것 외의 나머지 대부분을 구현한다. 각각 만들어진 두 개의 프로그램 소스는 컴파일되고 실행 이미지가 따로 만들어진다. 이후에 하나의 이미지로 합쳐져 플래시 롬에 써넣게 된다. 이렇게 합쳐진 프로그램 중에서 리셋 후에 처음 동작하는 것을 이지부트에서는 start란 프로그램이 담당하고, 스택이 설정되어 C 함수 호출이 가능한 램 공간에서 수행되는 대부분의 작업은 main 프로그램이 담당한다.
이지부트가 어떻게 동작하는지 <그림 1>을 가지고 설명하겠다. 그림에서 보듯이 EZ-X5의 플래시 롬은 0x00000000에 위치한다. start 프로그램은 2KB 이내로 매우 작은 크기를 갖고 있다. main 프로그램은 그 나머지를 차지한다. 플래시 롬에는 이 두 개의 프로그램이 연속되어 있는 하나의 이미지로 만들어져 배치된다. 이 이미지는 리셋 후 start 프로그램에 의해서 <그림 1>의 (1)에서 보듯이 램의 0xA0F00000에 그대로 복사된다. 램은 0xA000000부터 시작하는데 나중에 배치되는 커널을 고려해서 램의 뒤쪽에 부트로더를 둔다.


<그림 1> 이지부트의 동작 방식

main 프로그램은 수행 시작 위치가 0xA0F00800로 고정된다. 이 위치는 램에 같이 복사된 2KB를 차지하는 start 이미지 바로 뒤쪽이다(예전에 어떤 사람이 필자에게 2KB를 제외한 크기를 램에서 복사하지 않는가 물어본 적이 있다. 하지만 이렇게 하는 특별한 이유가 있는 것은 아니다. 단지 필자가 게으르기 때문인데, 2KB를 제외하면 실제 크기를 계산해서 프로그래밍해야 하지만 그대로 하는 것이 정신건강(?)에 유리하기 때문이다). 부트로더는 부팅이 끝나면 그대로 사라지는 프로그램이기 때문에 부득이 램의 크기가 작은 시스템이 아니라면 굳이 메모리를 아낄 필요는 없다.
롬에서 동작하는 start 프로그램은 초기화를 마치고 main으로 이동해야 하는데 두 프로그램은 같은 프로그램이 아니기 때문에 소스상의 심볼릭 참조가 불가능하다. 즉 소스에서 어떤 함수로 이동하라는 식의 기술이 곤란하다. 그래서 절대 위치로 이동하는 명령을 사용하는데 이동 위치가 <그림 1>의 (2)와 같이 0xA0F00800이 된다.

이 게시물을
  • Twitter
  • Facebook
  • Delicious
수정 삭제 목록

댓글 0

목록
번호 제목 글쓴이 날짜 조회 수
공지 포럼의 메뉴가 보이지 않아요! 장길석 2014.02.06 957636
공지 [중요 공지]제품 사용 및 기술 문의는 전화 상담을 받지 않습니다. 장길석 2012.11.09 1408531
공지 답글에 대한 공지 사항. falinux 2006.11.20 2424024
15341 [특판][성Y인Y용Y품][비아][시알][여성흥분제] 전부 1+1 vv8282.top 지금 확인해보세요~! dde33 2026.10.15 2
15340 요즘 잘 나가는,,, dde33 2026.09.12 843
15339 buildroot 사용 관련 로즈마리 2021.02.01 38166
15338 GPIO 제어 방법 문의 [1] 단순최고 2021.01.25 51084
15337 임베디드 리눅스 개발 보드 추천 nam 2019.12.06 48863
15336 make wandboard_quad 실행시 문제 gasi 2019.08.27 47084
15335 LCD 초기화 코드 좀 봐주세요 [1] 김용수 2019.07.12 63136
15334 임베디드 리눅스 커널 소스에 관해 질문드립니다 ! ekthatkxkd 2019.06.28 43727
15333 numpy,scipy 를 arm-linux-XXXX 로 크로스컴파일 하여 올릴수 있나요? 초보자 2019.06.24 49287
15332 I2C - deal with arbitration loss 오류가 궁금합니다. [1] S1eepingBeauty 2018.12.10 56770
15331 구형 EM-PXA270 보드 혹시 보유하시분 연락 주시면 감사드릴께요. file 존 2018.11.24 42753
15330 리눅스 GPIO 관련 센서의 단선 또는 고장유무 판별법이 궁금합니다. [2] S1eepingBeauty 2018.11.12 55125
15329 임베디드 리눅스에서 c 언어 디버깅 궁금합니다. [1] 존 2018.09.14 47072
15328 부팅 시간 문의 [1] nam 2018.06.29 45791
15327 localport? port? 검은고래 2018.06.29 39959
15326 fork()의 thread 멈추는 현상 [4] HwangRoy 2018.05.09 58614
15325 임베디드 리눅스 습득용 보드 판매하시나요? 임베디드초급자 2018.04.27 39719
15324 (도와주세요)네트워크 디바이스 드라이버 수정문제입니다. [1] Chanmini 2018.03.04 43600
15323 Ez x5 구합니다!! khobaik 2018.01.26 38315
15322 실행중 symbol not found 를 발생시키는 u-boot 본적 있으신가요 ? sayyouandme 2017.12.17 57348
첫 페이지 1 2 3 4 5 6 7 8 9 10 끝 페이지
쓰기
태그
부탁드립니다. ^^
  • 글을 작성하시려면 회원으로 가입하시고 로그인 하셔야 합니다.
  • 회원 가입은 주민등록번호가 필요 없으며, 메일 주소만 있으면 간단하게 가입하실 수 있습니다.
  • 본 포럼에 등록된 모든 글의 저작권은 작성하신 분께 있으며, 저작자의 허락 없이 다른 곳에 펌이나 도용하시면 안 됩니다.
  • 또한, 전자우편 수집 프로그램이나 그 밖의 기술적 장치를 이용하여 무단으로 이메일 주소 및 자료 수집되는 것을 거부하며,
  • 이를 위반 시 정보통신망 법에 의해 형사 처벌됨을 유념하시기 바랍니다.
  • FF 포럼
  • 강좌 & 팁
  • 함수설명
  • 자료실
  • 도와주세요