집으로 가는 길에 마지막에 막힌 부분을 휴대폰으로 찾아보다가 이해한 부분을 적었습니다.

잘못된 부분 지적 부탁드립니다.

 

1. cmp, ***cc

 

ARM Compiler toolchain

http://infocenter.arm.com/help/topic/com.arm.doc.dui0473c/dui0473c_using_the_arm_assembler.pdf

 

6.4 절 Updates to the ALU status flags 의 중간정도에 있는 A carry occurs 부분
subtraction 의 결과가 양수 또는 0 (op1 >= op2) 일 경우 C플래그 1

 

6.5 절 Condition code suffixes 에 CC 접미사에 대한 내용이 있습니다.
C플래그가 0일 경우 (op1 < op2) 수행

 

2. 안전하게 캐시 사용하는 코드

 

[원코드]

mov r0, pc
cmp r0, r4
ldrcc r0, LC0+32
addcc r0, r0, pc
cmpcc r4, r0
orrcc r4, r4, #1 @ remember we skipped cache_on
blcs cache_on

 

[변형코드 및 주석]

// cache_on 을 수행하면 PTE 영역 (r4 - PTE 크기 ~ r4) 이 초기화 된다.
// 그러므로, 현재 수행중인 zImage 영역의 앞으로 수행될 코드와 DTB 영역이 PTE 와 겹칠 경우 cache_on 을 보류한다.

// PC 는 현재 수행중인 zImage 영역 내부에 위치
// PTE 영역은 r4 보다 앞

r0 = pc
if (r0 < r4) {
  r0 = LC0 + 32 + pc // LC0 + 32 : _end - restart + 16384 + 1024 * 1024

                             //                 = zImage 크기 (_end - restart) + DTB 최대크기 (1MB) + PTE 크기 (16384)
  if (r4 < r0) { // zImage 크기 + DTB 최대크기 (1MB) > r4 - PTE 크기 (16384)
    r4 |= 1; // zImage + DTB 영역을 침범할 가능성이 있으므로 cache 를 보류, 1비트를 set 하여 cache 유보를 표시
  } else { // zImage 와 DTB 영역이 PTE 보다 앞이다.
    goto cache_on
  }
} else { // 앞으로 수행할 코드와 DTB 이 PTE 보다 뒤이다.
  goto cache_on
}

 

 

p.s: 금일 마지막에 참조한 링크에서 빨간색 화살표 안의 비교문은

위의 것은 첫번째 비교(cmp) 의 조건, 아래는 두번째 비교(cmpcc) 의 조건입니다.

 

그림에서 좌측 상단 zImage 그림은 첫 cmp 에서 안전하다고 판단되어

이후 ***cc 명령어는 다 무시하고 cache_on 으로 branch 됩니다. (blcs 는 C플래그가 1 일때 branch)

하단 zImage 는 첫 cmp 에서 C플래그가 0가 되어 이후 ***cc 가 수행이 될 경우중

cmpcc 이후 C플래그가 1 일 경우의 상황입니다.

 

번호 제목 글쓴이 날짜 조회 수
공지 [공지] 커널 스터디 관련 Q&A 게시판 입니다. [5] woos 2016.04.09 2197
1565 안녕하세요, 반장입니다.^^ [12] file 조은지 2010.04.05 7620
1564 powerpc 레지스터 용도에 대한 결과 [1] 김종화 2007.05.19 7581
1563 세그멘테이션에 관하여. [12] 홍문화 2011.07.22 7531
1562 메모리 모델에서 페이지 디렉토리와 페이지 테이블 [3] 무명 2011.05.01 7432
1561 [ARM중] . (점)과 : (라벨)을 이용한 주소 변환 [7] file 홍문화 2011.10.05 7426
1560 리눅스 커널소스 분석 사이트 [2] 이 종인 2012.05.08 7396
1559 ARM system developer's guide 요약본 [1] file 이수연 2007.11.11 7372
1558 이번주(10/23) 스터디장소 변경합니다. [3] 서기원 2010.10.23 7363
1557 [잡담] 한주의 시작입니다.. ^^ [4] 홍순민 2010.04.05 7339
1556 asmlinkage의 의미 [4] 홍문화 2011.04.12 7323
1555 설치 & 컴파일 방법 [5] 최문규 2010.06.20 7310
1554 첫째날에 공부한 내용 정리한번 해보는게 어떨까요?? 여러분의 의견을 묻습니다. [8] file 김정수 2007.02.26 7255
1553 안녕하세요~ [4] 조선근 2010.11.11 7248
1552 mini USB 케이블을 수배합니다. [1] 권기봉 2010.04.03 7238
1551 아키텍쳐에 관련된 내용입니다. [6] file 원민수 2007.02.25 7234
1550 uboot 관련소스 및 s3c2440 data sheet file 이수연 2007.11.19 7228
1549 엇 너무 조용하네. [2] 서정민 2010.04.05 7223
1548 [제안] 커널 스터디 병행 관련 제안해 봅니다. [12] 장병남 2010.04.12 7216
1547 asmlinkage void __init start_kernel(void) [7] 김태훈80 2008.02.02 7205
1546 setup.S 전반부 정리 자료 [1] file 이종우 2007.05.19 7190
XE Login