도와주세요!!
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
이와 같이 스택영역의 시작주소가 스택 메모리영역의 시작 주소를 가리키고 있는데,
원래 초기 스택메모리 주소 지정시 스택 메모리영역의 끝 주소를 가리켜야 되지 않는지에 대해
자세히 알려주시면 감사하겠습니다.
//-------------------------------------------
// 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 영역 시작 주소 아래에 정의 되어 있었으며,
여기는 부트로드 프로그램이 들어가는 영역이라고 생각되어 수정하였습니다.
여기서 혹시 잘못된 부분이 있으면 자세히 알려주시면 정말 감사하겠습니다.
arm 뿐만 아니라 다른 코아들도 이렇게 하겠죠
위의 코드를 7년전 쯤에 작성하였는는 이때는 감소인지 증가인지 알지 못한상태여서 실행에 지장이 없을정도의
메모리 주소에 스텍을 지정하여 사용한 것입니다.