---------------arm-linux-gcc로 컴파일하는 ucos-ii용 링크디스크립터---------------------
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") //출력 파일 형식 지정
OUTPUT_ARCH(arm) //출력 아키텍처 지정
ENTRY(reset) //시작위치 지정 -> start_up.s 파일에 있음 reset 핸들러
SECTIONS
{
. = ALIGN(4); //“ . ”을 주소 값을 지정하기 위한 변수로 4바이트씩 묶어서 읽음.
. = 0xA0000000; //RAM의 주소가 0XA0000000 번지부터 시작이다.(하이버스에서)
__btext = .; //__btext라는 변수에 4바이트씩 묶어서 읽는 0xA0000000번지를 저장
.text : { *(.text) } //text 부분 코드를 RAM의 0xA0000000 번지부터 적재
__etext = .; //text 부분의 끝을 나타내는 __etext변수에 text의 주소 값을 넣음
. = ALIGN(4);
.rodata : { *(.rodata) } //.rodata 부분에 Read Only Data 부분을 적재, 즉 text 마지막 부분
__erodata = .; //부터 rodata를 적재, rodata의 마지막 주소를 __erodata에 저장
. = ALIGN(4);
.data : { *(.data) } //.data변수에 data부분을 저장
__edata = .; //__edata에 data부분이 저장된 마지막 주소를 저장
. = ALIGN(4);
.got : { *(.got) } //역시 마찬가지로 global offset table 이라고 들은 것 같음. 해당 부분을
__egot = .; //메모리에 적재하고, __egot 변수에 got의 마지막 주소를 저장
}
하이버스 PXA255B SA1110 메모리 컨트롤러
0x0 번지부터 32M nor Flash.
0xA0000000 번지부터 64M SDRAM.
Memory Layout
Text part -> Rodata part -> Data part -> Got part
0xA0000000 번지부터 시작( RAM 시작 번지 )
---------------------------------------------------------------------------------------
< 처음 이숍보드용 ucos를 받아 들고서 >
이숍보드용 ucos는 RVDS로 컴파일되어 있어서, 보드에 올려보고자 어둠의 경로를 통해서
RVDS 2.2를 받았지만 ZI 영역이 지원이 되지 않는 관계로 사용이 불가 하다하여,
RVDS 3.0 버젼으로 다시 다운 받았지만, 라이센스를 구하지 못해서 gcc를 이용하여고 컴파일
하려고 보니, 링크 디스크립터와 보드 초기화 해주는 부분이 없었습니다.
그래서 ucos의 flash.scat, ram.scat 파일이 링크디스크립터와 비슷하게 생기긴 했고,
init.s와 vectors.s 파일이 start_up.s 파일과 비슷하였지만, 보드 초기화 부분이 없었습니다.
그리고 링크 디스크립터의 내용도 두개로 나누어져 있으며, 플레시와 램을 따로 적재하는
부분등 무언가 길이 보이지 않았습니다. 제가 공부한 부분 부터 보여드리겠습니다.
----------------< flash.scat 파일의 내용 >----------------------------------
이 scatterloading descriptor file이 정의하는 내용 : 1개의 로드 영역(ROM_LOAD)과 5개의 실행영역(ROM_EXEC, RAM, HEAP, STACK, UART0).
모든 프로그램(코드와 데이터)는 ROM의 ROM_LOAD영역에 놓은다.
Read Only(RO) code는 ROM_EXEC으로 부터 수행될 것이다. 그리고 그것은 실행 주소(0x0)은 로딩 주소(0x0)와 같다, 그래서 옴겨질 필요가 없다.
exception vector table은 반드시 0x0번지에 나타나야 한다. 그래서 이미지의 처음에 위치했다.
Read Write data는 ROM_LOAD영역에서 RAM에 0x28000000번지로 옴겨질(복사될) 것이다.
ZI data는 RAM에 만들어(초기화 되어) 질 것이다. RW data위에,
HEAPS 영역은 ZI코드 바로위를 heap의 끝으로하여 위치해있다. 그리고 heap은 그 주소부터 커져간다.
STACKS 영역은 각 모드의 스택을 저장하기 위해서 사용되는 메모리의 꼭대기를 위치시키기 위해서 사용된다.
stack들은 이 주소부터 아래로 자란다.
UART0 역역은 UART0 레지스터들의 위치를 mapping 시키기 위해서 사용된다.
UNINIT이라고 표시된 영역들은 초기화 되지 않고 남겨질 것이다. 즉, 시작할때, 영역들은 0으로 초기화 되지 않을 것이다.
FLASH 0x24000000 0x40000000
{
FLASH 0x24000000 0x4000000
{
init.o (INIT, +First)
* (+RO)
}
32bitRAM 0x0000 0x0003BFFF
{
vectors.o (VECT, +First)
* (+RW, +ZI)
}
ARM_LIB_HEAP 0x0003C000 EMPTY 0x00004000-0x00002000 {}
ARM_LIB_STACK 0x00040000 EMPTY -0x00002000 {}
}
링크 디스크립터와 같은 용도로 보인다.
코드를 flash와 ram영역으로 나누어서 메모리에 적재 된다.
RO 코드는 flash에, RW, ZI 데이터는 ram에 적재된다.
FLASH Memory Layout
RO code -> . . .
RAM Memory Layout
RW code . . . -> ZI code . . . -> Heap-area . . . -> Stack-area . . .
이런 순서로 되어있는 것 같다.
--------------------------< ram.scat 파일 내용 >-----------------------------------
설명은 위와 동일
32bitRAM 0x0200 0x0003BFFF
{
32bitRAM 0x0200 0x0003BFFF
{
vectors.o (VECT, +First)
* (+RO)
* (+RW, +ZI)
}
ARM_LIB_HEAP 0x0003C000 EMPTY 0x00004000-0x00002000 {}
ARM_LIB_STACK 0x00040000 EMPTY -0x00002000 {}
}
RAM Memory Layout
RO code . . . -> RW code . . . -> ZI code . . . -> Heap-area . . . . . . STACK-area <-
----------------------------------------------------------------------------------
< 고도리님의 조언을 받고 나서 >
일단은 이숍용 ucos가 u-boot위에 올라가기 때문에 보드 초기화 부분이 없다는 설명을 들었습니다.
그리고 설계 방식이 두가지가 있는데,
1. u-boot에 ucos을 올리는 방법
2. ucos에 보드 초기화 루틴을 집어 넣는 방법.
제가 처음에는 첫번째 방식으로 계획을 잡고, 찾아보니 링크디스크립터와 start_up.s(보드초기화 하는 부분)이 없었습니다.
그래서 직접 작성하려 해보았지만 하이버스는 nor형 플레시인데 이숍보드는 nand형 플레시이기 때문에 어떻게 설계를 해야 하는지
어떤 부분을 참고해서 작성을 해야할지 막막했습니다.
저의 처음 계획은 하이버스의 링크디스크립터를 가져와서 그냥 사용하고, 이숍보드용 init.s와 vectors.s 파일과 하이버스용 start_up.s파일을 비교해서
없는 보드 초기화 부분을 u-boot에서 찾아서 넣으려 했습니다.
링크디스크립터는 어떤 부류의 코드를 어떤 메모리부터 어떤 순서로 적재를 시킬지를 결정하는 파일인데,
플레시 메모리의 형태가 다른데 그대로 사용해도 되는지?
보드 초기화 하는 부분을 보기위해서 cpu.s , lowlevel~.s , start.s부분을 보아도 하이버스의 start_up.s에 없는 부분이 있어서
보드가 다르니까 초기화 하는 부분이 다른것이라는 생각에 이숍보드는 어떤 부분을 초기화 해줘야하는지 그리고 초기화 하기위해서 어떤
자료를 참고해야하는지를 알고 싶습니다.
아참, 고수님들이라면 위에 2가지 설계방식중 어떤 방식을 선택하실 건가요?
그리고 선택하셨다면 어떤 부분을 어떤 자료를 보고 어떻게 작성하면 좋을까요?
제가 공부한 내용과 질문내용을 두서없이 올리다보니 질문이 길어 졌내요..
아참 혹시 저도 소모임에 참여할 수는 없을 까요?
대부분 ppc와 아트메가 였습니다 그중에 LPC용 하나를 찾았지만
제가 이렇게 해보면 되겠다는 느낌을 주지는 못했습니다.
꼭 슈더 코드 처럼 작성이 되어 있는거라..
그런 것이라도 만약 필요한분 있으시면
답글달아 주시구요..
아무튼 지식을 나누어 주시는 고수님들 감사합니다. ^^;