기존 이솝 임베디드 포럼의 지식인 서비스가 게시판 형태로 변경되었습니다.

안녕하세요. 


제 글을 읽어주셔서 감사합니다. 


질문 드릴게요. 


RESET VECTOR는 low vector일 경우 0x0 번지잖아요. 그런데 메뉴얼들 보면


ROM에서 실행하는 것이 아니고 RAM으로 복사 후 RAM을 0x0번지로 remapping 해서 사용한다고 하는데요. 


그다음에 부트로더가 커널을 호출하면 커널도 자기의 reset vector를 가지고 있잖아요. 


이 reset vector가 올라가는 주소는 ROM의 0x0번지가 아니고 RAM의 특정 주소인데 어떻게 인터럽트가


커널의 reset vector쪽부터 가서 분기가 되는지 모르겠어요. 메뉴얼 봐도 remapping이라는 용어만 나오고 예제를


못찾겠네요. ㅠㅠ그리고 remapping 된다고 해도 커널이미지가 링킹될 때 RAM의 특정주소부터 각 심볼에 주소부여가 


되는데 하드웨어가 멋대로 0x4800_0000을 0x0으로 remapping 해버리면 실행자체가 안되어야 하는거 아닌가요.


https://kldp.org/node/90351 여기 글 보시면 아래 댓글중에 ohhara 라는분께서 답을 달아주신게 있어요.


제가 사용하는 보드는 exynos4412라 커널올리는 주소가 0x4800_0000 이거든요. 


저기 kldp 댓글대로라면 0x4800_0000 이 0x0으로 맵핑이 된다는 건데 ..링커스크립트를 보면 0x4800_0000을 기준으로


bin을 생성하는데 하드웨어가 멋대로 0x4800_0000 을 0x0으로 맵핑해버리면 안되지 않나요. 


제대로 아는게 없으니까 질문이 횡설수설 하네요. 


고도리

2014.08.12 10:02:00
*.200.239.210

1. ARM의 boot process에 대해서 궁금한 듯 합니다.

2. 대부분의 궁금증은 다음과 같습니다.


왜 0x00000000 에 있는 vector부터 코드가 동작해야 하는데,

실제로는 로딩된 번지에서 코드가 돌지????


예를 들어....4412 kernel load address가 0x40008000 인데

코드가 실행되지?(왜냐하면 linker script에는 0xc0008000 이거든요)


==> 64k 코드 내에서는 label access를 통해서 코드가 동작합니다.

==> 해서 64k 코드 내에서 실제로 MMU enable과 같은 작업과 코드 relocation 작업을 끝내면 됩니다.


3. 위와 같은 상황에서 

1> low vector에서 high vector로 변경하거나

2> vector가 들어 있는 부분을 ram영역으로 옮기고 해당 ram영역을 MMU setting을 통해서 0번지로

만들어 버림 됩니다.


답이 좀 횡수가 되었네요.....



오늘 멘붕이 와서 장난 아니네요.......ㅠ.ㅠ


3.10.9 ALSA driver 참 어렵습니다....ㅠ.ㅠ


쁘앙쁘앙

2014.08.20 05:46:15
*.254.189.85

헉...몇년전부터 검색해서 찾았던 자료들에서 고도리님 닉네임 많이 봤었는데 직접 답글도 달아주시고 감사합니다 ㅠㅠ 


리눅스는 보니까 hivec을 쓰기때문에 u-boot에서 kernel로 jump하고 만나는 stext 부분이 익셉션벡터가 아닌거같아요. 저는 리눅스 커널이 올라가던 메모리 주소 0x4000_8000에 제가 만든 rtos를 올리려고 합니다. 첫 코드가 start.S에 있는 익셉션벡터의 b reset_handler 에요. u-boot에서 0x4000_8000으로 jump한 이후에 커널의 reset_handler에서 MMU조작을 해야겠죠? 아직은 프로세스별 가상메모리 없이 MMU를 사용하되 물리:가상주소를 1:1맵핑해서 쓰려고 합니다. 이 경우에 reset_handler 진입 후 0번지부터 ~ xx 번지까지 접근하려는건 익셉션일테니 그 범위로 접근할경우 그 접근하려는 주소 더하기 0x4800_0000 을 해주면 될 것 같은데 이런게 되나요. 단순히 4000_8000 을 0으로 바꿔버리면 그 이후 실행되는 코드는...link 된 주소가 안맞아서 안될 것 같은데 ㅠㅠ 

고도리

2014.08.20 20:35:53
*.200.239.210

예전에 V210에 RTOS를 올린 적이 있습니다.


거기의 reset vector 일부분 코드는 다음과 같습니다.


#if 1

enable_mmu:

    /* enable domain access */

    ldr r5, =0x0000ffff

    mcr p15, 0, r5, c3, c0, 0       @load domain access register


    /* Set the TTB register */

    ldr r0, _mmu_table_base

    ldr r1, =PHY_RAM_BASE

    ldr r2, =0xfff00000

    bic r0, r0, r2

    orr r1, r0, r1

    mcr p15, 0, r1, c2, c0, 0


    /* Enable the MMU */

mmu_on:

    mrc p15, 0, r0, c1, c0, 0

    orr r0, r0, #1

    mcr p15, 0, r0, c1, c0, 0

    nop

    nop

    nop

    nop

#endif


    /* Call main function */

    bl  main

    /* We should never reach here */

    b   .


코드가 실행된 이후에 stack들과 mode 세팅을 한 후 MMU를 enable 시켜서,

DRAM의 base(ex> 0x20000000)과 0번지를 매칭시키는 코드입니다.


이런 식으로 쓰시고.....


Linker script는 당연히 MMU가 enable 된 이후의 주소(base가 0)로 해 주시면 큰 문제없이

동작할 겁니다.


linker script를 잘 사용하시면 궂이 high vector를 사용하지 않으셔도 됩니다.

쁘앙쁘앙

2014.08.28 06:11:16
*.254.189.85

안녕하세요. 답변 감사합니다. 


지금 제 상황이 보드에서 아무런 PRINT출력이 되지 않아서(PRINT관련 함수는 UBOOT에 넣고 테스트 마침)


rtos커널의 entry 맨앞에 보드의 alive LED를 꺼버리는 코드 2줄을 넣고 zImage로 만들어서 부팅을 시도했는데요. U-boot에 built-in 핸들러상에서 테스트할때는 LED끄기가 잘 됐는데 U-boot에서 제가 올린 zImage가 지정된 영역에 잘 풀리는 메시지까지는 뜬뒤 transferring control to 0x40008000 메시지가 뜨는데 LED가 안꺼지네요. objdump로 dump파일을 보면 이미지를 올린 영역 첫 주소에 LED끄는 코드가 잘 들어가 있습니다. 링커스크립트 시작주소는 0x40008000 으로 했고요(혹시나해서 0x00000000 도 해봤으나 안됨). 리눅스 커널 이미지를 다시 올리면 부팅이 잘되는데 리눅스 커널소스의 arch/arm/mach-exynos/Makefile.boot 의 zreladdr 값은 0x40008000 맞고 Makefile 에서 zImage 만들 때 -a -e 옵션값 동일하게 0x40008000 들어가는거 확인 했거든요. 

u-boot에서 점프만 한번 했을 뿐인데 왜 코드가 동작을 안하는 것일까요 ㅠ 아 이럴줄 알았으면 JTAG인터페이스 있는 보드를 살걸 괜히 ODROID를 샀네요 뭐라도 아무거나 찍히기만 하면 일사천리 일 것 같은데 ..

쁘앙쁘앙

2014.08.29 00:49:09
*.254.189.85

아 보니까 지금 mkimage로 로드주소, 엔트리주소 전부 0x40008000으로 했는데 

zImage 압축 풀린뒤에 메모리 덤프 떠보니까 0x40008000 + 0x40 부터 코드가 들어가 있네요 ㅡ_ㅡ.훔..ARM 공식문서에 execution address는 base ram으로부터 + 0x7fc0 이라고 되어있는데...

0x40007fc0에 올리면 그대로 0x40007fc0에 올라가고 0x40008000으로 올리면 +0x40이 추가되는..

쁘앙쁘앙

2014.08.29 01:22:36
*.254.189.85

아 그냥 저렇게 되는 주소로...entry를 맞췄는데도 안되길래 ....u-boot에서 kernel로 분기하기 직전에 실행하는 

mmu off 코드를 주석처리하니까 분기해서 led끄는거 되네요...흠 이유는 잘 모르겠지만 일단 진행 

고도리

2014.08.31 22:53:47
*.111.12.170

저랑 그림 그려놓고 얘기하셔야 할 듯 하네요....^^


시간되면 함 얘기하러 오세요. 쪽지로 연락처랑 메일 보내 놓겠습니다.

실제로 작년에 a9 quad core에 rtos를 올린 적이 있기는 합니다.


실제로 rtos를 올리기 보다는 그냥 jump해서 코드 print만 나와도 가능할겁니다만...


참고로 exynos4412의 irq handler 작성하시는게 꽤 어려울겁니다.

저도 삽질한 적이 있어서요.


쁘앙쁘앙

2014.09.03 07:18:25
*.254.189.85

안녕하세요. 쪽지 주신내용은 제 폰에 잘 저장했습니다. 추석끝나고 연락 드릴게요. 

지금 printf는 putc_dev만 u-boot에서 가져다가 문자열은 찍고 있는데요. 파라미터값 출력하고 싶어서 오픈소스로 공개되어 있는 경량 printf 몇개 가져다가 붙이려고 하는데 .... 

undefined reference to `__aeabi_uidiv

이런 유형의 에러 보신적 있으신가요 혹시..

thumb 모드와 연관이 있다고도 하고...

컴파일러는 linaro에서 최신으로 받은건데...직접 해당 위치 가서 코드를 보니까 

variable_1 = variable_1 / variable_2; 일 때 저 에러가 나네요. variable = variable / 3; 과 같이 상수를 입력하면 괜찮고요...하아 .....제가 너무 귀찮게 하는게 아닌지 감사하면서도 죄송스럽습니다 ㅠ 

CFLAGS 에 -mfpu=neon -mfloat-abi=softfp 옵션은 있어요. 링킹단계에서 libgcc.a 붙여줬는데요. 이건 제가 다시 한번 확인해 볼게요. 

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

 find ./ -name "libgcc.a" | xargs grep "__aeabi_uidivmod"

Binary file ./lib/gcc/arm-linux-gnueabihf/4.9.1/libgcc.a matches

--------------
LD 명령에서 LDFLAGS를 명령줄 맨~~뒤로 보내니까 해결되네요.....뭔가 하나씩 해결 될때마다 허탈감도 같이 드는것 같아요ㅋㅋ
아 이제 undefined reference to `raise'... 찾는중...
----
bare-metal 툴체인 으로 바꾸니까 되네요...
List of Articles
번호 제목 글쓴이 날짜 조회 수
6108 멀티코어에서 각 코어는 모드별 스택주소를 공유하는게 맞나요. [2] 쁘앙쁘앙 2014-08-20 1276
6107 구글 CTS 인증 문의 드릴께요... 젤리빈 4.2.2 입니다. [2] 천동이 2014-08-14 1555
» ARM RESET VECTOR 와 Memory remapping 헷갈려요. [8] 쁘앙쁘앙 2014-08-12 2080
6105 리눅스 파일 크기가 달라요 [1] 김민욱 2014-08-12 1209
6104 Arndale octa (exynos 5420)보드 모듈 인스톨 관련 [1] 티모 2014-08-08 1431
6103 android mediaserver 만 restart어떻게 시키나요? [1] 시안 2014-08-05 1237
6102 Arndale Board용 linaro Kernel Build 방법? [1] Supsupi 2014-08-05 1528
6101 rtems 를 kvm으로 돌리려고 하는데 문제가 생겼습니다. dudu 2014-07-29 1264
6100 안드로이드폰을 이용한 CCTV 서버 및 클라이언트 구현 관련...... [2] blue0sky 2014-07-23 1558
6099 BCH Algorithm 관련 질문 [1] 주니74 2014-07-22 1438
6098 system call process 질문드립니다. [4] Supsupi 2014-07-22 1462
6097 인터럽트의 우선 순위를 바꾸려면 어떻게 하면 될까요? 혜민아빠 2014-07-17 1370
6096 CHIP ID 가 안읽어지는 경우 [3] lveritas 2014-07-15 1523
6095 키 이벤트 질문 드립니다. 하하호호하하 2014-07-15 1275
6094 sleep mode진입후 wakeup시 간혹 app가 안살아나는경우가 있는데요 [2] 문철민 2014-07-15 1547
6093 혹시 구글맵 올려보신 분 계신가요?? 천동이 2014-07-11 1305
6092 임베디드 리눅스 shutdown시에 필요한 전원 on상태의 유지시간? [2] 김민욱 2014-07-11 1663
6091 소스 분석하실때 주로 어떤 방법들을 이용하는지 알고 싶습니다. [4] Supsupi 2014-07-10 1699
6090 kikat 4.2.2 에서 surfaceflinger 초기화 하는 부분에 대해서 질문 ... [3] 시안 2014-07-08 1754
6089 dtb에 대해서 궁금합니다. [9] Supsupi 2014-07-08 1737

사용자 로그인