First, make sure you have xcode command line developer tools installed with $ xcode-select --install
Then, just run the following to install the latest version of avr-gcc: $ brew tap osx-cross/avr $ brew install avr-gcc $ brew install avr-gdb
5. avr-gdb 를 이용한 디버깅 실행
avr-gdb 명령어 실행
user@bk-mac:~/ctf $ avr-gdb ./atme.elf
GNU gdb (GDB) 10.1
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "--host=x86_64-apple-darwin20.6.0 --target=avr".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
qemu에 실행되어 있는 ELF 파일에 원격 연결
(gdb) target remote :1234
Remote debugging using :1234
warning: Target-supplied registers are not supported by the current architecture
0x00000000 in __vectors ()
이 글에서 작성할 환경 설정은 nested(중첩) VM을 생성하고 이 내부에서 Hyper-V guest의 하이퍼바이저와 루트 파티션의 커널을 디버깅하기 위함입니다. Hyper-V는 하이퍼바이저 중에서도 Type-1 방식이기 때문에 Host 에서는 커널과 하이퍼바이저를 디버깅할 수 없습니다. 이를 위해 게스트를 만들고 그 안에 Hyper-V를 활성화(nested vm)하고 모든 것을 구성하여 디버깅을 할 것입니다. 다행히도 Hyper-V는 이 방식에서 활용할 중첩 가상화를 지원합니다. 디버깅 환경은 아래 이미지와 같습니다.
디버깅하려는 하이퍼바이저 내부에 다른 하이퍼바이저의 게스트로 실행합니다. 간단히 말해서 L0 루트 파티션의 사용자 공간에서 L1 하이퍼바이저와 루트 파티션의 커널을 디버그합니다.
L1게스트 내부에서 하이퍼바이저를 디버깅할 것이므로 L1게스트 내부에서도 Hyper-V를 활성화해야 합니다( 여기에 문서화됨 ). 나중에 게스트 VM을 재부팅합니다.
이제 디버깅을 활성화하기 위해 BCD 변수를 설정해야 합니다. L1 게스트(방금 설정한 내부 OS) 내부에서 cmd.exe (관리자 권한) 에서 다음을 실행합니다. 아래와 같이 설정을 하면 부팅 후에 적용됩니다
command
# 직렬 포트를 통해 Hyper-V 디버깅 활성화
bcdedit /hypervisorsettings serial DEBUGPORT:1 BAUDRATE:115200
bcdedit /set hypervisordebug on
# Hyper-V가 부팅 시 실행되도록 활성화하고 커널을 로드
bcdedit /set hypervisorlaunchtype auto
# 다른 직렬 포트를 통해 커널 디버그 활성화
bcdedit /dbgsettings serial DEBUGPORT:2 BAUDRATE:115200
bcdedit /debug on
# 테스트 커널 드라이버를 load 할 일이 있을 경우, 아래 기능 활성화
bcdedit /set TESTSIGN on
참고 이미지
앞서 설정한 직렬포트와 연결하기 위해서는 Level 0 VM에서 아래와 같이 셋팅한다.
Level 1 VM (guestOS) 종료하기
Level 1 VM 설정하기
Hyper-V 관리자에서 Level1 VM 오른쪽 버튼 클릭 -> [설정] -> 왼쪽 탭에서 [하드웨어] -> [COM1]을 선택
Partition은 hypervisor 위에서 실행되는 다른 VM들을 말합니다. 파티션은 Root partition(또는 부모 파티션), enlightened guest partitions, unenlightened guest partitions 와 같이 3가지 유형으로 구분되며, 이 중에서도 Root partion 은 다른 vm과 달리 host OS를 말합니다. root partition은 웹 브라우저처럼 일반적인 프로그램들을 실행할 수 있는 Windows OS 이지만 가상화 스택의 일부는 root partion kernel과 userspace에서 실행됩니다. 루트 파티션은 하이퍼바이저와 함께 작동하는 특별한 권한이 부여된 게스트 VM으로 생각할 수 있습니다.
예를 들어, Hyper-V Management Services 는 root partion 에서 실행되고 새로운 guest partion 을 생성할 수 있습니다. 다시말해 hyper call 을 이용하여 hypervisor kernel과 통신을 합니다. 통신을 하기 위해서는 더 높은 상위 API가 있는데 그 중 하나는 VMBus 입니다. VMBus는 가상화 Stack에서 가장 많이 사용하는 cross-partiion IPC 구성요소 입니다.
2) Enlightened IO
guest partition 용 가상화 기기는 Storage, Networking, Graphic 및 입력 서브 시스템에 대해 Enlightened(계몽or향상) I/O 라는 기능도 활용할 수 있습니다. Enlightened I/O는 VMBus 위에서 실행되는 통신 프로토콜(예: SCSI) 가상화에 적합한 구현입니다. 이것은 게스트가 가상화 스택을 인식하고 있기 때문에(이런 이유로 "englightened"라 칭함) 더 나은 성능과 기능을 제공하는 device emulation layer를 우회합니다. 그러나 이 기능(Enlightended IO) 을 사용하려면 게스트 VM용 특수 드라이버가 필요합니다.
Hyper-V 통합 서비스를 설치할 때 Hyper-V enlightened I/O 와 a hypervisor aware kernel 을 사용할 수 있습니다. VSC(Virtual Server Client) 드라이버를 포함하는 통합 구성 요소는 Windows 및 일반 리눅스 배포판 일부에서 하용할 수 있습니다.
3) Generation (1세대 / 2세대)
Hyper-V에서 게스트 파티션을 만들 때 "1세대" 또는 "2세대" 게스트를 선택할 수 있습니다. 두 가지 유형의 VM 간의 차이점에 대해 설명하지 않겠지만, 1세대 VM은 대부분의 게스트 운영 체제를 지원하는 반면 2세대 VM은 보다 제한된 운영 체제(대부분 64비트)를 지원한다는 점을 알아야 합니다. 이 게시물에서는 1세대 VM만 사용하겠습니다. "1세대"와 "2세대"의 차이점에 대한 자세한 설명은 여기에서 볼 수 있습니다.
4) Summary
요약하자면 일반적인 가상화 설정은 다음과 같습니다.
Root Partition
Enlightened child partitions
Unenlightened child partitions
Windows
Windows or Linux
FreeBSD, legacy Linux ...
5) EOD
이 블로그 게시물에 대해 알아야 할 모든 것입니다. 자세한 내용은 이 프레젠테이션 또는 TLFS를 참조 하세요.