제가 지금 비글보드에 조그마한 os를 만들어서 포팅하는데요
궁금한 점이 swi를 실행하면 exception vector table로 분기하지 않습니까?
그 곳의 위치는 u-boot의 start.S 부분이라고 알고 있는데요.
.globl _start
_start: b reset
ldr pc, _undefined_instruction
ldr pc, _software_interrupt
ldr pc, _prefetch_abort
ldr pc, _data_abort
ldr pc, _not_used
ldr pc, _irq
ldr pc, _fiq
_undefined_instruction: .word undefined_instruction
_software_interrupt: ldr pc, =0x80008008
_prefetch_abort: .wort prefetch_abort
_data_abort: .word data_abort
_not_used: .word not_used
_software_interrupt
ldr pc, =0x80008008 이 부분은 제가 바꾼 부분이긴한데요
여기서 제가 궁금한 점은 두 가지 입니다.
swi 발생 시에 제가 생각하는 u-boot의 start.S로 분기 하는 것이 맞나요?
하나는 제가 여러 참고 자료들을 보면 이 위치는 0x00000008(exception vector table((0x00000000) + vector table offset swi(0x8))
이 위치라는데 이 위치가 맞나요?
objdump를 보면 u-boot의 start.S 의 위치는 0x80e80000 이라는데...
제가 안고 있는 문제점은 swi를 처리 하려고 하여도 정확히 어디로 어느 번지로 분기 하는지 몰라서 이렇게 글 올려봅니다. 답변 해주셨으면 감사합니다.^^ 틀린 답이라도 읽다보면 힌트가 될 수 있을 거라 생각합니다
댓글 5
-
백창우
2013.12.26 20:46
-
wkylast
2013.12.27 11:13
감사합니다^~^
-
맥주
2013.12.30 16:33
음 주소를 바로 지정 할 수도 있군요.
-
맥주
2013.12.30 16:25
과거에 분석된 내용이라서 맞지 않을 수도 있습니다. 비글보드는 최신(?) Cortex A-8 이네요.
어떤 OS가 올라간 상태인지 모르기 때문에, Linux 를 기반으로 말씀드리면, cp15, control register의 v bit가 set되면,
high vector(0xffff0000) 를 사용합니다. high vector를 사용하는 이유는 0 번지는 보통 느린 디바이스(NAND)이며, 수정이 불가능 한 영역이기 때문입니다. high vector에는 arch/arm/kernel/entry-armv.S ( exception vectors table)의 내용이 들어 갑니다.
말씀 드리고 싶은 사항은 OS가 초기시 이런 것들을 설정 하기 때문에 0 번지로 매팅되지 않을 가능성이 있기 때문입니다.
-
백창우
2013.12.31 04:37
리눅스가 아닌 본인이 만드는 OS라 cp15 설정이 없었을 것이기 때문에 0x0번지가 맞습니다.
.
swi 발생 시에 제가 생각하는 u-boot의 start.S로 분기 하는 것이 맞나요?
- 따로 설정한게 없으면 맞습니다.
하나는 제가 여러 참고 자료들을 보면 이 위치는 0x00000008(exception vector table((0x00000000) + vector table offset swi(0x8))이 위치라는데 이 위치가 맞나요?
- 맞기도 하고 아니기도 합니다.
하위버전 arm processor는 exception vector을 0x0 번지에 부팅중 복사를 합니다.
그러면 그주소가 맞고요.
상위버전 arm processor는 아래와 같은 형식을 vbar을 설정합니다.
ldr r0,=except_vec_start
mcr p15, 0, r0, c12, c0, 0
그러면 0x08 번지를 사용하는게 아니게 되죠.