일반적인 시스템 아키텍처

안드로이드는 리눅스가 구동되는 하드웨어라면 어디서든 동작할 수 있지만 특정한 플랫폼을 고려하여 설계되었다.

안드로이드는 원래 휴대기기용으로 설계되었고 현재도 여전히 그 점을 반영하고 있다.


다음은 안드로이드 구동이 가능한 시제품용 임베디드 시스템의 블록 다이어그램이다. 실제 완성품은 묘사된 시스템과

상당히 다를 수도 있지만 지금 논의를 계속하기에는 충분하다.



여기서 중요한 점은 시스템의 중심에 SoC(System on Chip)가 있다는 것이다. 지금은 SoC가 CPU와 여러 주변장치 같은

직접회로(IC)에 모두 모아놓은 것이라고만 기억해두기 바란다.



베이스밴드 프로세서

 시중의 스마트폰 대부분은 사용자 소프트웨어 구동용 프로세서와 무선 기능 관리를 위한 프로세서를 별도로 가지고

있다. 이를 각각 어플리케이션 프로세서(AP)와 베이스밴드 프로세서(BP)라고 한다.


두개의 별도 프로세서가 있는 이유는 법률적인 이유도 있고 기술적인 이유도 있다.

첫 벗째로, 미국은 소프트웨어 정의 라디오(Software-defined radio)기기는 정부 기관인 FCC에서 인증을 받아야한다.

이증 요구조건에는 라디오를 제어하는 소프트웨어는 허가 없이는 수정할 수 없어야 한다는 항목이 포함되어있다.

다시 말해서 어떤 환경에서도 기기의 최종 사용자가 무선 신호가 동작하는 방식이나 주파수를 변경할 수 없어야 한다.

또한 무선 기능과 관련하여 반드시 실시간으로 대응해야 하는 제약도 있다. 그래서 사용자용 운영체제를 구동하는 CPU

는 무선 신호를 조작하는 데 사용될 수 없다. 그러나 BP가 동작하는 동안 AP는 절전모드로 들어갈 수 있다는 이점이 있다.


현재는 하나의 프로세서로 안드로이드와 무선 신호를 조작하는 소프트웨어를 동시에 구동할 수 없다고 가정하자.


핵심 구성요소

기존에는 대부분의 임베디드 시스템에 NOR나 NAND 플래시가 장착되었고, 이들 플래시 칩을 관리하고 웨어레벨링(플래시 기술은 각 블록의 지우기 횟수에 제한이 있어 블록의 지우기 횟수를 감시하여 균등하게 분배하는 작업)을 구현한 플래시 파일시스템을 탑재하였다.


그런데 최근에는  임베디드 멀티미디어카드(eMMC)칩을 사용하는 추세이다. 이 칩은 SD카드형식으로 리눅스 커널에서는 기존의 블록장치로 취급한다. 즉, 전형적인 ATA 하드디스크와 같다. 그래서 이 시스템들은 NOR, NAND플래시 없이 eMMC칩만 사용한다. 그리고 이 시스템에 탑재된 SoC 칩은 eMMC파티션에서 데이터를 읽고 부팅할 수 있는 모듈을 가지고 있다. 




실제 세상과 상호작용하기

첫째, 화면, 터치입력, 키보드 등은 SoC에 내장된 화면 제어 기능만으로 충분하지만, 테블릿과 같이 화면이 큰 경우는 저전압 차등 시그널링(LVDS),으로 구동되는 LCD 화면용 브리지를 별도로 사용하기도 한다. 일반적으로 화면 터치 센서를 처리하는 터치 콘트롤러, 키보드, 물리버튼 조작을 처리하는 회로도 포함된다.


둘째, SoC가 제어하느 카메라, 오디오 코덱 IC가 제어하는 I/O 등 카메라의 경우 화상통화 등을 위한 전면카메라까지 총 두 개가 부착되기도 한다. 또한 기기 주변 환경의 물리적 속성을 측정할 수 이는 센서와 환경과 기계적으로 상호작용할 수 있는 구성요소도 포함된다.


안드로이드 기기에는 가속 센서,자이로스코프, 온도계, 기압계, 측광기, 자기측정기, 근접센서 등 다양한 센서가 탑재될 수 있다.




연결성

안드로이드 특성 중 하나는 연결성인데 이를 위해 USB,WiFi, 블루투스, GPS, NFC 와 같은 여러 표준을 지원하는 제어기, 연결단자, 안테나 등의 하드웨어가 사용된다. 이런 하드웨어들도 별도의  IC로 제공되지 않고 한데 합쳐지는 추세다.




확장, 개발, 디버깅

SoC에는 다른 구성요소와 주변장치도 장착할 수 있다. 이들은 다른 안드로이드 기반 임베디드 시스템에서 사용되는 경우가 있다. 기본 안드로이드 스택에서 어느 정도는 지원하지만 일부는 전혀 지원하지 않을 수도 있다. 이 부분이 바로 여러분과 같은 임베디드 개발자가 필요한 영역이다.


따라서 개발용 보드에는 이더넷, USB호스트, 시리얼(RS-232), 확장 헤더를 위한 모듈과 단자가 있는 경우가 흔하다. 많이 사용되는 비글보드와 판다보드는 대부분 이런 모듈들을 갖추고 있다. JTAG는 하드웨어 수준 디버깅 인터페이스로 리눅스 커널이나 안드로이드 스택 쪽의 소프트웨어 지원이 필요 없다. 개발용 보드의 확장 헤더는 주변장치 기판(확장 헤더를 통해 연결된 추가 모듈 등)에 I2C나  GPIO와 같은 SoC핀에 연결할 수 있게 해준다. 그다음으로 리눅스가 적절한 디바이스 드라이버를 로드하여 추가된 모듈의 주변장치와 통신할 수 있도록 구성하는것은 개발자의 몫이다.


직렬 포트 연결은 리눅스 커널의 TTY 계충에서 제공한다. 커널이 직렬 포트를 통한 SoC와의 콘솔 연결을 지원하는 한 별도의 설정 없이 바로 사용할 수 있을 것이다. 즉, 리눅스가 여러분의 SoC위에서 구동된다면 보통은 지원될 것이다.

직렬포트 연결은 호스트와 대상 플랫폼이 통신하는 간단하면서도 효과적인 방법이기 때문에 임베디드 시스템, 특히 보드 브링업 시점에서 무척 중요하다.



시스템-온-침은 무엇인가?


 SoC는 다양한 버스와 인터페이스를 활용하여 또 따른 외부 IC에 접근할 수 있는 기능을 탑재할 가능성이 높다. 이 방식이 이전 절에서 대부분의 모듈이 PCB 회로로 SoC에 연결되는 방식이다. 이런 버스와 인터페이스에는 I2C, SPI, UART, GPIO등이 있지만 다른 메커니즘을 사용할 수도 있다.


각 SoC의 특정 기능과 기기 연결법은 SoC 제조사가 기기 제조사에 제공하는 데이터시트에 문서화되어 있는 것이 보통이다. 이 문서는 OS 및 장치 드라이버 개발자에게도 제공된다. 종종SoC 제조사들은 GPU와 같이 중용한 모듈용 드라이버를 제공하기도 한다. 실제로 대부분의 SoC벤더들은 자사의 평가용 보드에서 바로 자동하는 AOSP트리를 제공하기도 한다.




메모리 레이아웃과 매핑

하드웨어 구성요소들이 쓸모 있으려면 어떤 방식으로든 소프트웨어에서 접근할 수 있어야 한다. 일반적으로 이 일은 리눅스 커널의 장치 드라이버를 통해 할 수 있다. 앱은 드라이버가 제공하는 표준 인터페이스를 사용하여 하드웨어와 통신한다. [그림 5-3]은 그 모습을 묘사하고 있다. 


물리 주소 공간에서 각 구성요소의 실제 위치를 물리 주소 맵 이라고 하며 기기설계자가 PCB기판 위에서 SoC와 다른 모듈들을 연결하는 과정에서 결정된다.


어플리케이션과 기기 사이의 매핑이 제대로 작동하는 이유는 CPU가 메모리관리유닛(MMU)을 통해 두 주소 공간을 완전히 별개로 관리하는 덕분이다.  MMU덕분에 CPU는 어플리케이션에게는 가상 주소 공간을 보여주면서 동시에 버스로 연결된 구성요소와는 물리 주소 공간을 통해 데이터를 주고받을 수 있다.


시스템 메모리는 물리 주소 공간에 위치한 모듈이다. 램의 물리 주소 공간 안에서의 위치는 다를 수 있다. 물론 램에는 동작 중인 소프트웨어의 코드와 데이터가 모두 올라와 있다. 그런데 이 코드와 데이터가 실제 물리 주소로 참조되는 경우는 극히 드물다. 대신 운영체제는 MMU와 연동하여 각 프로세스가 비슷한 방식으로 메모리 공간을 볼 수 있는 가상 주소 영역을 구현한다. 가상 주소는 실제 물리 주소에 매핑되지만 운영체제가 관리하는 페이지 표(Page Table)를 보고 MMU가 자동으로 변환해준다.


커널의 주소는 항상0xC000 0000부터 시작하며 안드로이드 앱은 그 아래의 모든 주소 공간을 차지한다.


앱의 텍스트, 즉 앱의 코드는 가상 주소 공간의 시작 지점에 매우 근접해 있다. 그다음으로 매핑된 메모리 영역이 따른다.

이 가상 주소들은 프로세스 간 통신을 위해 공유된 램이나 해당 드라이버의 mmap()함수를 사용하여 프로세스의 주소 공간을 매핑한 물리 메모리 영역을 가리킨다.


물리 주소 공간을 프로세스 주소 공간에 매핑하면 프로세스가 매번 커널과 장치 드라이버를 거치는 대신 직접 IC 구성요소나 연결된 기기를 구동할 수 있다. 실제로 이러한 방법은 안드로이드HAL 컴퍼넌트의 핵심 드라이버 기능을 구현하는 매우 효과적인 방법이다.


마지막으로 라이브러리는 0x8000 0000에서 시작하며 프로세스의 스택은 프로세스의 최상단 주소에서부터 아래쪽으로 내려간다.


소프트웨어가 메모리 매핑된 레지스터와 영역을 사용하여 하드웨어를 조작하는 경우를 제외하고 호출이 하드웨어에

여향을 주는 경로는 보통 다음과 같다.



출처 : 임베디드 안드로이드 : 안드로이드 포팅, 확장, 커스터마이징하기 ( 한빛미디어 (카림 야크무르 지음, 이성주 옮김))

+ Recent posts