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

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

 

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 2193
1565 [커널 14차 D] 3주차 장소 및 진도 [9] 감기귤 2017.05.25 347
1564 [커널 14차C] 2주차(20170520) 스터디 로그 [6] 목태양 2017.05.21 1988
1563 [커널 14차C] 3주차(20170527) 스터디 장소 공지 목태양 2017.05.25 67
1562 [커널 14차 D] 2주차 장소 안내 [6] file 감기귤 2017.05.19 199
1561 [커널 14차C] 2주차 스터디 장소 공지 목태양 2017.05.17 101
1560 [커널 14차C] 2주차 스터디 참석 여부 반영 부탁드립니다. 목태양 2017.05.15 164
1559 [커널 14차C] 1주차(20170513) 스터디 로그 - 스터디 장소 관련 내용 추가 [3] 목태양 2017.05.14 5592
1558 ARM 아키텍쳐 관련 기초 쌓기(임베디드 레시피) [2] 차상우 2013.05.07 6669
1557 20160625 스터디 장소 설문 결과 [1] 미림 2016.06.22 470
1556 13차 7/2 스터디 피드백 종합 Steven(하종민) 2016.07.08 307
» 13차 조건에 따라 cache_on 을 유보하는 코드 아루스 2016.06.25 414
1554 문의드립니다] Kernel A조 - Bootloader 스터디 관련 Steven(하종민) 2016.06.29 511
1553 Kernel E팀 - 3주차 정리 노트 빈즈파덜 2016.06.22 344
1552 6/11 스터디 참석자 취합합니다. [8] 목태양 2016.06.02 478
1551 형상관리용으로 github에 저희팀이 사용할 리파지토리를 개설했습니다. [1] 미림 2016.06.06 393
1550 [리눅스 커널 내부구조] 그림 3.20 ??? [4] 유니악 2016.05.28 605
1549 13차 Kernel E팀 스터디 진행 노트 Go_som 2016.06.04 225
1548 x86 스터디 참석인원 및 거주지역 파악 [20] 안녕 2016.05.10 1008
1547 만들면서 배우는 OS 커널의 구조와 원리 책 제본 신청 [34] n5de 2016.05.17 1147
1546 [리눅스 커널 내부구조] Runqueue에서 스케줄링 기법의 동작원리? 유니악 2016.05.28 261
XE Login