도와주세요!!
글 수 15,339
2002.12.27 16:28:32 (*.212.115.47)
6695
[질문 1]
1 : normal_boot:
2 : /* check the first 1MB of BLOB_START in increments of 4k */
3 : mov r7, #0x1000c /* 0x1000 : 4 KByte */
4 : mov r6, r7, lsl #8 /* r7,lsl #8 : r7의 값을 좌측으로 8번 shift .
즉, 1 MByte */
5 : ldr r5, BLOB_START /* BLOB_START : 메인 메모리 시작 번지. */
6 :
7 :
8 : mem_test_loop:
9 : mov r0, r5 /* r0 에 메인 메모리 시작 번지 mov */
10 : bl testram /* 메모리 테스트 루틴 */
11 : teq r0, #1 /* 메모리가 존재하면, r0=0 이다. 메모리 존재한다 가정
*/
12 : beq badram /* 당연히 건너뛴다. */
13 :
14 : add r5, r5, r7 /* r5 = r5 + r7 즉, 메인 메모리 시작 주소에서 루틴
돌면서, 4k를 더한다. 즉 어드레스는 4k단위로 증가*/
15 : subs r6, r6, r7 /* r6 = r6 - r7 */
16 :
17 : bne mem_test_loop
/* 위의 tep r0, #1 에서 ZERO flag를 셋하는데, 만약 메모리가 존재하면,
*/
/* 결국은 ZERO flag = 1 이 될것이고, bne 는 ZERO flag 가 1 이므로 점프하
게 된다. */
/* 즉, 메모리 테스트를 다시 하게 된다. */
이 소스는 blob 에서 start.s 의 부분 입니다.
대강 이해는 가는데요 (혹시 주석중에 잘못된 것이 있다면 빨간펜 해주세요
^^;;)
결국은 메모리 시작 번지를 주고 그 번지에 데이터를 썼다가 읽어서 올바른
지 체크 하는거 같은데요,
r6의 용도를 모르겠습니다. 정확히 말하자면, 시작 번지를 주고 메모리 주소
를 4k 단위로 증가하면서 테스트 하는거 같은데,
어드레스 어디까지 테스트 하는지 나오지 않은거 같아요..
제가 이부분이 이해가 가질 않습니다.
[질문 2]
relocate:
adr r0, _start
/* relocate the second stage loader */
add r2, r0, #(64 * 1024) /* blob maximum size is 64kB
*/
add r0, r0, #0x400 /* skip first 1024
bytes */
ldr r1, BLOB_START
/* r0 = source address
* r1 = target address
* r2 = source end address
*/
이 부분도 start.s 에서 나오는 부분인데요, 주석에 보면 1kbyte 를 skip 한
다고 나와있는데여... 왜..skip 하는 건가요???
답변 부탁드립니다.
1 : normal_boot:
2 : /* check the first 1MB of BLOB_START in increments of 4k */
3 : mov r7, #0x1000c /* 0x1000 : 4 KByte */
4 : mov r6, r7, lsl #8 /* r7,lsl #8 : r7의 값을 좌측으로 8번 shift .
즉, 1 MByte */
5 : ldr r5, BLOB_START /* BLOB_START : 메인 메모리 시작 번지. */
6 :
7 :
8 : mem_test_loop:
9 : mov r0, r5 /* r0 에 메인 메모리 시작 번지 mov */
10 : bl testram /* 메모리 테스트 루틴 */
11 : teq r0, #1 /* 메모리가 존재하면, r0=0 이다. 메모리 존재한다 가정
*/
12 : beq badram /* 당연히 건너뛴다. */
13 :
14 : add r5, r5, r7 /* r5 = r5 + r7 즉, 메인 메모리 시작 주소에서 루틴
돌면서, 4k를 더한다. 즉 어드레스는 4k단위로 증가*/
15 : subs r6, r6, r7 /* r6 = r6 - r7 */
16 :
17 : bne mem_test_loop
/* 위의 tep r0, #1 에서 ZERO flag를 셋하는데, 만약 메모리가 존재하면,
*/
/* 결국은 ZERO flag = 1 이 될것이고, bne 는 ZERO flag 가 1 이므로 점프하
게 된다. */
/* 즉, 메모리 테스트를 다시 하게 된다. */
이 소스는 blob 에서 start.s 의 부분 입니다.
대강 이해는 가는데요 (혹시 주석중에 잘못된 것이 있다면 빨간펜 해주세요
^^;;)
결국은 메모리 시작 번지를 주고 그 번지에 데이터를 썼다가 읽어서 올바른
지 체크 하는거 같은데요,
r6의 용도를 모르겠습니다. 정확히 말하자면, 시작 번지를 주고 메모리 주소
를 4k 단위로 증가하면서 테스트 하는거 같은데,
어드레스 어디까지 테스트 하는지 나오지 않은거 같아요..
제가 이부분이 이해가 가질 않습니다.
[질문 2]
relocate:
adr r0, _start
/* relocate the second stage loader */
add r2, r0, #(64 * 1024) /* blob maximum size is 64kB
*/
add r0, r0, #0x400 /* skip first 1024
bytes */
ldr r1, BLOB_START
/* r0 = source address
* r1 = target address
* r2 = source end address
*/
이 부분도 start.s 에서 나오는 부분인데요, 주석에 보면 1kbyte 를 skip 한
다고 나와있는데여... 왜..skip 하는 건가요???
답변 부탁드립니다.