안경잡이개발자

728x90
반응형

  커널(Kernel)운영체제(OS)에서 가장 코어(핵심) 파트에 해당합니다. 커널은 컴퓨터의 각종 드라이버, 메모리, 프로세스 등을 관리하는 역할을 수행합니다. 일반적으로 배포판으로 제공되는 커널은 이미 일반적인 많은 기능을 포함하고 있기 때문에 일반적인 리눅스 OS 사용자는 커널을 직접 컴파일할 필요가 없습니다.

 

  그래서 어떤 하드웨어를 사용할 때, 우리는 적절한 커널 이미지가 존재하는지 먼저 찾아본 뒤에 이를 그대로 이용합니다. 예를 들어 라즈베리파이(Raspberry Pi)Debian 기반의 OS를 사용할 수 있는데, 라즈베리파이의 부품과 적절히 호환될 수 있는 형태로 커널이 제공됩니다. 정확히는 라즈비안(Raspbian)이라는 이름의 별도의 라즈베리 파이 버전의 OS를 사용하면 됩니다.

 

  하지만 기본적인 커널에서 제공하지 않는 기능을 사용하고 싶을 때나 컴퓨터 부품과 관련하여 바뀐 부분이 있을 때 커널을 변경하여 컴파일해 볼 필요가 있습니다. 혹은 현재 보드에서는 필요 없는 드라이버를 지워서 커널을 최적화하여 부팅 시간을 빠르게 설정할 수 있습니다. 예를 들어 특정한 하드웨어를 관리하기 위한 디바이스 드라이버(device driver)를 작성할 때 커널 모듈 형태로 작성할 수 있습니다. 커널을 변경하기 위한 가장 첫 번째 단계는 커널 소스 코드를 직접 컴파일해 보는 것입니다.

※ 커널의 주요 디렉토리 ※

  ▶ linux/kernel: 커널 핵심 소스 코드

  ▶ linux/include: 커널 소스 코드의 헤더 파일
  ▶ linux/lib: 커널 내부에서 사용되는 함수 라이브러리
  ▶ linux/drivers: 하드웨어 관리 목적의 디바이스 드라이버

 

  기본적으로 최신 버전의 리눅스 커널은 www.kernel.org 경로에서 받을 수 있습니다. 당연히 커널을 컴파일하기 위해서는 컴파일하고자 하는 소스 코드가 필요하기 때문에 이는 기본적인 과정입니다. 2019년 11월 25일에 리눅스 커널(Linux Kernel) 5.4 버전이 출시되었습니다. 2020년 10월 기준으로 Raspberry Pi의 리눅스 커널 기본 버전도 5.4 버전입니다.

 

  라즈비안(Raspbian) 커널(Kernel) 빌드 가이드라인을 보면서 그대로 따라 진행하면 큰 문제 없이 진행할 수 있습니다. 저는 이 중에서 크로스 컴파일(cross compile) 방식을 이용해 실습을 진행했습니다.

 

※ Raspberry Pi 커널 크로스 컴파일 방법

  일반적으로 크로스 컴파일(cross compile)특정한 OS에서 컴파일한 프로그램이 다른 OS에서 돌아가도록 하는 것을 의미합니다. Raspbian은 Ubuntu와 같은 일반적인 리눅스 OS와는 차이가 있습니다. 따라서 Ubuntu OS에서 Raspbian을 컴파일하는 것을 의미한다. 외부 리눅스(Linux) OS 기반의 컴퓨터를 하나 준비합니. 아무튼 별도의 호스트(Host) PC에서 커널을 빌드한 뒤에 Raspberry Pi에 업로드하면 됩니다.

1. 관련 종속성(Dependencies) 및 툴체인(Toolchain) 설치하기

 

sudo apt install git bc bison flex libssl-dev make libc6-dev libncurses5-dev

 

  제 Ubuntu 컴퓨터에는 관련 종속성 라이브러리가 이미 설치되어 있는 상황이라서 다음과 같이 나옵니다.

 

 

2. 32-bit 커널을 위해 32-bit 툴체인을 설치하기

  라즈비안(Raspbian) OS의 경우 기본적으로 32-bit입니다. 따라서 본 예시에서도 32-bit을 이용하겠습니다.

 

sudo apt install crossbuild-essential-armhf

 

  32-bit 툴체인도 이미 설치가 되어있어서 다음과 같이 나오는 것을 확인할 수 있습니다.

 

 

3. 소스 코드 다운로드 받기

 

  이제 라즈비안(Raspbian) OS 소스 코드를 다운로드 받겠습니다.

 

git clone --depth=1 https://github.com/raspberrypi/linux

 

  소스 코드를 확인해 보면 기본적으로 일반적인 Linux와 매우 유사한 구조를 가지고 있습니다. 마찬가지로 kernel 디렉토리, drivers 디렉토리, security 디렉토리 등이 있습니다.

 

 

  실제로 각각의 디렉토리를 직접 확인해 보실 수 있습니다. 예를 들어 각종 드라이버(driver) 관련 소스코드를 확인하고 싶다면 다음의 경로에 들어가시면 됩니다.

 

 

  저는 여기에서 제가 만든 커널이 정상적으로 동작하는지 확인하기 위해 드라이버 코드를 아주 조금 바꾸어 보겠습니다. drivers/usb/gadget/function/f_mass_storage.c는 Mass Stoarge 기능(function)을 위한 소스코드 구현부입니다. 저는 다음과 같이 printk() 명령을 이용하여 간단한 로그를 남길 수 있도록 했습니다.

 

 

4. 소스코드 빌드하기

  Raspberry Pi Zero W의 경우 다음과 같은 명령어로 config 파일을 만들 수 있습니다. 

 

cd linux
KERNEL=kernel
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcmrpi_defconfig

 

 

  이후에 실제로 환경설정 파일을 토대로 빌드를 진행합니다. 말 그대로 커널 소스코드를 새롭게 빌드할 수 있는 것입니다. 예를 들어 우리가 직접 새로운 드라이버를 작성하고 싶다면, 드라이버 쪽 코드를 고친 뒤에 커널 소스코드를 빌드하면 그 내용이 적용되는 것입니다.

 

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs

 

  명령어를 입력하면 다음과 같이 실질적으로 빌드가 진행됩니다. 컴퓨터의 성능마다 다를 수 있지만 수십 분 정도의 시간이 소요될 수 있습니다. 한 번 빌드를 수행한 뒤에 코드를 고치고 다시 빌드하는 경우에는 빠릅니다.

 

 

5. SD 카드에 인스톨하기

  커널을 빌드한 후에는 현재 가지고 있는 라즈베리파이(Raspberry Pi)커널을 복사해 모듈을 설치해야 합니다. 일반적으로 Raspberry Pi OS가 설치되어 있는 SD Card를 넣으면 다음과 같은 형태가 됩니다. sdb1FAT 파티션, sdb2ext4 파일시스템(root) 파티션을 의미합니다.

 

sdb
    sdb1
    sdb2

 

  실제 디바이스 이름은 fdisk -l 명령을 이용하여 확인할 수 있도록 합니다.

 

 

  확인해보니 제 SD 카드는 sde라는 이름을 가지네요. 따라서 차례대로 FAT과 ext4 파티션을 각각 마운트합니다.

 

mkdir mnt
mkdir mnt/fat32
mkdir mnt/ext4
sudo mount /dev/sde1 mnt/fat32
sudo mount /dev/sde2 mnt/ext4

 

  다음과 같이 별도로 mnt 라는 이름의 폴더를 만들어서 마운트를 진행할 수 있습니다.

 

 

  이후에 df -h 명령을 이용해 용량이 충분한지 체크를 진행해 보겠습니다. 용량은 충분하네요.

 

 

  이제 커널 모듈SD 카드에 설치하면 됩니다. (32-bit) 여기에서 나오는 modules_install은 말 그대로 커널 모듈을 설치하는 명령입니다.

 

sudo env PATH=$PATH make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=mnt/ext4 modules_install

 

  만들어진 커널 이미지를 SD 카드에 복사할 겁니다. 아무래도 커널 이미지가 정상적으로 동작하지 않을 수도 있으므로 현재 존재하는 커널 이미지를 미리 백업해 둘 필요가 있습니다. (32-bit 기준)

 

sudo cp mnt/fat32/$KERNEL.img mnt/fat32/$KERNEL-backup.img

 

  주피터 노트북의 경우 환경 변수가 제대로 동작하지 않을 수 있습니다.

 

 

  이후에 SD 카드의 mnt 폴더로 만들어진 커널 이미지를 옮깁니다.

 

sudo cp arch/arm/boot/zImage mnt/fat32/$KERNEL.img
sudo cp arch/arm/boot/dts/*.dtb mnt/fat32/
sudo cp arch/arm/boot/dts/overlays/*.dtb* mnt/fat32/overlays/
sudo cp arch/arm/boot/dts/overlays/README mnt/fat32/overlays/

 

 

  이후에 언마운트를 진행합니다.

sudo umount mnt/fat32 
sudo umount mnt/ext4

 

 

  이제 SD 카드를 뽑은 뒤에 Raspberry Pi에 꽂아서 부팅합니다. 저는 부팅 이후에 Multi Gadget Driver를 사용하도록 하고, Mass Storage 기능을 활성화하도록 설정했습니다. 이후에 dmesg를 입력했을 때 다음과 같이 로그(log)가 찍혀 있는 것을 확인할 수 있었습니다. 다시 말해 정상적으로 커널 컴파일 및 업로드 완료 된 것입니다.

 

 

※ 커널 소스코드 수정 이후에 다시 빌드하는 방법 ※

 

  결과적으로 커널 소스코드를 수정한 뒤에, 다시 빌드하는 명령어를 요약하자면 다음과 같습니다.

 

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs -j8

mkdir mnt
mkdir mnt/fat32
mkdir mnt/ext4
sudo mount /dev/sde1 mnt/fat32
sudo mount /dev/sde2 mnt/ext4

sudo env PATH=$PATH make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=mnt/ext4 modules_install
sudo cp mnt/fat32/kernel.img mnt/fat32/kernel-backup.img

sudo cp arch/arm/boot/zImage mnt/fat32/kernel.img
sudo cp arch/arm/boot/dts/*.dtb mnt/fat32/
sudo cp arch/arm/boot/dts/overlays/*.dtb* mnt/fat32/overlays/
sudo cp arch/arm/boot/dts/overlays/README mnt/fat32/overlays/

sudo umount mnt/fat32 
sudo umount mnt/ext4

sync
sync
728x90
반응형

728x90
반응형

  제가 최근에 참여하고 있는 프로젝트에서 USB 디바이스 개발을 요구하고 있습니다. 그래서 USB 관련 장치(Device)를 직접 개발하기 위한 목적으로 사용할 수 있는 보드를 정리하고자 합니다. USB 디바이스 개발에 있어서 더 편리한 보드가 있을 수도 있습니다. 혹시 다른 좋은 보드를 아시는 분이 있다면 댓글로 남겨주시면 감사하겠습니다.

 

1. Teensy

 

  ▶ 링크: https://www.pjrc.com/store/teensy41.html

 

  Teensy는 USB 기반의 마이크로컨트롤러 개발 시스템입니다. 나만의 USB 장치를 새롭게 만들어 보거나 할 때 좋습니다. 최신 버전의 Teensy는 Teensy 4.1 (가격: $26.85)인데요. 이 보드(Board)의 특징은 다음과 같습니다.

 

 

  - USB 2.0 High Speed (최대 480Mbit/sec)
  - ARM Cortex-M7 processor at 600MHz
  - SD Socket
  - 8Mbyte Flash Memory
  - 아두이노 개발 환경과 연동 가능
  - 외부 센서 연동에 유리

 

  최신 Teensy 버전인 Teensy 4.1에서는 SD 소켓(Socket)을 포함하고 있어서, 간단히 Micro SD 카드만 있으면 이를 부착하여 사용할 수 있습니다. Native SDIO 프로토콜을 이용할 수 있어 SPI를 이용했을 때보다 훨씬 빠릅니다.

  이러한 SD 카드를 활용하면 더욱 다양한 예시를 만들 수 있습니다. 예를 들어 Teensy를 활용하여 임시 저장소, 키보드, 마우스 등의 USB 장치를 만들 수 있는데, 그와 동시에 사용자가 입력한 모든 정보를 Teensy에 부착된 SD 카드에 기록하거나 할 수도 있을 것입니다.

 

 

  참고로 Teensy 4.1은 USB 호스트 포트 또한 지원합니다. 다시 말해 Teensy를 호스트 PC처럼 사용할 수 있습니니다. 예를 들어 Teensy와 키보드를 서로 연결하여 키보드에 입력한 정보가 Teensy에 임시적으로 기록되었다가, Teensy에서 다시 실제 호스트(Host) PC로 데이터를 넘겨 주는 것도 가능할 것입니다. 이를 위해서는 별도로 USB 호스트 케이블이 필요하다고 하네요. 다음과 같은 케이블을 산 뒤에 Teensy 4.1의 5핀에 꽂아서 사용할 수 있습니다. 실제로 USB 호스트 포트를 이용하는 경우는 다음의 그림과 같습니다.

 

 

  그리고 Teensy의 가장 큰 특징은 아두이노(Arduino) 개발 환경을 그대로 이용할 수 있다는 점입니다. Teensy 공식 홈페이지에서 제공하는 Teensyduino를 설치하면 다음과 같이 아두이노 개발 환경에서 사용 가능한 보드로 Teensy가 보이게 됩니다. 이 경우 아두이노 개발 환경을 이용하되 코어 라이브러리의 코드는 Teensy 전용 코드로 이용할 수 있습니다.

 

 

2. ODROID

 

  ▶ 링크: https://www.hardkernel.com/ko/shop/odroid-c2/

 

  오드로이드(ODROID)하드커널(Hardkernel) 회사에서 만든 개발용 보드입니다. 라즈베리파이처럼 유사하게 사실상 소형 컴퓨터나 다름 없습니다. 그러면서도 성능이 좋은 편입니다. 실제로 성능을 확인해 보시면 기가비트 속도의 이더넷(Ethernet), 2기가 바이트 DDR3 SDRAM, HDMI 포트 또한 있으며 USB 포트도 5개나 있습니다. 그리고 우분투 16.04가 올라갈 수 있습니다.

 

  참고로 라즈베리파이나 틴시(Teensy) 같은 보드는 마이크로 USB를 통해서 전원을 공급 받지만, 오드로이드의 경우 별도의 2.5mm 어댑터를 이용해 전원을 공급해야 합니다.

 

  오드로이드 제품군 중에서 ODROID-C2 (가격: $52,900)는 2020년 기준으로 가장 인기 있는 제품 중 하나입니다.

 

 

  - USB OTG 지원: USB 2.0 High Speed (최대 480Mbit/sec) 
  - Amlogic ARM® Cortex®-A53(ARMv8) 1.5GHz quad-core CPUs 
  - 2Gbyte DDR3 SDRAM 
  - Ubuntu 16.04 설치 가능
  - Devier Driver (Gadget)를 활용한 Mass Storage Device 등으로도 활용 가능

 

  가장 일반적인 사용 형태는 다음과 같을 것입니다. 아래 이미지는 ODROID 사에서 제공하는 동영상을 캡처한 것입니다. 확인해 보시면 전원은 별도로 연결해 주고 HDMI에 모니터를 연결하여 사용하는 것을 알 수 있습니다.

 

 

  이후에 동작 과정은 일반적인 리눅스 기반 컴퓨터와 같습니다. 예를 들어 우분투 OS를 설치했다면 미니 서버용 컴퓨터로 사용할 수도 있을 것입니다. 예를 들어 단순히 나만의 파일 저장용 서버로 사용할 수도 있을 것이고, 사용 예시는 매우 다양합니다.

 

  ODROID-C2의 또 다른 큰 장점은 USB 포트를 매우 많이 제공한다는 점입니다. 이는 USB 디바이스 개발 목적으로도 활용도가 높습니다. 특히 USB OTG(USB On-The-Go)를 제공한다는 점에서 ODROID-C2를 마우스나 키보드와 같이 동작하도록 만들 수도 있습니다.

 

  참고로 ODROID-C2는 잘 팔리는 제품이라서 품절이 발생할 수 있습니다. 만약 품절이라면 입고 알림 메시지를 받도록 할 수 있습니다.

 

 

  만약 ODROID-C2가 품절 상태라면 ODROID-C1+를 구매할 수도 있습니다. ODROID-C1+ 또한 USB OTG 포트와, 4개의 USB Host 포트를 가지고 있기 때문에 USB Device 개발 목적으로 적합합니다. 다만 컴퓨팅 파워는 ODROID-C2에 비해서 떨어지는 편이고 가격은 조금 더 저렴합니다.

 

  성능을 비교하면 다음과 같습니다.

 

 

  참고로 주문하실 때에는 배송지를 [대한민국]으로 설정하시지 않으면 아주 큰 요금으로 설정될 수 있습니다. 그러므로 처음에 배송비가 너무 크게 찍혀 있다고 놀라지 마세요. ODROID는 국내 기업 제품이라서, 배송지를 국내로 변경하면 일반적인 배송비가 나옵니다.

 

3. Raspberry Pi

 

  ▶ 링크: https://www.raspberrypi.org/products/raspberry-pi-zero-w/

 

  라즈베리파이(Raspberry Pi)는 아두이노(Arduino)와 더불어 매우 유명한 보드 중 하나입니다. 일종의 소형 컴퓨터로 볼 수 있으며, 매우 저렴한 가격으로도 좋은 컴퓨팅 파워를 제공합니다. 작은 웹 서버를 운용하는 프로젝트 등에서 자주 나오는 보드이기도 합니다. 실제 보드 크기는 학생증 카드보다 조금 더 큰 크기입니다.

 

  라즈베리파이 보드 중에서도 가성비가 매우 높은 것으로 알려진 보드는 Raspberry Pi Zero W입니다.  이 Raspberry Pi Zero W (가격: $10)는 가격이 매우 저렴하고, 해외 주문을 고려해도 굉장히 쌉니다. 특히 크기가 매우 작아서 휴대성이 뛰어납니다. 학생증보다도 훨씬 작아요. 원래 Raspberry Pi Zero 모델이 출시가 되었는데, 여기에 Wireless LAN과 Bluetooth를 추가하여 Raspberry Pi Zero W라는 이름으로 출시가 되었습니다.

 

  - 1GHz single-core ARMv6 CPU (BCM2835)
  - SD Socket
  - 512MB RAM
  - Linux, Windows 등 다양한 OS 설치 가능
  - USB OTG 지원: 단, 사용 예시를 찾아보니 Mass Storage Class로 5~6MB/s 정도의 속도만 나온다고 함

  - Micro USB로 전원 공급
  - Devier Driver (Gadget)를 활용한 Mass Storage Device 등으로도 활용 가능

  - 802.11 b/g/n wireless LAN

 

  그래서 라즈베리파이 제로 W 버전 또한 사실상 운영체제(OS)를 올릴 수 있는 소형 컴퓨터와 마찬가지입니다. SD 카드를 부착할 수 있기 때문에 SD 카드에 우분투와 같은 운영체제(OS)를 설치해 놓고, 이를 라즈베리파이 제로 W에 연결하여 SD 카드로부터 바로 부팅을 진행할 수 있습니다. 당연히 미니 HDMI 케이블도 있기 때문에 모니터와 연결하여 화면을 볼 수도 있습니다.

 

  또한 라즈베리파이 제로 W는 USB OTG 기능을 지원하기 때문에 USB 디바이스를 개발할 때에도 유용합니다. 아래와 같이 라즈베리파이 제로 W가 있으면 USB 포트 하나로 전원을 공급하고, 다른 USB 포트 하나를 더 써서 호스트(Host) PC와 데이터를 주고 받는 목적으로도 쓸 수 있습니다.

 

 

  참고로 Raspberry Pi Zero W는 원래 $10의 저렴한 가격이지만, 국내에서 구매하려고 하면 굉장히 비쌉니다. 따라서 일반적으로 해외에서 직구하는 경우가 많습니다. (다만, 배송하는 물품의 개수가 많지 않다면 배송비 때문에 오히려 더 비싸질 수 있습니다.) 캐나다 기업인 CanaKit에서 구매할 수 있는데, 여기에서 주문하면 통상 3주 안에는 도착한다고 합니다. 저도 여기에서 구매를 해보았습니다.

 

   ▶ CanaKit 라즈베리파이 구매 경로: www.canakit.com/raspberry-pi-zero-wireless.html

 

Raspberry Pi Zero W (Wireless)

 

www.canakit.com

 

  CanaKit에 접속하면 다음과 같이 Raspberry Pi Zero W를 찾으실 수 있습니다. 일반적으로 Basic Kit이나 Starter Kit을 이용하는 편입니다. Starter Kit을 이용하면 Power Supply, USB OTG Cable 등의 구성을 함께 받으실 수 있습니다.

 

 

  상세한 물품 구성은 다음과 같습니다. Raspberry Pi Zero W 단품만 구매하는 경우에는 사람당 1개씩으로 개수를 한정하는 것 같습니다. 온전한 하나의 미니 컴퓨터 형태를 원한다면 Start Kit을 이용하시면 됩니다.

 

 

  최종적으로 다음과 같이 장바구니에 담은 물품을 구매하실 수 있습니다.

 

 

  다만, 실제로 구매할 때는 배송비가 상당히 비싸네요.

 

 

  아무튼 결제 카드를 이용하여 구매하게 되면 결제 정보가 이메일로 도착하여, 이를 확인하실 수 있습니다.

728x90
반응형