[커널20차] 9주차

2023.07.02 04:28

이경재 조회 수:85

2023. 07.01. (9주차) - 약 22명 참여

 

[11. Registers at AArch32 (p.28 ~ 31)]

 

Q: AArch32에서 banked register들을 운용하며 얻는 효과중에는 비단 stacking/unstacking으로 인한 오버헤드를 줄이는 것 뿐 아니라 다른 프로세서 모드에서 해당 모드 고유의 banked register의 값들을 변경시키지 못하도록 막아주는 효과도 있을 것 같다. 한편, AArch64에서는 상당수의 banked register들을 어느 모드에서든 접근 가능한 general purpose register들로 풀어놨는데, 그렇다면 이 register들을 오염되지 않도록 보호하는 것은 프로그래머의 역할이 되는건지 아니면 다른 장치가 있을지 궁금하다.

A: 참고할 내용: 컴파일러 플러그인, Exception entry/exit 시 stacking/unstacking 되는 레지스터들 확인, exception handler 호출 시 컴파일러가 생성해주는 prologue/epilogue 내용 확인 등등

 

https://elixir.bootlin.com/linux/latest/source/arch/arm64/kernel/entry.S#L206

이 라인부터 보시면 모든 레지스터를 stacking하네요. 즉, 커널 개발자의 역할로 추측됩니다. 그런데 지금 막 이 code snippet만 본 것이지, 아직 context를 따라가본건 아니라 확실치는 않습니다.


 

[12. A64 Instructions(p.32)]

 

Q. A32, T32를 동일하게 생각해도 될까?

A.프로세서가 Instruction 을 Decoding 하기 위해 Encoding 을 알야하하는데, A32, T32, A64 Instruction set이 다르므로, A32와 T32는 같다고 볼 수 없음.

A32, T32, A64 모두 Instruction set이 다름. -> instruction 자체를 2진수로 변환. CPU는 어셈블리가 아니라 바이너리를 보고 실행하는데,  Instruction Decoding 을 위해 Encoding 을 알아야 함.

즉, 프로세서는 자신이 실행하는 명령어 집합을 알아야, 그에 맞게 encode, decode가 가능하다.

 

Q: “A64 adds some additional capabilities while also removing other features that would potentially limit the speed or energy efficiency of high performance implementations.” 여기서 속도와 에너지 효율성의 성능 향상을 잠재적으로 제한할 수 있는 기능을 제거했다. <- 이게 어떤 의미일까요?

A: 32 Bit 체제에서 64Bit 연산시 상위 32Bit 끼리 연산 -> 하위 32Bit 끼리 연산 -> 상위, 하위 32Bit Merge 등 연산과정이 복잡. 이에 반해 64Bit 체제의 연산은 한번에 이루어지므로 CPU 관점 Clock Cycle 절약 -> 시간 절약 -> 결과적으로 전력소모 감소로 이어짐. 

 

KhpM9iTJ3MNdfuaxXoega4Wnyk8zyZb8CtV6AISb

 

공유1. https://developer.arm.com/documentation/den0024/a/An-Introduction-to-the-ARMv8-Instruction-Sets/The-ARMv8-instruction-sets?lang=en

A32, T32 대비 A64 명령어 셋 개선점

공유2.

https://developer.arm.com/Architectures/A64%20Instruction%20Set%20Architecture

A64 특징 중 No modal banking of general purpose registers for improved performance and energy.

Q: No modal banking of general purpose registers for improved performance and energy.에서 “No modal banking” 이 무엇인가?

A: “범용 레지스터의 모달 뱅킹없음”이란 프로세서의 작동 모드에 따라 교체되는 범용 레지스터의 다른 세트 (뱅크)를 포함하지 않기로한 A64 명령어 세트의 설계 결정을 의미한다. 이 개념을 레지스터의 “모달 뱅킹" 이라한다. 일부 프로세서 아키텍쳐에서는 특정 레지스터가 “뱅킹”되어 있어 프로세서의 현재 상태 또는 모드에 따라 다른 버전의 레지스터가 사용된다. (ex. 프로세서는 인터럽트를 처리할 때 사용하는 레지스터 세트와 일반 실행 중에 사용하는 다른 레지스터 세트를 가질 수 있다. ) 이 설계는 프로세서가 레지스터 내용을 저장하고 복원할 필요없이 (Context Stacking 준원님 공유) 모드를 전환할 수 있다는 점에서 유용. But. 레지스터 뱅킹은 프로세서 설계를 복잡하게 만들고 성능이나 에너지 효율을 저하시킴. (ex. 모드 전환 발생하면 프로세서가 레지스터의 한 뱅크에서 다른 뱅크로 전환할 때 지연이 발생. 이러한 지연은 프로세서의 성능에 악영향)

따라서 A64 instruction set은 모달 뱅킹을 제거하므로써 서로 다른 레지스터 뱅크 간 전환과 관련된 잠재적 지연 및 복잡성을 제거하여 성능 및 에너지 효율성을 개선하려고 시도한 것 (즉 프로세서의 현재 모드나 상태에 관계없이 항상 하나의 일정한 범용 레지스터 세트에 엑세스 할 수 있도록 유지) 

(ChatGPT 답변. 내용 검증 필요)


 

[13. The ARMv8-A instruction sets (p.33)]

 

Q: T32 설명 마지막 줄에 “Because of its size and performance advantages, it is increasingly common for all 32-bit code to be compiled or assembled to take advantage of Thumb-2 technology. (크기와 성능의 이점 때문에 Thumb-2 기술을 활용하기 위해 모든 32비트 코드를 컴파일하거나 assemble하는 것이 점점 더 일반적입니다.)” 이 부분이 무슨 뜻인지 모르겠습니다. Thumb-2는 16비트와 32비트가 혼합된 instruction set라고 이해했는데 이걸 사용하기 위해 뭔가 해야한다는 것 같은데.. 설명해주실 분이 계실까요?

A1: Flag 에 따른 실행상태 변경 프로젝트 진행 -> 32bit 컴파일

컴파일 된 프로그램 내에서 16bit <-> 32bit 간 변환 (이 시점부터 Thumb 모드로 실행하라 라는 arm assembly instruction이 있고, 프로그래머가 이 instruction을 사용해서 Thumb 모드로 진입 명령(CPSR 레지스터의 T-bit을 set), 이후 다시 ARM 모드로 돌아오도록 하는 instruction도 있음.)

A2: 컴파일러에 옵션을 주면 저절로 16비트와 32비트를 함께 쓰도록 할 수 있다.

예 : https://doc.rust-lang.org/nightly/rustc/platform-support.html

문서에서 thumb로 검색하면 나오는 옵션들 참고

thumbv7neon-linux-androideabi ✓ Thumb2-mode ARMv7a Android with NEON

 

A3: RISC와 CISC의 관점으로 보면 좋을 것 같다. (16bit 명령어만 사용했던 Thumb1에서 32bit 명령어도 사용할 수 있는 Thumb2로 확장되면서 A32와 명령어 길이가 동일하게 된 이것이 크기와 성능 이점을 불러와 Thumb2를 사용한다 / 명령어의 길이가 동일하면 얻는 이점은 Risc와 Cisc 의 차이를 보면 좋겠다는 의미였습니다)

 

[13.1 Switching between instruction sets (p.33)]

 

[13.2 Addressing (p.34)]

Q. 64비트 주소 공간이 memory-mapped files에 더 매력적인 기능을 제공하는 예시로, 물리적인 RAM이 부족한 상황에서도 파일의 컨텐츠를 스레드의 메모리 맵에 매핑함으로써 프로그램의 실행을 더 빠르게 한다고 하는 것 같은데, 잘 와닿지가 않습니다… 파일의 컨텐츠를 메모리 맵에 매핑하는 방식과, RAM에 파일의 컨텐츠를 집어넣는 방식의 차이점을 알 수 있을까요?

A: 32비트 프로세스에서는 3GB를 전부 파일로 매핑에서 사용할 수 없다. 따라서 이 경우 memory-mapped 방식을 사용할 수 없다. 하지만 64비트에서는 가상 주소 공간이 넓기 때문에, 어떤 파일이던 memory-mapped를 할 수 있을 만큼 충분한 크기의 공간이 보장된다.


 

참고: “시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리” (Chapter 10)

Exception Flow 

4EctmrqPMhiDeAlRPiolrrp6r-oUOVNZnivrEAep

번호 제목 글쓴이 날짜 조회 수
공지 [공지] 스터디 정리 노트 공간입니다. woos 2016.05.14 627
228 [커널 20차] 20주차 [2] 이민찬 2023.09.17 182
227 [커널 20차] 19주차 이민찬 2023.09.10 103
226 [커널 20차] 18주차 이민찬 2023.09.03 85
225 [커널 20차] 17주차 이민찬 2023.08.27 129
224 [커널 20차] 16주차 이민찬 2023.08.20 132
223 [커널 19차] 64 주차 Min 2023.08.19 91
222 [커널 20차] 15주차 이민찬 2023.08.13 126
221 [커널 19차] 63 주차 Min 2023.08.12 60
220 [커널 19차] 62 주차 Min 2023.08.05 79
219 [커널 20차] 13주차 이민찬 2023.07.30 107
218 [커널 19차] 61 주차 Min 2023.07.30 45
217 [커널 20차] 12주차 이민찬 2023.07.22 87
216 [커널 19차] 59 ~ 60 주차 Min 2023.07.22 37
215 [커널 18차] 113주차 kkr 2023.07.22 78
214 [커널20차] 11주차 이경재 2023.07.15 86
213 [커널20차] 10주차 이경재 2023.07.09 90
» [커널20차] 9주차 이경재 2023.07.02 85
211 [커널 19차] 58 주차 Min 2023.07.01 41
210 [커널 19차] 56 ~ 57 주차 Min 2023.06.25 40
209 [커널 18차] 109주차 kkr 2023.06.24 33
XE Login