실험환경

구분 환경 디바이스 프로세서 OS(REE) TEE
이론 도어락 FreeRTOS Cortex-M FreeRTOS KHU-TEE(PSA)
  모바일 Android OS Cortex-A Android Android OP-TEE
실험실 도어락 라즈베리파이 3b+ Cortex-A Ubuntu 20.04 OP-TEE
  모바일 라즈베리파이 3b+ Cortex-A Ubuntu 20.04 OP-TEE
고도화 도어락 라즈베리파이 3b+ Cortex-A Ubuntu 20.04 OP-TEE
  모바일 리눅스 설치 노트북(QEMU) Cortex-A Ubuntu OP-TEE

Raspberry Pi 3 Model B+


Raspberry Pi 3 Model B+는 1.4GHz 64비트 쿼드 코어 프로세서를 탑재하였으며, 듀얼 밴드 2.4GHz 및 5GHz 무선 LAN, Bluetooth 4.2/BLE, USB 2.0 기반의 기가비트 이더넷을 지원합니다. 또한 별도의 PoE HAT을 통해 PoE(Power over Ethernet) 기능을 제공합니다. 듀얼 밴드 무선 LAN은 모듈 인증을 획득하여 사용 가능합니다. Raspberry Pi 3 Model B+는 Raspberry Pi 2 Model B 및 Raspberry Pi 3 Model B와 동일한 기구적 크기를 유지합니다.

Specification

  • Processor: Broadcom BCM2837B0, Cortex-A53 64-bit SoC @ 1.4GHz
  • Memory: 1GB

Connectivity

  • 2.4GHz 및 5GHz IEEE 802.11b/g/n/ac 무선 LAN
  • Bluetooth 4.2 및 BLE
  • USB 2.0 기반 기가비트 이더넷 (최대 전송 속도 300Mbps)
  • 4 x USB 2.0 인터페이스

Video and Sound

  • 1 x 풀 사이즈 HDMI
  • MIPI DSI 디스플레이 포트
  • MIPI CSI 카메라 포트
  • 4극 스테레오 출력 및 복합 비디오 포트

Multimedia

  • H.264, MPEG-4 디코딩 (1080p30)
  • H.264 인코딩 (1080p30)
  • OpenGL ES 1.1, 2.0 그래픽

SD Card Support

  • Micro SD 포맷 (운영 체제 및 데이터 저장용)

Input Power

  • 5V/2.5A DC (마이크로 USB 커넥터)
  • 5V DC (GPIO 헤더)
  • PoE 지원 (별도의 PoE HAT 필요)

Raspberry Pi 보드 LED 상태

LED 색상 상태 내용
빨간색 LED 전원 상태 알림  
  계속 켜져 있음 전원 안정적임
  꺼져 있음 절전 모드 진입
  계속 깜빡임 저전압 상태
     
녹색 LED 부팅/동작 및 읽기/쓰기 상태 알림  
  10번 깜빡임 Halt 상태 활성
  9번 깜빡임 SDRAM 부족
  8번 깜빡임 SDRAM 인식 오류
  7번 깜빡임 Kernel.img 파일 없음
  4번 깜빡임 start.elf 파일 없음
  3번 깜빡임 부팅 실패
  계속 켜져 있음 SD카드 인식 성공
  계속 깜빡임 읽기 / 쓰기 진행 중

QEMU란?


QEMU는 가상 머신(VM) 및 에뮬레이터 소프트웨어로, 여러 운영 체제와 CPU 아키텍처에서 다양한 시스템을 가상화하거나 에뮬레이션할 수 있는 오픈소스 도구이다.

VM과 에뮬레이션의 차이

가상 머신(VM)과 에뮬레이션의 차이는 성능호환성의 측면에서 중요한 차이가 있다. 두 방식은 모두 소프트웨어를 통해 시스템을 격리하지만, 동작 방식과 목적이 다르다.

## 1. 가상 머신(VM)

  • 개념: VM은 호스트 운영 체제에서 하드웨어 자원을 가상화하여 게스트 운영 체제가 동작할 수 있도록 한다. VM은 CPU, 메모리, 디스크 등을 실제 하드웨어처럼 활용하며, 호스트와 게스트가 동일한 CPU 아키텍처를 사용해야 한다.

  • 성능: 하드웨어 가상화를 통해, 호스트의 CPU에서 게스트의 코드가 거의 직접 실행된다. 이는 에뮬레이션보다 훨씬 높은 성능을 제공하며, 호스트 CPU와 게스트 CPU가 동일한 아키텍처일 때 최적의 성능을 발휘한다.

  • 호환성: VM은 호스트와 같은 CPU 아키텍처만 지원하므로, x86 시스템에서 ARM용 운영 체제를 실행할 수 없다.

## 2. 에뮬레이션

  • 개념: 에뮬레이션은 하드웨어의 기능을 소프트웨어로 모방하는 방식이다. CPU, 메모리, I/O 등 모든 하드웨어 기능을 소프트웨어적으로 구현하여 다른 아키텍처의 운영 체제와 애플리케이션도 실행할 수 있다.

  • 성능: 에뮬레이션은 소프트웨어가 하드웨어를 흉내 내야 하므로, VM보다 성능이 낮다. 코드가 직접 실행되는 대신 소프트웨어가 매번 명령을 번역하고 처리해야 하기 때문에 느리다.

  • 호환성: 에뮬레이션은 아키텍처에 구애받지 않고 동작할 수 있으므로, 예를 들어 x86 컴퓨터에서 ARM 기반 운영 체제를 실행하는 것이 가능하다.

## 요약 비교

구분 가상 머신 (VM) 에뮬레이션
성능 하드웨어 가상화로 인해 높은 성능 제공 소프트웨어로 하드웨어 모방, 성능이 낮음
호환성 호스트와 게스트가 동일한 CPU 아키텍처 필요 다른 CPU 아키텍처와 운영 체제도 실행 가능
사용 사례 동일 아키텍처 가상화 환경에서 고성능 요구 크로스 아키텍처 환경에서 개발 및 테스트

QEMU는 이 두 가지를 모두 지원해, VM 모드에서 KVM을 통해 높은 성능으로 가상화를 제공하거나, 에뮬레이션 모드에서 여러 아키텍처를 지원해 다양한 운영 체제를 실행할 수 있다.

주요 기능

  1. 하드웨어 가상화 지원
    QEMU는 KVM(Kernel-based Virtual Machine)과 결합하여 하드웨어 가상화를 지원한다. 이를 통해 호스트 CPU에서 직접 실행할 수 있으며, 거의 네이티브 성능에 가까운 가상 머신을 제공한다. 특히 x86 시스템에서 리눅스 기반 호스트와 함께 사용하면 성능이 크게 향상된다.

  2. 다양한 아키텍처 에뮬레이션
    QEMU는 ARM, MIPS, SPARC 등 여러 CPU 아키텍처를 에뮬레이션하여 다른 아키텍처의 운영 체제와 애플리케이션을 실행할 수 있다. 이는 에뮬레이션 모드에서 동작하며, 성능이 다소 낮지만 개발자에게 유용한 테스트 환경을 제공한다.

  3. 다양한 운영 체제 지원
    QEMU는 리눅스, 윈도우, macOS 등의 호스트 운영 체제에서 동작하며, 리눅스, 윈도우, macOS, FreeBSD 등의 게스트 운영 체제를 지원한다.

  4. 가상 네트워킹 및 장치 관리
    QEMU는 가상 네트워킹과 여러 가상 장치를 지원하여, 네트워크 연결과 장치 간 통신을 가상화 환경에서도 사용할 수 있게 한다. 이를 통해 물리적 환경을 그대로 모방할 수 있다.

운영 모드

QEMU는 주로 두 가지 운영 모드로 나뉜다:

1. 에뮬레이션 모드

  • 완전한 하드웨어 에뮬레이션: QEMU는 소프트웨어를 통해 CPU, 메모리, I/O 장치 등의 하드웨어를 완전히 에뮬레이션한다.
  • 멀티 아키텍처 지원: x86 컴퓨터에서 ARM, SPARC, PowerPC 등 다른 아키텍처의 소프트웨어를 실행할 수 있다.
  • 성능: 성능은 낮지만, 개발자들이 실제 하드웨어 없이 다른 플랫폼에서 테스트할 수 있다.

2. 가상화 모드 (KVM과 함께 사용)

  • 직접 CPU 실행: KVM을 사용하여 호스트 CPU에서 직접 게스트 코드를 실행할 수 있어, 에뮬레이션 모드보다 성능이 높다.
  • 리눅스에서 x86 가상화에 최적화: 이 모드는 리눅스에서 x86 가상화 환경에서 특히 강력하다.

QEMU의 활용 예시

  • 개발 및 테스트 환경: QEMU는 여러 플랫폼에 맞춰 애플리케이션을 개발하고 테스트하는 환경을 제공한다. 예를 들어, ARM 기반의 소프트웨어를 개발하면서 실제 하드웨어 없이 x86에서 테스트할 수 있다.
  • 운영 체제 디버깅: QEMU는 리눅스 커널 디버깅 및 운영 체제 레벨의 디버깅을 지원하여 시스템 개발에 유용하다.
  • 임베디드 시스템 개발: 하드웨어가 준비되지 않은 상태에서도 QEMU를 통해 임베디드 시스템을 가상으로 개발하고 테스트할 수 있다.

설치 방법

# Ubuntu 또는 Debian 계열의 경우
sudo apt-get update
sudo apt-get install qemu qemu-kvm

# macOS의 경우 (Homebrew 사용)
brew install qemu

KVM을 설치하여 cpu 가속 기능을 활용하는 방법

sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils
sudo usermod -aG kvm $(whoami)

TODO: kvm 공부

QEMU 사용 예시

1. 간단한 x86 시스템 실행

아래 명령어로 64비트 x86 시스템을 실행할 수 있다. disk_image.img는 사용할 디스크 이미지 파일이며, -m 옵션으로 가상 시스템에 할당할 메모리 크기를 지정한다.

qemu-system-x86_64 -hda disk_image.img -m 512 -boot d
  • -hda: 사용할 디스크 이미지 파일 지정
  • -m: 메모리 크기 설정 (512MB)
  • -boot d: 부팅 장치를 CD-ROM으로 지정

2. ISO 파일을 통한 부팅

ISO 파일로부터 직접 부팅하려면 -cdrom 옵션을 사용해 ISO 파일을 지정한다. 아래 예시는 linux.iso 파일을 사용해 시스템을 부팅하는 명령이다.

qemu-system-x86_64 -cdrom linux.iso -boot d -m 1024
  • -cdrom: 부팅할 ISO 파일 지정
  • -boot d: CD-ROM에서 부팅
  • -m 1024: 1024MB 메모리 할당

3. 네트워크 설정 추가

네트워크를 활성화하려면 -netdev-device 옵션을 사용해 네트워크 인터페이스를 설정할 수 있다. 다음 예제는 기본 네트워크를 사용하는 명령이다.

qemu-system-x86_64 -hda disk_image.img -netdev user,id=mynet0 -device e1000,netdev=mynet0
  • -netdev user,id=mynet0: 사용자 모드 네트워크 인터페이스 정의
  • -device e1000,netdev=mynet0: 네트워크 장치를 e1000으로 지정하고 mynet0 네트워크에 연결

4. ARM 시스템 에뮬레이션

QEMU를 이용해 ARM 시스템을 에뮬레이션할 수 있다. 아래 예시는 qemu-system-arm을 사용해 ARM 이미지를 실행하는 방법이다.

qemu-system-arm -M versatilepb -kernel vmlinuz-3.2.0-4-versatile -hda arm_disk.img -m 256 -append "root=/dev/sda1"
  • -M versatilepb: 사용할 머신 타입으로 versatilepb 지정
  • -kernel: 커널 이미지 파일 지정
  • -hda: 사용할 디스크 이미지 지정
  • -m 256: 256MB 메모리 할당
  • -append "root=/dev/sda1": 커널 파라미터 설정 (루트 파일 시스템 위치)

5. 스냅샷 모드 사용

스냅샷 모드를 사용하면 변경사항을 저장하지 않고 시스템을 실행할 수 있다. 다음은 스냅샷 모드를 활성화하는 명령이다.

qemu-system-x86_64 -hda disk_image.img -m 512 -snapshot
  • -snapshot: 모든 변경사항을 임시 저장소에 기록해 원본 이미지를 보호

repo 설치


repo는 Google에서 개발한 도구로, 여러 Git 저장소를 효율적으로 관리하고 협업할 수 있도록 설계되었다. Android 오픈소스 프로젝트(AOSP)와 같은 대규모 프로젝트에서 여러 Git 리포지토리를 통합 관리하는 목적으로 만들어졌다. repo는 Git 위에서 동작하며, 복잡한 멀티 리포지토리 구성을 지원하는 스크립트로서, Git의 명령어를 확장하여 한 번에 여러 리포지토리에서 작업을 수행할 수 있다.

설치방법

repo 지원하는 버전인 경우

sudo apt install repo

redo를 지원하지 않는 버전인 경우

mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
  1. mkdir ~/bin
    • 설명: 새로운 디렉토리를 생성하는 명령어입니다.
    • 작업: 사용자 홈 디렉토리(~) 안에 bin이라는 이름의 디렉토리를 생성합니다.
    • 용도: 사용자 정의 실행 파일이나 스크립트를 저장하는 데 자주 사용됩니다.
  2. PATH=~/bin:$PATH
    • 설명: 현재의 PATH 환경 변수를 수정하는 명령어입니다.
    • 작업: ~/bin 디렉토리를 PATH의 가장 앞에 추가하여, 이 디렉토리에 있는 실행 파일을 쉽게 호출할 수 있게 합니다.
    • 유효성: 이 명령어는 현재 세션에서만 유효하며, 영구적으로 적용하려면 사용자 설정 파일(~/.bashrc 등)에 추가해야 합니다.
  3. curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
    • 설명: URL에서 데이터를 가져오는 명령어입니다.
    • 작업: 지정된 URL에서 repo 파일을 다운로드하고, 이를 ~/bin/repo라는 경로에 저장합니다.
    • 리다이렉션: > 기호는 명령어의 출력을 지정한 파일로 리다이렉트하는 역할을 합니다.
  4. chmod a+x ~/bin/repo
    • 설명: 파일이나 디렉토리의 권한을 변경하는 명령어입니다.
    • 작업: ~/bin/repo 파일에 실행 권한을 추가하여, 모든 사용자가 실행할 수 있도록 설정합니다.
    • 용도: 이제 사용자는 터미널에서 repo라는 명령어를 입력하여 이 파일을 실행할 수 있습니다.

주요 기능

  1. 멀티 리포지토리 관리: repo는 여러 Git 저장소를 하나의 프로젝트처럼 관리할 수 있게 해준다. 각각의 리포지토리를 개별적으로 다루지 않고, repo 명령어를 사용해 모든 리포지토리에 걸쳐 작업할 수 있다.

  2. 동기화(sync): repo sync 명령어를 통해 모든 저장소의 최신 변경 사항을 한 번에 가져올 수 있다. 이를 통해 프로젝트의 모든 리포지토리를 동기화하여 최신 상태로 유지할 수 있다.

  3. 브랜치 관리: repo는 여러 리포지토리에 걸쳐 브랜치를 생성하고 관리할 수 있다. 이를 통해 프로젝트 전체의 버전 관리를 간소화할 수 있다.

  4. Manifest 파일 관리: repo는 XML 기반의 manifest 파일을 사용하여 관리할 저장소 목록과 해당 브랜치를 지정한다. 이 manifest 파일을 통해 프로젝트의 구조를 정의하고, 각 저장소의 위치와 설정을 관리할 수 있다.

설치 및 사용

repo는 Python 스크립트로 제공되며, 설치 후 repo init, repo sync 명령어를 통해 초기화하고 동기화할 수 있다. Android 프로젝트에서는 repo를 통해 코드베이스를 쉽게 클론하고, 여러 리포지토리를 한 번에 관리할 수 있는 유용한 도구로 사용된다.

장점과 한계

  • 장점: 대규모 멀티 리포지토리 프로젝트를 쉽게 관리하고, 동기화 및 브랜칭을 단순화한다.
  • 한계: Git 위에서 작동하기 때문에 Git 자체에 대한 의존성이 있으며, 규모가 작은 프로젝트에서는 그 효용성이 떨어질 수 있다.

repo는 주로 Android와 같이 수백 개의 리포지토리로 구성된 대형 프로젝트에서 사용되며, 그 외에도 멀티 리포지토리 관리가 필요한 프로젝트에서 활용될 수 있다.

QEMU에 OP-TEE 구동하기


작업 디렉토리 생성

mkdir optee_qemu
cd optee_qemu

레포 설정

레포초기화

repo init -u https://github.com/OP-TEE/manifest.git -m default.xml -b 3.19.0

이 명령어는 OP-TEE 프로젝트의 버전 3.19.0에 해당하는 소스 코드와 하위 모듈을 초기화한다. 이후 repo sync 명령어를 실행하면 지정된 버전의 코드와 구성 요소가 모두 다운로드된다.

명령어 repo init -u https://github.com/OP-TEE/manifest.git -m default.xml -b 3.19.0는 Google의 repo 도구를 사용해 특정 리포지토리의 소스 코드와 관련된 프로젝트 환경을 초기화하는 작업이다. 각 옵션별 역할은 다음과 같다:

  1. repo init:
    • repo 도구를 이용해 새 프로젝트 환경을 초기화하는 명령어이다.
    • .repo라는 디렉토리를 생성하고, 설정 파일 및 기본적인 메타데이터를 다운로드한다.
  2. -u https://github.com/OP-TEE/manifest.git:
    • -u 옵션은 초기화할 메타 리포지토리의 URL을 지정한다.
    • https://github.com/OP-TEE/manifest.git 리포지토리는 OP-TEE 프로젝트의 메타데이터와 구성 파일들을 포함한다.
    • OP-TEE는 ARM의 트러스트존을 이용한 오픈소스 신뢰 실행 환경(TEE) 프로젝트로, 이 리포지토리에서 소스 코드를 가져오려는 목적이다.
  3. -m default.xml:
    • -m 옵션은 사용할 manifest 파일을 지정한다.
    • default.xml 파일은 프로젝트의 Git 리포지토리 구성과 관리를 위한 정보를 담고 있다.
    • 이 파일은 프로젝트의 필수 구성 요소와 하위 모듈 위치 등을 정의하고, 이후 repo sync 명령으로 필요한 리포지토리들을 정확히 다운로드할 수 있게 한다.
  4. -b 3.19.0:
    • -b 옵션은 체크아웃할 브랜치 또는 태그를 지정한다.
    • 3.19.0 버전을 지정해 해당 버전의 코드와 설정 파일이 다운로드되도록 한다.

레포 동기화

repo sync --no-clone-bundle

repo sync --no-clone-bundle 명령어는 프로젝트의 모든 소스 코드와 리포지토리를 최신 상태로 동기화하며, 번들 파일을 사용하지 않고 직접 클론하여 동기화한다. 이를 통해 특정 환경에서 발생할 수 있는 클론 속도 문제를 해결할 수 있다.

repo sync --no-clone-bundle 명령어는 repo 도구를 사용해 프로젝트의 모든 소스 코드와 리포지토리를 동기화하는 작업이다. 각 옵션의 역할은 다음과 같다:

  1. repo sync:
    • repo 도구를 이용해 초기화된 프로젝트의 소스 코드와 구성 요소를 원격 저장소와 동기화하는 명령어이다.
    • 이 명령어는 repo init 명령으로 설정한 모든 Git 리포지토리를 다운로드하거나 업데이트한다.
    • 프로젝트 구성 파일과 하위 모듈 등을 최신 상태로 가져와, 프로젝트의 일관성을 유지하도록 돕는다.
  2. --no-clone-bundle:
    • 이 옵션은 기본적으로 repo가 사용하는 clone.bundle 파일을 사용하지 않도록 한다.
    • clone.bundle은 초기 클론 속도를 높이기 위해 Google의 저장소에서 제공하는 번들 파일이다.
    • 이 옵션을 지정하면 repo sync는 각 리포지토리를 직접 클론하여 최신 변경 사항만을 가져오기 때문에, 인터넷 속도나 번들 파일 문제가 있는 경우 유용하다.

도구 체인 가져오기

동기화가 완료되면 빌드 디렉토리로 이동하여 부트로더, 커널, OP-TEE 및 사용할 파일 시스템을 빌드하는 데 필요한 도구 체인을 가져온다. 다음 명령어를 실행한다.

$ cd build
$ make toolchains

추가로 설치가 필요했던 두구를 정리한다.

sudo apt install python3-pyelftools

sudo apt install device-tree-compiler #dtc는 장치 트리 파일을 컴파일하기 위해 필요

sudo apt install build-essential # cc는 일반적으로 gcc와 같은 컴파일러의 심볼릭 링크로, 컴파일을 위해 필수적인 프로그램이 필요하다. build-essential 패키지에는 gcc, g++, make 등 기본적인 빌드 도구가 포함되어 있다.

sudo apt install bison

sudo apt install flex

sudo apt install libssl-dev # Debian 기반 시스템에서 OpenSSL 개발 패키지를 설치

sudo apt install python-is-python3 # python이라는 명령어를 python3에 연결해 주는 패키지를 설치

sudo apt install unzip

이미지 만들기 및 실행

make run

에러

make[3]: *** [/home/gbh_admin/optee_qemu/optee_os/out/arm/export-ta_arm32/mk/link.mk:120: out/a734eed9-d6a1-4244-aa50-7c99719e7b7b.ta] Illegal instruction (core dumped)
make[2]: *** [package/pkg-generic.mk:296: /home/gbh_admin/optee_qemu/out-br/build/optee_examples_ext-1.0/.stamp_built] Error 2
make[1]: *** [Makefile:23: _all] Error 2
make[1]: Leaving directory '/home/gbh_admin/optee_qemu/out-br'
make: *** [common.mk:346: buildroot] Error 2
  1. kvm삭제
    sudo apt remove --purge qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils
    sudo apt autoremove
    
  2. 확인해보니 우분투 버전별 도커파일이 존재했다. 링크 이것을 참고하여 진행해보자 2-1. 패키지 추가 설치
    sudo apt install -y android-tools-adb android-tools-fastboot autoconf automake bc bison build-essential ccache cpio cscope curl device-tree-compiler expect flex ftp-upload gdisk git iasl libattr1-dev libcap-ng-dev libfdt-dev libftdi-dev libglib2.0-dev libgmp3-dev libhidapi-dev libmpc-dev libncurses5-dev libpixman-1-dev libslirp-dev libssl-dev libtool make mtools netcat ninja-build python-is-python3 python3-crypto python3-cryptography python3-pip python3-pyelftools python3-serial rsync unzip uuid-dev wget xdg-utils xterm xz-utils zlib1g-dev
    

2-2 make -j2 toolchains make -j$(nproc) check

2-3 툴체인 수동저장

sudo apt-get install android-tools-fastboot autoconf bison cscope curl \ flex gdisk libc6:i386 libfdt-dev libglib2.0-dev \ libpixman-1-dev libstdc++6:i386 libz1:i386 netcat \ python-crypto python-serial uuid-dev xz-utils zlib1g-dev

repo init -u https://github.com/OP-TEE/manifest.git -m default_stable.xml -b master

repo sync

make toolchains

  • 첫 번째 툴체인 파일 다운로드

wget -P $HOME/gbh_admin/optee_temp/toolchains http://releases.linaro.org/14.08/components/toolchain/binaries/gcc-linaro-arm-linux-gnueabihf-4.9-2014.08_linux.tar.xz

  • 두 번째 툴체인 파일 다운로드

wget -P $HOME/gbh_admin/optee_temp/toolchains http://releases.linaro.org/14.08/components/toolchain/binaries/gcc-linaro-aarch64-linux-gnu-4.9-2014.08_linux.tar.xz

  • 세 번째 툴체인 파일 다운로드

wget -P $HOME/gbh_admin/optee_temp/toolchains http://releases.linaro.org/14.07/components/toolchain/binaries/gcc-linaro-aarch64-none-elf-4.9-2014.07_linux.tar.xz

curl -o $HOME/gbh_admin/optee/build/toolchain.mk https://gist.githubusercontent.com/hybridNeo/1cc0d49d510e4d8e9320/raw

make all run

  1. 툴체인 버전 변경

3-1 툴체인 버전확인

build (master)$ ../toolchains/aarch64/bin/aarch64-linux-gnu-gcc –version head -1

aarch64-linux-gnu-gcc (Arm GNU Toolchain 11.3.Rel1) 11.3.1 20220712

3-2 12.3다운 https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads/12-3-rel1

wget –content-disposition “https://developer.arm.com/-/media/Files/downloads/gnu/12.3.rel1/binrel/arm-gnu-toolchain-12.3.rel1-x86_64-aarch64-none-linux-gnu.tar.xz?rev=cf8baa0ef2e54e9286f0409cdda4f66c&hash=4E1BA6BFC2C09EA04DBD36C393C9DD3A”

3-3 압축해제

tar -xvf arm-gnu-toolchain-12.3.rel1-x86_64-aarch64-none-linux-gnu.tar.xz -C ./

OP-TEE 사용 방법(예제)


OP-TEE에서는 보안 애플리케이션(TA: Trusted Application)과 일반 애플리케이션(CA: Client Application)이 별도로 작성된다.

1. 신뢰 애플리케이션(TA) 개발

  • TA는 보안 영역에서 실행되며, 민감한 데이터를 처리한다. 예를 들어, 암호화 작업을 수행하는 TA를 개발할 수 있다.
  • TA는 OP-TEE API를 사용하여 기본 암호화 함수 및 키 관리 기능을 구현할 수 있다.
#include <tee_internal_api.h>
#include <tee_internal_api_extensions.h>

TEE_Result encrypt_data(const uint8_t *in, size_t in_size, uint8_t *out, size_t *out_size) {
    // 암호화 로직 구현
    // 예를 들어, AES 암호화 등을 수행하여 결과를 out에 저장
}

2. 클라이언트 애플리케이션(CA) 개발

  • CA는 일반 영역에서 실행되며, TA와 통신하여 보안 작업을 요청한다.
  • CA는 OP-TEE Client API를 사용하여 TA를 호출한다.
#include <tee_client_api.h>

int main() {
    TEEC_Context ctx;
    TEEC_Session sess;
    TEEC_Operation op;
    TEEC_Result res;

    // OP-TEE 컨텍스트 초기화
    res = TEEC_InitializeContext(NULL, &ctx);

    // 세션 열기 및 TA 호출
    TEEC_OpenSession(&ctx, &sess, &ta_uuid, TEEC_LOGIN_PUBLIC, NULL, NULL, &err_origin);
    // 보안 애플리케이션 호출
}

3. 보안 애플리케이션 호출 및 데이터 처리

CA는 필요한 데이터를 TA에 전달하여 보안 처리를 요청한다. 예를 들어, 암호화할 데이터를 보낸 후 암호화된 결과를 수신한다.

4. 실행 및 테스트

개발이 완료되면, 보안 애플리케이션을 OP-TEE가 설치된 보드에서 실행하여 신뢰할 수 있는 환경에서 데이터 처리가 올바르게 수행되는지 확인한다.

이와 같이 OP-TEE를 활용하면 민감한 데이터 처리를 안전하게 분리할 수 있다.

OP-TEE에 OpenSSL 적용하기


OP-TEE의 Trusted Application(TA)에서 OpenSSL을 사용하는 것도 가능하다. 다만, OpenSSL은 일반적으로 REE(비신뢰 영역)에서 사용하는 라이브러리이며, TEE(신뢰 영역) 내에서는 보안 요구사항이 다르기 때문에, 약간의 설정과 빌드 작업이 필요하다. TEE는 보안 영역 내에서 경량화된 암호화 라이브러리를 사용하는 것이 일반적이지만, 특정한 요구사항이 있다면 OpenSSL을 신뢰 애플리케이션에서 사용할 수 있다.

다음은 OP-TEE의 TA에서 OpenSSL을 사용하는 방법을 간략히 설명한다:

1. OpenSSL을 신뢰 영역에 포팅

OpenSSL을 OP-TEE의 TEE 환경에서 사용하려면 OpenSSL 라이브러리를 TA와 함께 빌드하여 신뢰 영역으로 포팅해야 한다. 이를 위해, OpenSSL 소스를 신뢰 영역에 맞게 수정하고, OP-TEE 빌드 시스템과 호환되도록 구성해야 한다.

  1. OpenSSL 소스 준비: OpenSSL 소스 코드를 신뢰 애플리케이션에서 사용하도록 가져온다.

  2. 설정 및 빌드 구성:
    • OpenSSL을 TEE 환경에 맞추어 빌드하려면, 컴파일 플래그와 설정을 TEE의 경량화된 환경에 맞게 최적화한다. 예를 들어, no-async, no-threads, no-shared와 같은 플래그를 사용하여 불필요한 기능을 비활성화하고 빌드 시간과 메모리 사용량을 줄일 수 있다.
  3. 크로스 컴파일: 일반적인 리눅스 환경에서는 OP-TEE TEE OS용 크로스 컴파일러를 사용하여 OpenSSL 라이브러리를 빌드해야 한다.

2. 설치 및 크로스 컴파일 방법

  1. openssl 다운

  2. ./Configure linux-generic32 no-shared no-threads –prefix=/tmp/openssl

: no-shared 는 TA가 shared library를 지원하지 않기 때문

no-threads는 TA가 pthreads를 지원하지 않기 때문

  1. make CC=arm-linux-gnueabihf-gcc RANLIB=arm-linux-gnueabihf-ranlib LD=arm-linux-gnueabihf-ld MAKEDEPPROG=arm-linux-gnueabihf-gcc && make install CC=arm-linux-gnueabihf-gcc RANLIB=arm-linux-gnueabihf-ranlib LD=arm-linux-gnueabihf-ld MAKEDEPPROG=arm-linux-gnueabihf-gcc PROCESSOR=ARM

  2. library 복사

  • optee_os/out/arm/export-ta_arm32/lib로 libssl.a libcrypto.a 복사
  1. include 복사
  • optee_os/out/arm/export-ta_arm32/include에 openssl 디렉토리 추가 후 header 파일 복사
  1. optee_os/out/arm/export-ta_arm32/mk/ta_dev_kit.mk 수정
: ifeq ($CFG_TA_OPENSSL), y) 추가 후

libnames += ssl (libssl.a)

libdeps += $(ta-dev-kit-dir)/lib/libssl.a

libnames += crypto (libcrypto.a)

libdeps += $(ta-dev-kit-dir)/lib/libcrypto.a

endif

  1. optee_os/out/arm/export-ta_arm32/mk/conf.mk 수정

: CFG_TA_OPENSSL :=y 추가

2. TA에서 OpenSSL 함수 사용

OpenSSL 라이브러리가 빌드되고 TEE와 함께 통합되면, TA 코드에서 OpenSSL 함수를 사용할 수 있다.

#include <openssl/aes.h>
#include <openssl/rand.h>

// AES 암호화를 예로 든 코드
void encrypt_data_with_openssl(const uint8_t *plaintext, size_t plaintext_len, uint8_t *key, uint8_t *iv, uint8_t *ciphertext) {
    AES_KEY enc_key;
    AES_set_encrypt_key(key, 128, &enc_key);
    AES_cbc_encrypt(plaintext, ciphertext, plaintext_len, &enc_key, iv, AES_ENCRYPT);
}

3. 보안 및 성능 고려사항

OP-TEE TEE 환경에서는 성능과 보안을 위해 경량화된 암호화 라이브러리(예: mbedTLS)를 사용하는 것이 권장된다. OpenSSL은 기능이 풍부하지만, 리소스가 제한된 TEE 환경에서 사용하기에 최적화되지 않을 수 있다. TEE 내에서 OpenSSL을 사용하면 메모리 사용량이 증가할 수 있으며, 이에 따른 성능 저하와 보안상의 추가 고려가 필요할 수 있다.

주의

TA에서는 기본적으로 MbedTLS를 사용한 암복호화 기능을 제공한다. 임베디드에 더 적합화된 경량툴임으로 이를 잘 사용하는 것이 더 좋은 솔루션일 수 있다.

참조


중요

새로운시도

https://blooggspott.blogspot.com/2022/04/op-tee-3.html#more

https://howtorunopteeonqemuarmv8v7.quora.com/

https://www.youtube.com/watch?v=FthDUSW3yQY&t=230s

https://github.com/OP-TEE/build/issues/747

https://github.com/OP-TEE/optee_os/issues/6454

https://m.blog.naver.com/hw5773/221315550911

공식문서 buid and run https://optee.readthedocs.io/en/latest/building/index.html

gui있으면 기대할만한거: https://blooggspott.blogspot.com/2022/04/op-tee-3.html#more