[임베디드] 부트로더와 U-boot (수정중)
2021. 10. 27. 00:37부트로더란.
- 일종의 프로그램
- 바이오스 같은거
- 보통 플래시메모리는 부트로더가 탑재됨.
- 포팅(이식)이란?
보통 범용소스를 이용하여, 특정 soc 또는 보드에서 동작하도록 소스를 수정하는 작업.
부트로더의 역할
-타깃 초기화
-타깃 동작환경 설정
-시스템 운영체제 부팅
-플래시 메모리 관리
부트로더의 특징
-하드우어 의존성이 강함. (프로세서의 구조와 특징 및 사용법 알아야함)
-시작부분은 어셈블리어로 작성되기때문에, 명령어 사용법을 알고 있어야함.
-콘솔을 구현하려면 UART 제어기의 구조와 제어방법을 숙지해야하고,
-네트워크 및 USB를 이용하려면, 이더넷 제어기 및 USB 디바이스 제어기에 대해서도 알아야함.
다양한 부트로더
- LILO, GRUB, Loadlin, EtherBoot, Blob, PMON, RedBoot, U-Boot 등 여러가지 부트로더가 있음.
- 부트로더의 기본 기능만 제공한다면, 어떤 종류의 부트로더를 사용해도 무방함.
- U-boot는 가장 활발하게, 개발되고 다양하게 사용되는 공개 부트로더임.
- U-boot는 PPCboot와 ARMBoot 프로젝트를 기반으로 개발됨. (다양한 PPC또는 ARM프로세서 기반의 타깃보드를 지원함)
- U-boot는 TFTP를 이용하여 운영체제 부팅가능함. 게다가, 플래시 메모리, IDE, SCSI 등 다양한 매체를 이용해 부팅가능함. JFFS2파일시스템을 비롯한 다양한 파일시스템을 관리하는 기능도 있음.
- U-boot는 다양한 명령어와 스크립트를 지원함. 그리고 모니터 기능까지 있음.
- U-boot는 임베디드 리눅스 기반의 시스템에서 많이 사용됨.
- U-boot는 리눅스와 유사한 구조를 가지고 있음.
U-boot에 대해서.
- U-Boot는 시스템에 리셋 키가 입력되거나, 전원이 인가되면 실행되는 부트코드다.
(사실, Exynos4412는 전원이 인가되자마자, U-Boot와 같은 사용자 부트로더를 실행하지 않음. 내부 ROM에서 시작되어 칩의 OM(Operating Mode)에 다라서, 부트 디바이스를 찾고 나서야 사용자 부트로더가 실행됨.)
- U-boot는 전원 인가 시에 플래시 메모리에 그 코드를 가지고 있음.
- 하지만, NAND플래시나 eMMC 등 CPU에서 어드레스 접근이 불가능한 장치를 부트 디바이스로 사용하는 경우,
부트코드를 주메모리장치인 DRAM으로 복사해서 사용함.
- 즉, NAND플래시, eMMC등의 장치에 대해선, 부트코드를 주메모리장치인 DRAM으로 복사해서 사용함.
이때, CONFIG_SYS_TEXT_BASE는 복사된 DRAM 위치의 가상 주소를 나타냄.
- 타깃 보드 디렉터리의 링커 스크립트 파일 u-boot.lds는 U-Boot의 메모리 배치 정보를 나타냄.
- 만약 타깃 보드 디렉터리에 링커 스크립트 파일이 있으면, U-Boot 빌드 시 armv7/u-boot.lds보다 우선함.
- 리셋 인가 후 NAND 플래시나 MMC의 부트 영역에 있는 코드 부트영역을 Exynos 내부의 SRAM으로 복사함. 이 복사된 SRAM 영역에 언급된 기능들이 맨 앞에 배치됨.
- 리눅스에서 머신 아키텍쳐(또는 머신타입)은 타깃이름으로 지정함. 이 번호는 리눅스를 타깃별로 관리하는 데 아주 요긴하게 사용됨. 이 정보는 부트로더로부터 ARM레지스터 R1로 전달됨.
U-Boot 빌드
- U-Boot를 빌드하기 전에 대상 시스템을 위한 환경 설정을 해야됨.
- 새로운 시스템을 개바하는 경우에, 대상 시스템에 맞게 수정해야함.
이 경우, 대상 제품과 최대한 유사한, 프로세서와 보드를 선정하여 환경을 설정한 후 빌드해야함.
예를 들어, 아래와 같이 DTK4412 보드용 설정 명령을 내려줌.
# make dtk4412_config
Configuring for dtk4412 board...
- 환경 설정이 완료되면 의존성을 검사하고 소스를 빌드함.
- 의존성 검사는 파일 간의 상호 관계를 설정하는 것으로, 향후 수정된 파일이 있으면, 관계된 파일을 같이 빌드하기 위해 사용됨.
- 의존성 검사는 u-boot top 디렉터리에서 다음과 같은 명령어에 의해 실행함.
# make dep
Generating include/autoconf.mk
...
의존성 검사가 완료되면 u-boot top 폴더에서 다음과 같이 빌드함.
# make
arm-note-linux-gnueabi-gcc -DDO_DEPS_ONLY \
....
- 빌드가 완료되면, 빌드된 오브젝트 파일을 링크하여, 새로운 실행 가능한 오브젝트 파일이 생성됨.
- 링크 후 생성되는 실행 가능한 파일은 ELF 형식의 바이너리로 생성됨.
- 또한, 플래시에 탑재하기 위해 바이너리 이미지도 생성함.
- 이 바이너리 이미지는 형식 변환 툴에 의해, 기계 코드와 데이터만을 가짐.
표 15-5 U-boot 빌드 후 생성되는 파일
파일 이름 | 설명 |
u-boot.map | 심볼 맵을 가지는 파일 |
u-boot | ELF 형식의 U-Boot 이미지 파일 |
u-boot.bin | 플래시 메모리에 탑재되는 순수 바이너리 이미지 파일 |
u-boot.srec | 모토로라 S-Record 형식의 U-Boot 이미지 파일 |
- 향후 U-boot를 개발 대상 시스템페 포팅하기 위해서는, U-Boot 내의 소스파일을 수정하고 다시 빌드하는 과정을 반복해야함.
- 이 경우, U-Boot를 다시 빌드할 때에는 별도의 환경 지정이나 의존성 검사 없이 u-boot top 폴더에서 make 명령만을 사용하여 빌드하면 됨.
대상 보드에 U-Boot 탑재
- 개발된 U-Boot 바이너리는 대상 시스템 보드의 플래시에 탑재되어야함.
- 플래시에 탑재되는 파일은 U-Boot 빌드 후 생성된 u-boot.bin 파일을 사용함.
부트로더 탑재하는 방법은 4가지 방법이 있음.
1. 전용 플래시 메모리 프로그래밍 장비를 이용하여 탑재하는 방법
개발 중에는 사용하지 않고 양살할 때에 사용함.
-> 사용하지 않는 추세.
2. 전용 디버깅 툴과 ICE 장비를 사용하여 플래시에 탑재하는 방법.
440쪽에 언급했었음. 이 방법은 개발 중에 부트로더를 플래시에 탑재하는 가장 좋은 방법으로 디버깅할 수있음.
하지만 고가의 ICE장비가 필요.
3. JTAG 동글을 활용하여 플래시에 탑재하는 방법
440쪽에 언급했엇음. 저가로 쉽게 구현하여 사용할 수 있기 때문에 널리 사용됨.
4. 기존에 탑재된 부트로더를 이용하여 탑재하는 방법
이 방법은 기존에 동작하는 부트로더가 있는 것을 가정하고 있음.
그래서 일부 부트로더의 기능이 수정되거나 기능이 추가될 때 사용할 수 있음.
4번째 방법에 관해서.
- 대부분의 부트로더는 시리얼, USB, 네트워크 장치를 이용한 프로그램의 다운로드 및 실행 기능을 지원함.
- 이 책에서 사용되는, (ARM으로 배우는 임베디드 리눅스 시스템) 부트로더도,
시리얼과 USB를 이용한 다운로드 기능을 지원함.
- DTK4412에서 사용하는 부트로더의 USB 다운로드 명령은 dnw임.
- dnw라는 명령은 USB를 이용한 다운로드를 구현함 프로그램인데, 삼성에서 개발함.
- 이 명령은 타깃의 U-Boot 콘솔에서 실행됨.
- dnw 다음의 41e00000은 이미지를 다운로드해서 사용할 타깃 보드의 주 메모리 주소를 나타냄.
- 다운로드 이후에 체크섬에 문제가 없으면 다운로드가 정상 종료된 것임.
- dnw
호스트 컴퓨터에서 dnw 프로토콜에 맞도록 바이너리 파일 전송 방법은 smdk-usbdl유틸리티를 사용함.
방법은 아래와 같음
$ smdk-usbdl -f <파일이름> -a <다운로드 우치>
<파일 이름>은 타깃으로 전송하려는 파일 이름이고, <다운로드 위치>는 타깃의 다운로드 메모리 위치를 지정.
아래의 명령은 호스틑에서 smdk-usbdl 명령을 사용하여 u-boot.bin을 해당 메모리 위치로 전송.
# ./smdk-usbdl -f u-boot.bin -a 0x41e00000
- 다운로드 이후에는, 저장 장치에 기록하는 U-boot 명령을 이용하여,
U-Boot를 타깃에 탑재함.
- 예를 들어,
* NAND 플래시를 사용한다면, nand erase와 nand write 명령을 이용하면 됨.
* SD 또는 MMC 장치를 사용한다면, movi 명령을 사용하면 됨.
각 장치마다 해당 장치에 맞는 기록방법을 이용해 메모리에 저장하면 됨.
다음은 일례로,
SD/MMC에 각 이미지를 기록하는 U-Boot 명령을 사용하는 방법을 보여준다.
// Initialize moviNAND and show card info
movi init
// Read data from sd/mmc
movi read (u-boot | kernel } {device_number} {addr}
// Write data to sd/mmc
movi write {fwbl1 | u-boot | kernel} device_number} {addr}
// Write rootfs data to sd/mmc by size
movi write rootfs {device_number} {addr} [bytes(hex)]
// instead of this, you can see "mmc write"
movi write {sector#} {device_number} {bytes(hex)} {addr}
- exynos4412와 SD/MMC 또는 eMMC를 부트디바이스로 사용하는 경우,
위에서 생성된 u-boot.bin을 2개 부분으로 나누어 각 파티션에 저장해 사용함.
- 근래에는 dnw 명령보다 fastboot 명령을 많이 사용함.
U-Boot 실행
- 업데이트 프로그램이 종료되면, 부트 디바이스의 부트 영역에는 새로운 U-Boot 이미지가 탑재됨.
- 새 이미지를 이용하여 시스템이 다시 시작됨.
- 이때 화면을 보면 U-Boot가 빌드된 날짜와 시간을 확인할 수 있음.
U-Boot 활용
- U-Boot 탑재를 완료했으니, 명령행에서 help를 입력하여, U-Boot 명령어를 확인할 수 있음.
- 몇가지 U-boot에 관한 중요 명령어는 아래와 같음
(U-Boot 프롬프트에서 help 명령을 입력한 화면)
DTK4412 # help
? - alias for 'help'
....
[표 15-6] 주로 사용되는 U-Boot 명령어 (p547)
명령어 | 설명 |
bdinfo | 타깃 보드에 대한 정보를 출력 |
coninfo | 콘솔 장치에 대한 디바이스 정보를 출력 |
iminfo | 이미지 헤더 정보를 출력 |
base | 메모리의 베이스 주소를 설정하거나 출력 |
cp | 메모리의 내용을 복사(byte, word, long word) |
환경 변수 설정
- U-Boot는 다양한 환경 변수를 설정하여 사용할 수 있음.
- U-Boot에서 설정 가능한 환경변수는
- 운영체제 부팅 방법 및 부팅에 필요한 환경,
- 네트워크 사용에 필요한 환경,
- 표준입출력 장치에 대한 환경 변수.
등이 있고, 개발자에 의해 추가될 수 있음.
표 15-7 U-Boot의 환경 설정 명령
명령 | 용도 |
printenv | 현재 설정된 환경 변수 출력 |
setenv [변수 이름] [설정값] | 환경 변수 설정 |
saveenv | 설정된 환경 변수 기록 |
- U-Boot의 기본 환경 변수는 대상 보드별 환경 설정 정보를 지정하는 파일인, include/configs/dtk4412.h에 있는 값이 사용됨.
- saveenv 명령에 의해 환경 변수는 플래시 또는 EEPROM과 같은 기록장치에 저장됨.
[표 15-8] 주요한 U-Boot 환경변수
변수 이름 | 내용 |
autoload | 변수값이 no나 n으로 설정된다면 rarp, bootp, dhcp 명령은 BOOTP/DHCP 서버로부터 검색된 서버 정보를 통해 다운로드함. 그렇지 않은 경우 TFTP를 사용하여 다운로드 함. |
autostart | rarp, bootp, dhcp, tftp, disk, doob를 통해 로드된 부트 이미지를 자동으로 시작함. |
bootargs | 부팅 시 커널에 전달할 인수 |
- 환경 변수의 설정값 변경은 setenv 명령을 사용함.
- 변경된 환경변수는 saveenv 명령에 의해 이뤄짐.
DTK4412 # setenv ipaddr 192.168.1.10
dtk4412 # saveenv
Saving Environment to Flash....
다운로드
- 다운로드는 새로운 운영체제 커널이미지, 파일시스템 이미지를 비롯한 필요한 파일을 주메모리(SDRAM) 또는 플래시메모리에 내려받아 탑재하는 것을 말함.
- 일반적으로 다운로드 되는 파일은 주메모리에 탑재됨.
- DTK2440으로 만들어진 U-BOOT는 아래의 표 15-9와 같이 크게 3가지 방법으로 다운로드 가능,
명령 | 용도 | 사용법 | 예제 |
loadb | 시리얼로 다운로드 | loadb [주소] 속도 | loadb 40008000 115200 |
dnw | USB 다운로드 | dnw [주소] | dnw 40008000 |
fastboot | USB 다운로드 | fastboot | fastboot |
- 시리얼의 경우 속도를 지정해야함. 시리얼은 속도가 느리기 때문에, 커널이나 파일 시스템 이미지를 내려받는데 무리가 있기 때문.
- 하지만, 시리얼의 경우, 최초 U-Boot 개발 및 포팅 시 또는 간단한 앱을 내려받아 실행하는 경우엔 자주 사용됨.
fastboot.
- USB 인터페이스를 지원하는 U-Boot 명령으로 dnw와 fastboot 가 있음.
- fastboot는 호스트의 fastboot 응용 프로그램이 타깃과 USB로 통신함.
- 이렇게 통신하여, 이미지를 플래시나 기타 기록 장치에 저장함.
- 이 프로토콜은 안드로이드 플랫폼에서 사용하는 ADB 기능의 일부를 사용함.
- 실제로 안드로이드에서 커널 및 파일시스템을 저장할 때 많이 사용됨
- 다음은 타깃의 U-Boot 콘솔에서 fastboot 명령을 실행하는 방법.
DTK4412# fastboot
[Partition table on MoviNAND]
ptn 0 name = 'fwbl1' start = 0x2 len = N/A (use hard-coded info. (cmd: movi))
...
- 이제 호스트에서 fastboot 명령으로 필요한 이미지를 기록하자
$ fastboot flash kernel
- dnw 명령어는 플래시나 기타 기록 장치에 저장하지 않는다.
- 그리고, 간단하게 메모리로 내려 받아서 사용하는 경우 유용한다.
- 다음은 타깃의 U-Boot 콘솔에서 커널 이미지를 내려받기 위해 대기하는 명령.
DTK4412# dnw 40008000
OTG cable Connected!
Now, Waiting for DNW to transmit data
- 이 화면이 U-Boot에 출력이 되면, 호스트에서 DNW 애플리케이션을 이용하여 파일을 내려받을 수 있다.
- 다음은 리눅스용 DNW 앱 프로그램 smdk-usbdl 명령을 이용해서 커널 이미지를 전송하는 화면.
[root@localhost linux-3.6.9]# smdk-usbdl -f arch/arm/boot/zImage -a 40008000
SMDK42XX, S3C64XX USB Download Tool
...
- U-Boot 명령어인 loadb나 dnw를 사용하면 일반적으로 DRAM에 내려받는다.
임베디드 리눅스 부팅
- U-Boot환경에서 임베디드 리눅스를 부팅하기.
- (1) 커널이미지와 (2)RAMDISK 루트 파일시스템 이미지를 타깃 보드로 내려받아야 함.
RAMDISK와 커널이미지
- RAMDISK는 DRAM 영역을 블록 장치처럼 사용하게 해줌.
- 커널이미지는 일반적으로 데이터 양을 줄이기 위해 압축된 zImage를 사용함.
bootm명령어
- 이 명령어는 주 메모리에 있는 압축된 커널 이미지 zImage를 실행하는 명령어임.
# bootm [주소]
다음은 타깃보드 DTK4412에서 커널을 실행하고 부팅하는 화면이다.
DTK4412# bootm 40008000
Boot wit zImage
Starting kernel ...
Uncompressing Linux... done, booting the kernel.
Booting Linux on physical CPU 0
Linux version 3.6.9 (root@localhost.localdomain) (gcc version 4.6.3 (Sourcery CodBench ...
Machine: DTK4412
Memory policy: ECC disabled, Data cache writealloc
CPU EXYNOS4412 (id 0xe4412211)
자동 부트 지원
- 자동 부팅이란, 인가되거나 리셋되면서 부트로더가 스스로 플래시 메모리나, 호스트 컴퓨터에 있는 이미지를, 주메모리에 탑재하여 실행하는 것을 말함.
- 개발 중에는 리셋 키를 누르거나, 전원을 켜면, 호스트 컴퓨터에 있는 커널 이미지를 내려받고 자동으로 실행하여 운영체제가 부팅되도록 할 수 있음.
- 개발이 완료된 후에는 리셋 키 입력이나 전원 인가 후, 자동으로 플래시 메모리에 있는 이미지를 주메모리에 복사하고 운영체제를 부팅할 수 있음.
- 자동부팅은, U-Boot 환경 변수를 설정하여 지원됨.
- 자동부팅과 관련된 명령어는 bootcmd와 bootdelay가 있음.
- bootcmd는 U-Boot의 초기화 완료 후 자동으로 실행되는 명령을 지정.
- bootdelay는 bootcmd를 실행하기 전, 대기 시간을 지정. 대기 시간 중에는 사용자의 키 입력에 따라 자동 부팅 과정을 중지시킬 수 있음.
SD/MMC에 저장된 커널 이미지를 이용하여 자동 부팅하도록 설정하기
앞에서 배운 U-Boot의 환경 변수 지정 명령을 사용하여 bootcmd 명령을 다음과 같이 변경.
DTK4412# setenv bootcmd 'movi read kernel 0 40008000; bootm 40008000'
DTK4412# saveenv
- bootcmd 안에 있는 명령어는, SD/MC의 디바이스 번호 0에서 커널 이미지를 DRAM의 0x40008000으로 로드한 다음, 이주소에서 바로 커널을 부팅하는 예임.
- 따라서, 이걸 적용하면, 시스템 리셋 키를 입력하거나 전원을 새로 인가하면 자동으로 커널을 DRAM의 0x40008000으로 로드한 후 부팅함.
- 딜레이를 주고 싶으면, 아래와 같이 bootdelay 변수를 적용해보자.
DTK4412# setenv bootdelay 2
DTK4412# saveenv
이 설정은 2초간 대기한 후, 아무런 키 입력이 없으면, 설정된 bootcmd에 따라 부팅함.
U-Boot 포팅
- 새로운 SOC나 시스템을 개발하는 경우, 그 시스템에 맞게 소스를 수정하여 개발하려는 SOC와 보드에 맞도록 포팅해야됨.
- 포팅에 필요한 대부분 소스는 arch/arm/cpu 디렉터리와 board 디렉터리에 존재
- 새로운 타깃에 포팅하는 경우, 포팅하려는 타깃과 가장 유사한 타깃을 선정한 후,
- 에러 없이 빌드하여 이미지를 생성한 후
- 필요한 파일을 수정한다.
U-Boot 포팅에 필요한 소스 및 타깃
p555 표 15-10. 하드웨어 동작 관련 디렉터리 파일
U-Boot 초기화 동작의 이해
- U-Boot는 시스템에 리셋 키가 입력되거나, 전원이 인가되면 실행되는 부트코드다. (Exynos4412는 조금 다름. OM(Operating Mode)에 따라서 부트 디바이스를 찾고 나서야 사용자 부트로더가 실행됨)
- 일반적으로 부트코드가 NOR플래시에 저장되어 사용되는 경우;
- 바로 부트코드를 플래시에서 동작하게 구현할 수 있음.
- 하지만, 근래 대부분의 시스템은 부트코드가 NOR 플래시가 아닌, NAND 플래시 또는 SM/MMC와 같은 장치에 저장되어 있음.
- 이런 경우, 직접 부트코드를 실행할 수 없음.
- 그래서, 대부분 저장 장치에 있는 부트코드를 실행 가능한 주메모리(일반적으로 DRAM)로 복사한 후 실행.
- 현재 이 책에서 설명되는 DTK4412의 경웨도 마찬가지임.
- 부트코드가 MMC 디바이스에 저장되며, 부팅 후에는 주메모리로 복사되어 사용됨.
- 이때 고려할 사항이 주메모리 초기화임.
주메모리 초기화
- 이 주메모리 초기화는 초기 설정이 필요 없는 칩 내부의 SRAM에서 담당함.
- 칩 내부의 SRAM에 비해, U-Boot 코드가 상당히 큼. 그래서, 모든 코드를 SRAM으로 복사해서 사용할 수 없음.
- 그래서;
- Exynos와 같은 칩은 부트로더에서 클록이나 메모리 장치 초기화를 담당하는 코드와
- 메인 부트로더 코드를 복사하는 코드를,
SRAM에 복사하여 사용함.
초기화가 완료되면, 주메모리에 나머지 부트로더 코드를 복사하여 사용함.
이에 따라 U-Boot는 초기에 SRAM에 복사되어 실행되는 BL1과 주 U-Boot 코드로 나뉨.
- BL1은 부트로더 코드의, 맨 앞쪽에 위치한 일부 코드임.
- 이 코드는,
- 시스템 클록과 DRAM 등 주요 하드웨어의 초기화를 담당함.
- 부트 디바이스에 있는 U-Boot의 모든 코드를 주메모리로 복사함.
- 주메모리의 U-Boot에 제어권을 넘김.
그림 15-2. U-Boot와 BL1 이미지
BL1 | u-boot.bin |
U-Boot를 사용하여, 시스템이 부팅되는 과정은 다음과 같음.
1. 전원 인가 또는 리셋 신호 구동 후 내부 ROM 코드 BL0 실행
2. BL0에서는 외부 핀 OM에 따라 부트 디바이스 선택
3. 선택된 부트 디바이스의 초기 부트코드(BL1)를 내부 SRAM에 복사
4. SRAM의 BL1에서 U-Boot 부트코드를 DRAM에 복사
5. 제어권을 복사된 DRAM의 U-Boot 영역으로 변경, 변경 후에는 U-Boot 코드 실행.
..(작성중)..
---
NAND 플래시란.
SD 또는 MMC란.
플래시 메모리란?
- 전기적으로 데이터를 지우고 다시 기록할 수 있는 기억장치
- 전원이 공급되지 않더라도, 기존에 저장된 데이터는 그대로 존재하는 불 휘발성 메모리 (Non-volatile Mermory)
- EPROM -> EEPROM을 거쳐, 현재 사용되고 있는 플래시 메모리의 모습으로 진화함.
- 현재 MP3 Player, Note Book, Smart Phone, Tablet PC등 휴대용 전자기기, 그리고 USB Drive, 그리고 eMCC 및 SSD 등 다양한 플래시 메모리의 수요가 있음.
NAND 플래시 메모리
플래시 메모리는 낸드형(NAND-type)과 노어형(NOR-type)이 있음.
이는 플래시 메모리 기본 소자의 구성형태가 마치 Logic gate의 NAND 및 NOR gate의 Pulldown을 형성하고 있는 부분의 모양과 유사한 데에서 유래함.
- NAND 플래시 메모리
- 고집적화가 용이, 고 용량 데이터 저장용.
- 메모리 셀 unit의 contact 수가 적음.
- NOR 플래시 메모리
- Byte단위의 고속 sensing이 가능함.
- 비번하게 개서하는 저 용량 데이터 저장용으로 주로 사용.
https://www.koreascience.or.kr/article/JAKO201216238707699.pdf
'임베디드 소프트웨어 > 임베디드 소프트웨어' 카테고리의 다른 글
[임베디드](비공개) 네트워크 인터페이스 (정리) (0) | 2021.11.15 |
---|---|
[임베디드](비공개) 디바이스 드라이버 (0) | 2021.11.04 |
[임베디드] 임베디드 리눅스 (0) | 2021.11.04 |
[임베디드] 프로세서 아키텍쳐 코어 (0) | 2021.06.22 |
[임베디드] ARM 프로세서 모드와 레지스터 (0) | 2021.06.21 |