ARMv8과 kernel 관련 질문드립니다. ^__^
안녕하세요. ARMv8 관련 커널 시스템 경험 있으신분 답변주시면 감사드릴게요~ ^__^
궁금한게 있어서 ARM 쪽하고 case로 Q&A좀 진행하다가 좀 잘못 알고 있는게 있는것 같아서 문의드립니다.
ARM쪽에서는 inter-processing 간에 rule만 준수하면 시스템이 구동중에 자유롭게 AArch32와 AArch64 execution state를 이동할 수 있다고 하는데요. 저는 사실 아키텍처 레벨에서 core 개발시 어떻게 구성할건지에 따라 고정적이라고 생각했거든요. 즉, "AArch32를 지원하고 AArch64도 지원한다" 가 아니라 "exception level 마다 AArch32를 쓸건지 AArch64를 쓸건지 고정적으로 선택해야 한다" 라는 배타적 개념으로 오해를 해서 질문을 했었어요.
이건 ARM 입장인거죠?
무슨 말이냐 하면... ARM쪽에서는 ARM core 설계시(ex. Cortex-A57) AArch32 instruction과 AArch64 instruction 간에 이전 exception level에 대해 AAPCS에 따라 정상적인 register backup, restore만 정확히 해줄 수 있고 다음 instruction만 수행시켜 줄 수 있으면 여기까지가 ARM 사에서 바라보는 R&R인거죠? 이런 이유로 시스템 구동중에도 자유롭게 execution state 전환이 가능하다고 하는 걸꺼구요.. (inter-processing rule만 준수한다면)
그 다음 Linux OS에서 내가 방금까지 code를 AArch64 execution state에서 실행했는데 잠깐 뭐 EL3로 secure world에 진입했다가 다시 return 할때는 kernel 환경을 AArch32로 구동한다거나 할 순 없잖아요. 컴파일 타임에 kernel을 64bit로 컴파일 할건지 32bit로 컴파일 할건지 결정하니까 kernel image 안에 어느 코드는 AArch32로 구동하고 어느코드는 AArch64로 구동하고 이런 부분은 없잖아요. (사실 이럴 수 있다고 말하는줄 알고 햇갈렸었는데, 생각해보니 ARM 사에다가 kernel OS 동작에 대한 질문을 한 꼴이 되버리더라고요.. ㅡ..ㅡ;;;)
궁극적으로는, 비록 ARM이 아키텍처 레벨에서 core 동작중에 inter-processing rule만 따르면 AArch32와 AArch64 환경을 switch 할 수 있게 만들어놨다고 해도, kernel OS는 실제로는 컴파일 타임에 64bit, 32bit가 결정되게 되잖아요.
상식적으로만 생각해도 가상 메모리 주소 공간이 32bit와 64bit가 완전히 달라지고 그에 따라서 switching이 가능하게 하려면 방금전에 돌았던 환경의 virtual memory system을 새로운 환경에 맞춰서 바꾸어주어야 하고 이런 등의 엄청난 오버헤드가 있을 수 있을 것 같고, (이런 이유가 맞는지는 모르겠지만) 어쨋든 신경쓸건 많을테고 이런 뭐 일련의 이유로 "kernel OS는 동작중에 inter-processing을 지원하지 않는다."
즉, 동일한 kernel에서 어느 곳은 AArch64로 구동하고 어느 곳은 AArch32로 구동하는걸 지원하지 않는다. 라는 것은 ARM과 무관하게 OS의 R&R인거죠? 동일한 맥락으로 ARM이 MMU와 coprocessor 환경을 제공하긴 하지만 이 기반 하에 virtual memory를 어떻게 구성할 것이고 어떻게 사용할 것인지 등 또한 OS의 R&R인게 맞는건가요?
다소 햇갈리는 부분이 있어 질문 드렸습니다. 감사합니다.!
Virtualization 를 추가로 고려하면
우선 제 의견이 틀릴 수 있습니다.
> 궁극적으로는, 비록 ARM이 아키텍처 레벨에서 core 동작중에 inter-processing rule만 따르면 AArch32와
> AArch64 환경을 switch 할 수 있게 만들어놨다고 해도, kernel
> 는 실제로는 컴파일 타임에 64bit, 32bit가 결정되게 되잖아요.
> 상식적으로만 생각해도 가상 메모리 주소 공간이 32bit와 64bit가 완전히 달라지고 그에 따라서 switching이 가능하게 > 하려면 방금전에 돌았던 환경의 virtual memory system을 >새로운 환경에 맞춰서 바꾸어주어야 하고 이런 등의 엄청
> 난 오버헤드가 있을 수 있을 것 같고, (이런 이유가 맞는지는 모르겠지만) 어쨋든 신경쓸건 많을테고 이런 뭐 일련의 이유 > "kernel OS는 동작중에 inter-processing을 지원하지 않는다."
전통적인 CPU 구조 관점에서는 그렇게 생각할 수 있습니다.
그런데 ARM사에 ARMv8을 설계하면서 크게 염두해둔 것이 Virtualization입니다. 오래전 64bit CPU는 Alpha는 이런 고려가 전혀 없었습니다. 다소 새로운 트렌트입니다. 하드웨적으로 32비트 레지스터와 64비트 레지스터가 동시에 사용가능하도록 설계되었습니다. 쉽게 말하면 64비트 리눅스 돌리면서 32bit Guest OS 를 구동할 수 있습니다.
ARM사의 리눅스 커널 엔지어들은 이미 이런 것들이 지원되도록 커널을 수정했습니다.
(물론 제가 테스트해 본적은 없습니다. )
예를 들어, 커널의 Git 로그를 보면, 그러한 흔적을 볼 수 있습니다.
happyKYS wrote: 궁극적으로는, 비록
aarch64 커널이면 커널 동작은 aarch64로 하겠지만, 어플리케이션이 다른 예외 레벨이면 interprocessing 됩니다. (Ex> kernel: EL1, app: EL0)
즉, kernel 동작 중에는 interprocessing 되지 않지만, OS 동작 중에는 interprocessing 됩니다.
구현에 따라 다릅니다. 커널을 최상위 특권 예외 레벨(EL3)으로 설정해서 각 예외 레벨을 aarch32/aarch64로 설정 할 수도 있으니깐요. 커널에 TrustZone 모니터 기능을 넣고, EL2에서 어플리케이션과 가상 머신 커널을 동작 시킬수도 있을테고...시스템 구성하기 나름입니다.
댓글 달기