본문 바로가기

전체 글

(484)
[RISC-V] RISC-V 툴체인으로 리눅스 커널 빌드하기 - 크로스 컴파일(cross-compile) 이번 포스트에서는 RISC-V 툴체인을 설치해 리눅스 커널을 빌드하는 방법을 소개합니다. 먼저 RISC-V 툴체인을 설치하는 명령어를 입력합시다. RISC-V 툴체인 소스를 내려받기 다음 명령어를 입력해 RISC-V 툴체인 소스를 내려받습니다. $ git clone --recursive https://github.com/riscv/riscv-gnu-toolchain 아래는 리눅스 터미널에서 위 명령어를 입력한 후의 출력 결과입니다. 소스를 내려받는데 1시간 정도 걸리네요. austindh.kim:~/src/risc-v_toolchain$ git clone --recursive https://github.com/riscv/riscv-gnu-toolchain Cloning into 'riscv-gnu-too..
인프런에 '시스템 소프트웨어 개발의 모든 것' 강좌를 오픈했습니다. 제가 인프런에 '시스템 소프트웨어 개발의 모든 것 - 시스템 반도체와 전기 자동차 중심' 강좌를 만들어서 오픈했습니다. 링크는 아래와 같습니다; 시스템 소프트웨어 개발의 모든 것 강의 링크 그 동안 여러 세미나에서 시스템 반도체와 전기 자동차 분야에서 시스템 소프트웨어 개발을 하고 싶은데 어떻게 무엇을 준비해야 할지 모르겠다는 질문을 많이 받았습니다. 제가 세미나에서 답을 드린 내용을 잘 정리하고 압축해 강의를 만들었습니다. 강의 내용을 압축하면 다음과 같습니다; 1. 시스템 소프트웨어 개발자로 실전 프로젝트에서 어떤 일을 하는지 세세히 설명을 합니다. 2. 시스템 반도체와 전기 자동차 업계에서 리눅스 시스템 소프트웨어 개발자가 어떤 일을 하는지 자세히 다룹니다. 3. 각각 어떤 소프트웨어 스택으로 시스..
[가상화-virtualization] EL2:익셉션 핸들러 코드 소개 먼저 이번 절에서 분석할 XEN 하이퍼바이저에서 구현된 익셉션 핸들러의 전체 코드를 소개합니다.  01  0x26a800 : 02  0x26a800:    b    0x269800  03  0x26a804:    nop 04  0x26a808:    nop ... 05  0x26a880:    b    0x26986c  06  0x26a884:    nop 07  0x26a888:    nop ... 08  0x26a900:    b    0x2698d8  09  0x26a904:    nop 10  0x26a908:    nop ... 11  0x26a980:    b    0x269944  12  0x26a984:    nop 13  0x26a988:    nop ... 14  0x26aa00:   ..
[가상화-virtualization] 가상화 관점의 익셉션 벡터 테이블 분석 이전 절에서 익셉션 벡터 테이블의 스펙을 간단히 리뷰했습니다. 이어서 EL2 관점에서 익셉션 벡터 테이블을 자세히 분석하겠습니다. EL2 관점에서 분석한 익셉션 벡터 테이블 다음은 하이퍼바이저가 실행되는 EL2 기준에서 본 익셉션 벡터 테이블을 나타낸 표입니다.          먼저 'EL2 with SP_EL0' 행의 내용을 분석합시다. 'EL2 with SP_EL0'는 익셉션 레벨에 상관없이 스택을 설정하는 조건에서 실행되는 익셉션 종류별 오프셋을 나타냅니다. 그런데 대부분의 하이퍼바이저는 이와 같은 익셉션은 지원하지 않습니다.     EL2에서 발생한 익셉션 분석 이어서 'EL2에서 발생'로 표시된 부분을 봅시다. 0x200, 0x280, 0x300, 0x380은 하이퍼바이저가 구동되는 EL2에서 ..
[가상화-virtualization] HCR_EL2 레지스터에 접근하는 어셈블리 코드 분석 이번에는 HCR_EL2 레지스터를 읽는 예시 코드를 소개합니다. 다음은 XEN 하이퍼바이저에서 호출되는 _show_registers 함수의 어셈블리 명령어입니다. 01 0x25c550 : 02 0x25c550: stp x19, x20, [sp, #-96]! 03 0x25c554: and w20, w2, #0xff ... 04 0x25c62c: mrs x1, hcr_el2 05 0x25c630: adrp x0, 284000 06 0x25c634: add x0, x0, #0x908 07 0x25c638: bl 0x23bee0 먼저 04번째 줄에 있는 'mrs x1, hcr_el2' 명령어를 분석하겠습니다. 이것은 HCR_EL2 레지스터의 값을 x1 레지스터에 로딩하는 동작입니다. 07번째 줄은 printk ..
[가상화-virtualization] HCR_EL2 레지스터에 접근하는 명령어 HCR_EL2 레지스터를 구성하는 비트 필드 정보를 파악하면 "이 비트를 어떻게 설정할 수 있을까?"라는 의문이 생깁니다. Armv8 아키텍처에서는 HCR_EL2 레지스터의 값을 읽고 쓸 수 있는 MRS, MSR 명령어를 제공합니다. HCR_EL2 레지스터는 읽는 MRS 명령어 먼저 HCR_EL2 레지스터의 값을 읽기 위해서는 다음과 같은 형식의 MRS 명령어를 실행하면 됩니다. 그림 15.7 HCR_EL2 레지스터를 읽는 MRS 명령어 그림 15.7은 HCR_EL2 레지스터의 값을 Xt 레지스터로 로딩하는 명령어입니다. 위 그림에서 보이는 는 Armv8 아키텍처에서 정의된 범용 레지스터를 뜻하며, X0 ~ X30 레지스터 중 하나가 지정됩니다. MRS 명령어를 사용하면 HCR_EL2 레지스터의 어떤 비..
[가상화-virtualization] HCR_EL2 레지스터 HCR_EL2는 ‘Hypervisor Configuration Register, EL2’의 약자로서 하이퍼바이저의 세부 동작을 설정하는 가장 중요한 레지스터 중 하나입니다. HCR_EL2는 EL1에서 EL2로 진입(트랩)하는 방식을 설정하는 비트 필드로 구성돼 있습니다. HCR_EL2 레지스터의 접미사에 있는 EL2는 이 레지스터에 접근할 수 있는 최소 익셉션 레벨이므로 EL2 혹은 EL3에서만 접근할 수 있습니다. 다음 그림은 HCR_EL2 레지스터의 비트 필드 정보입니다. 그림 15.6 HCR_EL2 레지스터의 비트 필드 다른 레지스터와 같이 레지스터를 구성하는 비트를 1로 설정하면 해당 비트 필드와 관련된 동작이 수행됩니다. HCR_EL2 레지스터를 구성하는 비트 필드 중에 중요한 내용을 소개하겠습..
[가상화-virtualization] WFE, WFI 명령어 많은 개발자들은 “HVC 명령어를 통해서만 EL1에서 EL2로 진입할 수 있다”라고 알고 있습니다. 사실 그렇지는 않습니다. WFE와 WFI 명령어를 실행해도 EL1에서 실행되는 게스트 OS에서 EL2로 진입할 수 있습니다. --- [정보] WFI와 WFE 명령어 WFI와 WFE 명령어는 Arm 아키텍처에서 지원하는 저전력 기능 중 하나입니다. 리눅스 커널이나 RTOS 관점에서 루틴을 분석하면 "함수가 동시다발적으로 아주 빠르게 실행된다"라고 느끼지만 이를 실행하는 Arm 코어 입장에서는 여러 함수에서 특정 루프(예: while)를 반복하면서 데이터가 특정 조건을 만족할 때까지 기다리는 동작을 자주 수행합니다. 이 상황에서 Arm 코어가 저전력 모드(스탠바이)에 진입하면 전력을 최적화해 Arm 코어를 실..