-
반응형
임베디드 리눅스는 여러 단체가 협업한 결과물이다.
1. 리눅스 커널 커뮤니티
우리가 접하는 대부분의 리눅스 커널 코드는 리눅스 커널 커뮤니티에서 만들어진다. 리눅스 커널 커뮤니티는 리눅스 커널 개발의 심장으로서, 리눅스 커널 자체의 알고리즘을 비롯해 논리적 오류나 문제점을 개선하는 패치를 논의하고 관리한다.
- 버그 수정 패치
- 코드 리팩터링
- 신규 알고리즘
- 문서화
보통 2주 간격으로 그렉 크로아 하트만(Greg Kroah-Hartman)이라는 개발자가 메일로 전 세계 개발자들에게 패치 반영 사실을 통지한다. 리눅스 커널 버전과 코드 내역은 리눅스 커널 아카이브(https://www.kernel.org/) 사이트에서 확인할 수 있다. 버전은 시간에 따라 계속 업그레이드된다. 왼쪽 부분을 보면 'longterm'으로 표시된 부분이 있다. 이는 안정화된 리눅스 커널 버전을 의미한다. 이처럼 리눅스 커널 커뮤니티에서 관리하는 안정화된 리눅스 커널 버전을 LTS(Long Term Support)라고 부른다. 최신 리눅스 커널 버전에 적용된 버그 수정 패치는 LTS 리눅스 커널 버전에 꾸준히 반영된다. SoC 업체들은 대부분 이 LTS 리눅스 커널 버전을 선택해 개발한다. 이 책에서 사용할 라즈비안(Raspbian) 배포판도 4.14와 4.19 버전의 LTS 리눅스 커널을 탑재했다.
2. CPU 벤더
리눅스 커널과 관련된 다른 주요 단체로 CPU 벤더가 있다. CPU 벤더는 CPU를 설계하는 회사를 뜻한다. CPU 벤더도 리눅스 커널 개발에 참여한다. 다음과 같은 리눅스 커널의 핵심 기능은 CPU에 따라 구현 방식이 다르기 때문이다.
- 시스템 콜
- 익셉션
- 컨텍스트 스위칭
리눅스 커널은 다양한 CPU 아키텍처와 함께 구동된다. 그런데 커널의 핵심 동작은 서로 다른 CPU 어셈블리 코드로 구현돼 있다. 컨텍스트 스위칭의 세부 동작은 x86이나 ARMv7 같은 CPU별로 구현 방식이 다르다. 라즈비안과 같이 ARMv7 기반 리눅스 커널을 쓰려면 ARMv7에 맞는 빌드 스크립트로 커널을 빌드하면 된다. 즉, 리눅스 커널은 다양한 CPU 아키텍처를 지원하는 소스 트리를 갖추고 있으며 사용하고자 하는 CPU 아키텍처에 맞춰 빌드하면 이에 맞는 커널 이미지를 생성할 수 있다.
3. SoC 벤더
SoC는 System-on-chip의 약자로 하나의 컴퓨터 또는 다른 전자 시스템들의 모든 구성 요소를 통합한 집적회로를 의미한다. SoC를 개발하는 업체인 브로드컴, 삼성전자(시스템 LSI), 퀄컴, 인텔, 미디어텍, 엔비디아 같은 회사를 SoC 벤더라고 부른다. 이들은 먼저 리눅스 커널 버전을 선택하며 CPU 벤더로부터 툴 체인을 받아 자신의 SoC 스펙에 맞게 리눅스 커널 코드를 수정하거나 드라이버를 추가한다.
리눅스 커널을 사용해 SoC 하드웨어를 제어하는 디바이스 드라이버를 작성한다. 예를 들면, 엔비디아 SoC와 퀄컴 SoC의 GPU(Graphics Processing Unit)는 자사의 SoC 하드웨어에 맞게 설계돼 있으니 서로 다른 디바이스 드라이버가 있는 것이다.
4. 보드 벤더 및 OEM
보드 벤더와 OEM(Original Equipment Manufacturer) 업체는 SoC가 릴리스한 리눅스 커널 코드를 받아 제품을 개발한다. 보드 벤더는 라즈베리 파이 재단과 같은 업체이고 OEM은 삼성전자, LG전자와 같이 상용 제품을 개발하는 업체를 뜻한다. 예를 들면, 라즈베리파이는 BCM2837이라는 SoC를 탑재한 교육용 보드이며 라즈베리 파이 재단에서 개발한다. 여기서 보드 벤더인 라즈베리 파이 재단은 SoC 벤더인 브로드컴이 릴리스한 리눅스 커널 코드를 받아 라즈베리 파일의 스펙과 시나리오에 맞게 범용 보드로 개발하는 것이다.
제품마다 다양한 시나리오와 컨셉이 있을 수 있다. 만약 제품 컨셉이 카메라이면 카메라 센서를 제어하는 드라이버를 제작하고, 자동차 내비게이션이면 그래픽 드라이버를 개발할 것이다.
'보드 벤더 및 OEM' 개발자들은 이 과정에서 SoC 업체와 협업할 때가 많다. 만약 SoC 벤더에서 작성한 드라이버에서 버그를 확인하면 '보드 벤더 및 OEM' 업체는 버그를 리포트하고 개선 패치를 받아 수정하는 경우가 많다. 그런데 간혹 '보드 벤더 및 OEM' 업체의 개발자가 SoC 벤더에서 작성한 드라이버에 있는 버그를 직접 수정하는 경우가 있다. SoC 벤더에서 작성한 드라이버 코드는 리눅스 커널 소스코드와 함께 배포하므로 누구나 소스코드를 열어볼 수 있다. 그래서 자신이 작성하지 않은 리눅스 드라이버 코드를 수정할 수 있는 것이다.
5. 리눅스 커널
디바이스 드라이버는 리눅스 커널에서 제공하는 함수로 구성돼 있다. 호출한 함수의 동작 방식을 알려면 자연히 리눅스 커널 코드를 분석할 수밖에 없다. 또한 디바이스 드라이버를 개발하는 과정은 코드를 입력해 드라이버를 구현하는 데 그치지 않다. 인증 테스트 부서를 통해 드라이버 안정화 테스트 과정을 거친다. 이 과정에서 다양한 버그나 문제 증상이 리포트된다. 카메라 디바이스의 경우 사진을 찍은 후 저장한 화면이 모두 검은색일 수도 있다. 또한 그래픽 디바이스의 경우 화면이 깨질 수 있다. 이 과정에서 접하는 다양한 버그를 수정해 문제를 해결하기 위해서는 리눅스 커널을 잘 알아야 한다.
반응형