[커널 18차] 8주차

2021.07.22 20:47

Runixs 조회 수:168

2021/07/17 스터디 8차

 

1) 입장하신 분들은 오후 3:00 시작전까지 참가자명을 한글 실명으로 변경.

2) 출첵을 위해 구글 문서의 다음 참석 항목에 성함을 기록.

    jake.dothome.co.kr 에 링크가 있습니다.

3) 접속 후 3시 정각에 웹캠 on.

참석

  • 34명 참석(문영일, 권효만, 장철연, 정동훈, 임채훈, 서민혁, 박진현, 지영근, 문연수, 민호기, 안이수, 황성민, 금승원, 송준영, 이한솔, 강혁, 김각래, 김형종,이재훈, 황바른, 최준근, 김현우, 최영민, 한동수, 김태완, 이일영, 안유빈, 조만재, 김지태, 정주희, 이형래, 김정임, ???, ???)

진도 및 내용

  • 서기: 김태완

  • 이번주 진도: 

    • ARM System Developer's Guide 책, Chapter 3.3.3.1 Stack Operations

  • 다음주 진도: 

    • ARMv8-A Programmers Guide 책

  • 코드 진행: 안이수, 문영일, 최준근

 

unsigned Byte (Zero extend to 32 bits on loads.)

 

ARM System Developer’s Guide

3장 Introduction to the ARM Instruction Set

3.3 Load-Store Instructions

  • index methods

    LkrKz-bYV_pMtDmgY1J5E5bqDh9UM5fgxPEXePbU



     

  • 3.3.4 Swap Instruction

    --t6FTgMyVeh0peTCzzJZ97iMFSxliCS7nyw7p0Y

     

3.4 Software Interrupt Instruction

L9eb_q5Qfn085cTp42rzm_4xG1Bn4kq17fEDjCRL

3.5 Program Status Register Instructions

ARM 시스템 주요 레지스터

 

3.6 Loading Constants

lhUoKLaM91iB0WXChDHJe3E5WszZPAW5M41LQNrk

4장 Introduction to the Thumb Instruction Set

9장 Exception and Interrupt Handling

PZPwuVopADPh3wrJkvPXt01IhGDpkwhzWOSCF7l0

gMwuTuXEj8i63xravGFl0VZEu_rDSq4kcgTs854a

TFUXlCK3-sxXPQ8DrzQMfyU2A4KQjeEHVDSwtTSF

  • 파이프라인 수 때문에 lr-* 숫자가 다름

  • lr-4는 Decode 단계에서 인지가 되었기 때문에 -4

  • Ir-8은 Execution 단계에서 인지가 되었기 때문에 -8

12장 Caches

0cSaQLWzDzOl-KUSpwsg6saSSfi1RszTM4Syjss1

  • Dirty : Memory와 Cache 데이터가 달라졌을 때 Set

  • Valid : 사용하고 있을 때 Set

  • Cache line size는 Words 사이즈만 측정 → 16 Bytes

  • Data index는 보통 Offset이라고 이야기 함

  • Word가 동일해도, 좌측 Tag와 우측 Cache-tag랑 내용이 다르면 Miss

  • 좌측 2^(Setindex + Data index) = 2^12 = 4 KB

  • Or 16 Bytes * 256 cache lines = 4 KB

  • Address가 PA or VA




 

Thrashing

v2Cw58NPtM3f4qhTYniXTNXbNbD7V3zeRevhOVpm

  • 컴파일러가 우연히 두 Routine의 Set index를 같게 하면, 계속 Cache miss가 일어나서 성능이 대폭 저하됨

  • Trashing cache 현상이고, 이러한 이유로 이 A direct-mapped cache를 잘 안씀.


 

6lJd840hbQMeKNV6tJOLbmKmAcuGnhH_AvVkfgCc

  • 새로운 Access가 발생하면, 사용한 지 가장 오래된 것을 대체함.

    • LRU : 캐시 폐기 정책이라고 함


 

12.3 Cache Policy

12.3.2 Cache Line Replacement Policies

jFHwPB1vYCTas5roPmakYnBeMyYgkAShdUe50_6R

 

12.5 Flushing and Cleaning Cache Memory

L2u2neOYE_8cetTYkW0_weRorWcH4WFgOFF36xSB

 

zWppDQj_8Ng_rbTkoLyk_k85qQWSVzMCZC1intFR


 

문C 블로그 - Cache – Coherent


 

Code 분석 

http://jake.dothome.co.kr/head-64-510/

 

Q: 매크로에 있는 ##

두 개의 text를 연결한다.

 

Q: __cacheline_aligned

  __attribute__((__aligned__(SMP_CACHE_BYTES),                  \

                   __section__(".data..cacheline_aligned")))

이 데이터 영역이 캐시라인 정렬이 필요하여 64바이트 단위로 정렬하여 위의 섹션에 저장하게 한다.

 

Q: 왜 해당 섹션에 저장하고 정렬이 필요한가? 

특정 영역의 경우 캐시 라인의 크기에 따라 다른 데이터와 같이 캐싱되버리는 경우가 생긴다. 이러한 현상을 방지하기 위하여 따로 데이터 섹션을 만들어 해당 섹션에 저장하도록 하고 해당 데이터 크기외의 공간은 pad 로 채워 캐싱됨을 방지하도록 구현한다.

 

SMP_CACHE_BYTES = 64 bytes

 

Q: hint 34;

 

Q: Use Branch Target Identification for kernel

 

raETR3fOLkoz62cbPdC3hAPX-hVov90MwArH-5-1

CTR_EL0 레지스터(ARM® Architecture Reference Manual p2763)

 

Ck_WW4aWLBogGNRhvgsVIkBnetpEceE0Bkd0_AXt

 

  • DminLine, bits [19:16]

    • Log2 of the number of words in the smallest cache line of all the data caches and unified caches that are controlled by the PE.

  • ctr_el0.DminLine -> 4bits

    • ctr_el0.DminLine = 4 = Log2 of the number of words

    • = Log2(16) = 4

    • 2^4 = 16 words

  • 가져온 값(예:4) << 4

    • 4 * 16 = 64 바이트

  • 1 -> 4 << 1 = 4 * 2^1 = 8 바이트

  • 2 -> 4 << 2 = 4 * 2^2 = 16 바이트

  • 3 -> 4 << 3 = 4 * 2^3 = 32 바이트

  • 4 -> 4 << 4 = 4 * 2^4 = 64 바이트

  • 5 -> 4 << 5 = 4 * 2^5 = 128 바이트

 

I-L1(32)     D-L1(64)

I-L2(64)     D-L2(64)

        L3(128)





 

캐시

http://jake.dothome.co.kr/registers64/

CTR_EL0(Cache Type Register – EL0)

캐시 타입을 알아오는 레지스터이다.

LXZxi_QtQznrcV7CdYC4D4iKPAV4W8UMFXcgKpbf

  • DminLine

    • 데이터 캐시 라인 사이즈로 2^n 워드

 예) Cortex-A72, CTR_EL0=0x8444_c004

  • DIC=0

  • IDC=0

  • CWG=4(16 words)

  • ERG=4(16 words)

  • DminLine=4(16 words)

  • L1Ip=3(PIPT)

  • IminLine=4(16 words)

 

void dcache_line_size(int & ret_size) {

    // read_ctr        \\tmp

    int tmp = CTR_EL0;

 

    // ubfm            \\tmp, \\tmp, #16, #19    // cache line size encoding     

    int tmp = (tmp & 0b1111_0000_0000_0000_0000) >> 16;

 

    // mov             \\reg, #4                // bytes per word 

    *ret_size = 4;

 

    // lsl             \\reg, \\reg, \\tmp        // actual cache line size  

    *ret_size <<= tmp;

}

 

dc civac

PBLG5A--cPk_eeGLXoJmOXXIT6GGkviqVvsV7CSp













 

QjPU8XD0xrCjvFI6v4bT4SJNiUofVsBSN6Fs3iIX

P.214

Cache clear & validate 명령어

인스트럭션 : IC / DC

  • IC : Instruction cache

  • DC : Data cache

오퍼랜드1

  • 첫 번째 필드 : C / I / CI

    • C : Clean

    • I : Invalidate

  • 두 번째 필드 : VA / SW / ALL

    • VA : By address

    • SW : By Set/Way

    • ALL

  • 세 번째 필드 : U / C / P

    • U : Point of Unification

    • C : Point of Coherency

    • P : Porint of P?

  • 네 번째 필드 : IS / NOP

    • IS : Inner shareable : CPU 내 모든 코어를 대상으로

Broadcast?

  • 다른 코어들에 영향을 준다.

  • Addess가 지정된 건 다른 코어의 지역이 지정될 수 있으므로 Broadcast : Yes (ZVA 예외)

번호 제목 글쓴이 날짜 조회 수
공지 [공지] 스터디 정리 노트 공간입니다. woos 2016.05.14 617
82 [커널 17차] 49주차 ㅇㅇㅇ 2021.08.07 215
81 [커널 17차] 48주차 ㅇㅇㅇ 2021.08.01 166
80 [커널 18차] 9주차 Runixs 2021.07.29 256
79 [커널 17차] 47주차 ㅇㅇㅇ 2021.07.24 82
» [커널 18차] 8주차 Runixs 2021.07.22 168
77 [커널 17차] 46주차 ㅇㅇㅇ 2021.07.18 60
76 [커널 18차] 7주차 Runixs 2021.07.12 129
75 [커널 17차] 45주차 ㅇㅇㅇ 2021.07.10 127
74 [커널 17차] 44주차 ㅇㅇㅇ 2021.07.04 76
73 [커널 18차] 6주차 V4bel 2021.07.03 75
72 [커널 17차] 43주차 ㅇㅇㅇ 2021.06.27 138
71 [커널 18차] 5주차 V4bel 2021.06.26 102
70 [커널 17차] 42주차 ㅇㅇㅇ 2021.06.20 290
69 [커널 18차] 4주차 V4bel 2021.06.19 92
68 [커널 17차] 41주차 ㅇㅇㅇ 2021.06.13 36507
67 [커널 18차] 3주차 V4bel 2021.06.12 103
66 [커널 17차] 40주차 ㅇㅇㅇ 2021.06.05 280
65 [커널 18차] 2주차 V4bel 2021.06.05 269
64 [커널 17차] 39주차 ㅇㅇㅇ 2021.05.29 177
63 [커널 18차] 1주차 V4bel 2021.05.29 3595
XE Login