ARMv8과 kernel 관련 질문드립니다. ^__^

happyKYS의 이미지

안녕하세요. 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인게 맞는건가요?

다소 햇갈리는 부분이 있어 질문 드렸습니다. 감사합니다.!

goforit의 이미지

우선 제 의견이 틀릴 수 있습니다.

> 궁극적으로는, 비록 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 로그를 보면, 그러한 흔적을 볼 수 있습니다.

commit 2072d29c46b73e39b3c6c56c6027af77086f45fd
Author: Marc Zyngier <marc.zyngier@arm.com>
Date:   Tue Jan 21 10:55:17 2014 +0000
 
    arm64: KVM: allows discrimination of AArch32 sysreg access
 
    The current handling of AArch32 trapping is slightly less than
    perfect, as it is not possible (from a handler point of view)
    to distinguish it from an AArch64 access, nor to tell a 32bit
    from a 64bit access either.
 
    Fix this by introducing two additional flags:
    - is_aarch32: true if the access was made in AArch32 mode
    - is_32bit: true if is_aarch32 == true and a MCR/MRC instruction
      was used to perform the access (as opposed to MCRR/MRRC).
 
    This allows a handler to cover all the possible conditions in which
    a system register gets trapped.
 
    Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
    Acked-by: Christoffer Dall <christoffer.dall@linaro.org>
익명 사용자의 이미지

happyKYS wrote:

궁극적으로는, 비록 ARM이 아키텍처 레벨에서 core 동작중에 inter-processing rule만 따르면 AArch32와 AArch64 환경을 switch 할 수 있게 만들어놨다고 해도, kernel OS는 실제로는 컴파일 타임에 64bit, 32bit가 결정되게 되잖아요.
상식적으로만 생각해도 가상 메모리 주소 공간이 32bit와 64bit가 완전히 달라지고 그에 따라서 switching이 가능하게 하려면 방금전에 돌았던 환경의 virtual memory system을 새로운 환경에 맞춰서 바꾸어주어야 하고 이런 등의 엄청난 오버헤드가 있을 수 있을 것 같고, (이런 이유가 맞는지는 모르겠지만) 어쨋든 신경쓸건 많을테고 이런 뭐 일련의 이유로 "kernel OS는 동작중에 inter-processing을 지원하지 않는다."

aarch64 커널이면 커널 동작은 aarch64로 하겠지만, 어플리케이션이 다른 예외 레벨이면 interprocessing 됩니다. (Ex> kernel: EL1, app: EL0)
즉, kernel 동작 중에는 interprocessing 되지 않지만, OS 동작 중에는 interprocessing 됩니다.

happyKYS wrote:

즉, 동일한 kernel에서 어느 곳은 AArch64로 구동하고 어느 곳은 AArch32로 구동하는걸 지원하지 않는다. 라는 것은 ARM과 무관하게 OS의 R&R인거죠? 동일한 맥락으로 ARM이 MMU와 coprocessor 환경을 제공하긴 하지만 이 기반 하에 virtual memory를 어떻게 구성할 것이고 어떻게 사용할 것인지 등 또한 OS의 R&R인게 맞는건가요?

구현에 따라 다릅니다. 커널을 최상위 특권 예외 레벨(EL3)으로 설정해서 각 예외 레벨을 aarch32/aarch64로 설정 할 수도 있으니깐요. 커널에 TrustZone 모니터 기능을 넣고, EL2에서 어플리케이션과 가상 머신 커널을 동작 시킬수도 있을테고...시스템 구성하기 나름입니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.