S3C2440 부트로드 start.S 파일내에 스택영역지정에 대한 문의
2008.12.15 21:36
memory_map.h 파일에서
//-----------------------------------------------------------------------------
// S3C2440 physical
//-----------------------------------------------------------------------------
#define CS0_PHYS 0x00000000
#define CS1_PHYS 0x08000000
#define CS2_PHYS 0x10000000
#define CS3_PHYS 0x18000000
#define CS4_PHYS 0x20000000
#define CS5_PHYS 0x28000000
#define CS6_PHYS 0x30000000
#define CS7_PHYS 0x38000000
#define DRAM_START (CS6_PHYS)
#define BOOT_START (DRAM_START + 0x00F00000)
#define BOOT_IRQ (DRAM_START + 0x00F01000)
#define BOOT_MAIN (DRAM_START + 0x00F01008)
#define BOOT_STACK (DRAM_START + 0x00F80000)
#define BOOT_WORK_START (DRAM_START + 0x01000000) // 일반적인 부트 로더 작업 영역
#define BOOT_SIZE (128*1024) // 부트영역의 크기
#define KERNEL_START (DRAM_START + 0x00008000) // 램에서 커널 시작 어드레스
#define RAMDISK_START (DRAM_START + 0x00800000) // 램에서 램디스크 시작 어드레스
#define LOGO_START (DRAM_START + 0x02000000) // 램에서 부트로고 시작 어드레스
#define INITRD_RAMDISK_START "0x30800000"
#define KERNEL_PARAM (DRAM_START) // 부트로더에서 커널로 전달하는 영역 시작 어드레스
위와 같이 메모리 주소가 정의되어 있었습니다.
그리고, start.S 파일의 87번째 줄에 보시면
//-------------------------------------------
//
// 나중에 C로 점프할 경우를 대비하여 스택을 설정한다.
//
//-------------------------------------------
//-------------------------------------------
// IRQ/FIQ 를 디스에이블 시키고 IRQ 모드로 전환한다.
//-------------------------------------------
mrs r0, CPSR
bic r0, r0, #0x1F
orr r0, r0, #( ARM_MODE_IRQ | IRQ_DISABLE | FIRQ_DISABLE )
msr CPSR_c, r0
//-------------------------------------------
// IRQ 스택을 설정한다.
//-------------------------------------------
ldr r1, =BOOT_STACK
sub sp, r1, #0x04
//-------------------------------------------
// IRQ/FIQ 를 디스에이블 시키고 수퍼바이저 모드로 전환한다.
//-------------------------------------------
mrs r0, CPSR
bic r0, r0, #0x1F
orr r0, r0, #( ARM_MODE_SVC | IRQ_DISABLE | FIRQ_DISABLE )
msr CPSR_c, r0
//-------------------------------------------
// 수퍼바이저 스택을 설정한다.
//-------------------------------------------
sub r1, r1, #IRQ_STACK_SIZE
mov sp,r1
nop
nop
nop
이와 같이 스택영역의 시작주소가 스택 메모리영역의 시작 주소를 가리키고 있는데,
원래 초기 스택메모리 주소 지정시 스택 메모리영역의 끝 주소를 가리켜야 되지 않는지에 대해
자세히 알려주시면 감사하겠습니다.
댓글 3
-
오재경
2008.12.16 04:20
-
둘리
2008.12.16 07:27
//-------------------------------------------
// IRQ/FIQ 를 디스에이블 시키고 IRQ 모드로 전환한다.
//-------------------------------------------
mrs r0, CPSR
bic r0, r0, #0x1F
orr r0, r0, #( ARM_MODE_IRQ | IRQ_DISABLE | FIRQ_DISABLE )
msr CPSR_c, r0//-------------------------------------------
// IRQ 스택을 설정한다.
//-------------------------------------------
//ldr r1, =BOOT_STACK
//sub sp, r1, #0x04
ldr r1, =BOOT_WORK_START // BOOT_STACK 영역끝 다음 위치인 BOOT_WORK_START 영역 시작 주소를 r1 에 저장
sub sp, r1, #0x04 // BOOT_STACK 영역끝 주소를 IRQ 스택 시작 주소 지정
//-------------------------------------------
// IRQ/FIQ 를 디스에이블 시키고 수퍼바이저 모드로 전환한다.
//-------------------------------------------
mrs r0, CPSR
bic r0, r0, #0x1F
orr r0, r0, #( ARM_MODE_SVC | IRQ_DISABLE | FIRQ_DISABLE )
msr CPSR_c, r0
//-------------------------------------------
// 수퍼바이저 스택을 설정한다.
//-------------------------------------------
//sub r1, r1, #IRQ_STACK_SIZE
//mov sp,r1
sub sp, r1, #0x400 // IRQ 스택 크기 128 kbyte 만큼 아래쪽에 슈퍼바이저 스택 시작 주소 지정
이와 같이 수정한 이유는 BOOT_STACK 영역 시작 주소 부터 BOOT_WORK_START 영역 시작 주소 사이 영역(512kbyte)이
스택을 설정하는 영역이라는 생각이 들었으며, 스택은 Decrement 스택을 사용한다는 가정하에 이와 같이 수정하였습니다.
또, 기존 부트로드 소스에 있는 스택 주소지정이 BOOT_STACK 영역 시작 주소 아래에 정의 되어 있었으며,
여기는 부트로드 프로그램이 들어가는 영역이라고 생각되어 수정하였습니다.
여기서 혹시 잘못된 부분이 있으면 자세히 알려주시면 정말 감사하겠습니다. -
오재경
2008.12.16 17:54
스텍을 잡는 부분의 유불리를 판단하기는 어렵습니다.
arm 구조상 슈퍼바이져 모드와 irq 모드의 sp 는 동일하지 않습니다.
irq 모드일때 따로 레지스터를 도피하지 않아도 되구요
함수의 호출일 경우만 스텍 포인터가 역할을 합니다.
"둘리"님의 정확한 의도를 몰라 답변이 됬는지 모르겠네요 ^^




arm 뿐만 아니라 다른 코아들도 이렇게 하겠죠
위의 코드를 7년전 쯤에 작성하였는는 이때는 감소인지 증가인지 알지 못한상태여서 실행에 지장이 없을정도의
메모리 주소에 스텍을 지정하여 사용한 것입니다.