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

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

 

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 2196
1565 [커널 14차C] 2주차(20170520) 스터디 로그 [6] 목태양 2017.05.21 1988
1564 [커널 14차 D] 2주차 장소 안내 [6] file 감기귤 2017.05.19 199
1563 [커널 14차C] 2주차 스터디 장소 공지 목태양 2017.05.17 101
1562 [커널 14차C] 2주차 스터디 참석 여부 반영 부탁드립니다. 목태양 2017.05.15 164
1561 [커널 14차C] 1주차(20170513) 스터디 로그 - 스터디 장소 관련 내용 추가 [3] 목태양 2017.05.14 5592
1560 13차 7/2 스터디 피드백 종합 Steven(하종민) 2016.07.08 307
1559 문의드립니다] Kernel A조 - Bootloader 스터디 관련 Steven(하종민) 2016.06.29 511
» 13차 조건에 따라 cache_on 을 유보하는 코드 아루스 2016.06.25 414
1557 Kernel E팀 - 3주차 정리 노트 빈즈파덜 2016.06.22 344
1556 20160625 스터디 장소 설문 결과 [1] 미림 2016.06.22 470
1555 형상관리용으로 github에 저희팀이 사용할 리파지토리를 개설했습니다. [1] 미림 2016.06.06 393
1554 13차 Kernel E팀 스터디 진행 노트 Go_som 2016.06.04 225
1553 6/11 스터디 참석자 취합합니다. [8] 목태양 2016.06.02 478
1552 [리눅스 커널 내부구조] Runqueue에서 스케줄링 기법의 동작원리? 유니악 2016.05.28 262
1551 [리눅스 커널 내부구조] 그림 3.20 ??? [4] 유니악 2016.05.28 606
1550 [리눅스 커널 내부구조] 그림 3.16 : 태스트 상태 전이 ? 유니악 2016.05.28 255
1549 [리눅스 커널 내부구조] 그림 3.14 : 태스크 문맥 용어 설명? 유니악 2016.05.28 169
1548 [커널 리눅스 내부구조] load_balance()가 수행되는 원리는? 유니악 2016.05.28 187
1547 안녕하세요. 5월 28일부터 커널 스터디 C조에 참석하는 김진수입니다. killinggun 2016.05.27 196
1546 x86팀 001주차 - 2016.05.21(토) 장소 및 교재 공지 n5de 2016.05.18 186
XE Login