5) Arm 프로세서 내부구조 및 어셈블리 명령어
Operating mode
 - 프로세서가 어떤 권한을 가지고 어떤작업을 하는지 나타내다
 - user mode: user task를 수행, 비특권(un-privileged)모드로서 메모리나 I/O같은 시스템자원의 접근에 제한이 있음
              (아래의 나머지는 특권모드이다)
 - fiq mode: 빠른 인터럽트 처리 모드
 - irq mode: 일반적인 인터럽트 처리모드
 - svc mode: 프로세서가 OS의 커널이나 드라이버를 처리하는 모드, 시스템 자원을 관리하며, reset, swi가 발생시 해당 모드로 변경됨
 - abort mode: 명령이나 데이터를 메모리에 R/W시 오류가 발생할 경우 변경되는 모드
 - system mode: user와 동일한 용도이지만, 특권모드이다

레지스터
 - PC(program counter): 프로그램을 수행하는 주소값을 저장하는 레지스터
 - LR(link register): 서브루틴이 끝나고 되돌아갈 주소를 저장
 - SP(stack pointer): 프로그램에서 사용하는 스택의 위치를 저장
 - PSR(Program Status Register): 1개의 CPSR, 5개의 SPSR로 구성되어 있다

exception
 - 외부의 요청이나 오류에 의해 현재 진행하고 있는 프로그램의 동작을 잠시 중단, 프로세서의 동작모드를 변경하고 해당 모드에 해당하는 외부의 요청이나 오류에 대한 처리를 하는 과정
   ** 커널에서는 Trap이라고 말한다
 - arm에서의 exception: reset, undefined instruction, software interrupt, prefetch abort, data abort, irq, fiq

arm 프로세서 명령어
 - 32비트 arm 명령어, 16비트 thumb 명령어(cortex계열의 경우 thumb-2 명령어를 지원)로 분류
 - branch, branch link, 산술/논리연산, 비교연산, single register data transfer, psr transfer, ATPCS 등의 명령어 존재


6) Boot code 및 boot sequence 이해
startup code
 - 펌웨어 프로그램이 실행되기 전(즉 main() 실행 전) HW 설정에 관련된 작을 수행하는 코드
 - 통상 아래의 작업을 수행한다
    : HW 초기화, 레지스터 설정, 메모리 초기화, bss영역 초기화, 스택메모리 영역 설정, 인터럽트 처리 루틴 설정 등
    : 이후 ROM에 있는 프로그램을 RAM에 복사 및 실행한다

시스템 기본 초기 설정 요소
 - 시스템 부팅시 아래의 작업으로 이루어 진다
   : WDT(와치독 타이머) disable, interrupt disable, PLL 설정(시스템에서 사용하는 클럭 설정)
   : 시스템 초기화 작업 이후 차단한 설정을 원복

시스템 초기화 시 메모리 영역 초기화
 - 아래와 같이 구성된다
    RAM
       high 주소
        스택(stack): 일반 지역변수
        힙(heap): 동적할당
        비초기화 데이터(ZI, .bss): 부트코드 실행시 0으로 초기화, 초기 값 없는 변수(전역변수, 배열, static 변수) 
        초기화된 데이터
       low 주소

    ROM
       초기화된 데이터(RW, .data): 초기 값 있는 변수(전역변수, 배열, static 변수) 
       텍스트(RO, .text): 명령어 코드와 RO데이터를 의미함. 함수, 제어문, 상수 등


7) 펌웨어 수준의 디바이스 제어
GPIO 컨트롤러(General Purpose Input Output)
 - 프로세서와 외부 장치사이의 특정 신호 및 이진상태를 입출력하기 위해 사용하는 입출력 포트
 - 다음과 같은 설정을 관리한다
    : GPIO input, output
      입력설정일 경우 현재 핀 값 획득
      출력설정일 경우 핀의 값 설정
      GPIO를 통해 입력받은 인터럽트 발생여부
      인터럽트 시그널 감지 방식 설정(rising edge, falling edge 등)
      clock output 설정
      대체기능 사용여부 설정

Timer
 - 주된 타이머는 표준 타이머(TRM), PWM, Watch dog Timer 등이 있다.


8) 임베디드 OS
OS: HW 시스템을 관리하고, 응용 소프트웨어를 실행하기 위한 기능과 서비스를 제공하는 시스템 소프트웨어

OS의 역할(OS가 제공하는 기능)
 - 프로세스 관리: 프로세스 생성, 제거, 통신(IPC) 관리. 스케줄링을 통한 프로세스 할당
 - 메모리관리: 모든 프로세스에 대한 가상 주소 영역 구측, 시스템 콜을 통한 Memory subsystem과의 통신(MMU를 통한 메모리 관리)
 - 네트워크 관리
 - 파일시스템 관리
 - 장치(device) 제어: device dirver을 사용하여 장치를 제어

기타
 - 32비트 시스템의 경우, 각 프로세스마다 가상메모리를 4gb를 할당받으며, 1gb는 kernel, 3gb는 응용프로그램에게 할당된다
 - 프로그램간 데이터 교환은(통신) 커널영역을 통해 이루어진다
 - 임베디드에서 사용하는 OS는 자원을 적게 사용하며, 목적에 맞는 기능을 제공하여 효율적인 실행을 지원해야한다
 - 크게 RTOS(hard realtime system과 soft realtime system으로 나뉜다)와 GPOS(window, linux와 같은 일반적 OS)로 구분된다


9) 오픈소스 기반 임베디드 시스템(리눅스/안드로이드)
Open Source Software
 - 소스코드를 공개해 누구나 특별한 제한 없이 코드를 사용할 수 있는 Open Source License를 만족하는 소프트웨어를 의미
 - 임베디드 분야에서 사용하는 리눅스 기반 플랫폼의 예: 안드로이드, 임베디드 리눅스, limo, meego, tizen 등

안드로이드와 리눅스 시스템 아키텍처 차이
 - 그림을 봐야 이해가 쉬우니 아래의 링크 참조
   : https://codingcoding.tistory.com/591
   : https://www.epnc.co.kr/news/articleView.html?idxno=45513

10) 개발환경 설정
 - GNU Toolchain 설치, 타겟에 해당하는 BSP 압축해제, 부트로더(ex: U-boot) 빌드, 커널빌드, NFS 설정(혹은 TFTP) 후 타겟의 ROM으로 바이너리 복사 순으로 이루어진다

11) Bootloader 및 boot sequence
Bootloader: 타겟 시스텀의 HW를 초기화하고 OS 및 응용프로그램의 이미지를 ROM에서 RAM으로 복사해 실행시키는 시스템 프로그램
            (startup code처럼 PLL설정, 메모리초기화 HW 장치 초기화 등의 과정을 수행한다)
   ** 일반적으로 부트로더의 위치는 ROM계열의 물리주소 0x0번지를 사용한다(아니면 따로 파티션을 생성하여 관리한다)
   ** HW 의존성이 강하기 때문에 대부분 어셈블리 언로 작성된다

U-boot: 유니버설 플랫폼을 위한 Open source bootloader, 리눅스와 안드로이드를 지원하며 TFTP, USB등의 다양한 부팅방법을 지원한다
   ** 소스 및 자료 참조: https://sourceforge.net/projects/u-boot/
                         ftp://ftp.denx.de/pub/u-boot/

U-boot관련 주요파일
 - config.mk: u-boot의 코드 동작하기 위한 텍스트 섹션이 위치할 주소를 지정
 - u-boot.lds: u-boot의 이비지 배치를 위한 링커 스크립트
 - lowlevel_init.S: PLL, Mux 등을 설정
 - start.S: 부팅을 위한 엔트리 포인트(.global_start, _start)가 위치해 있다

boot sequence
 - rom에 boot loader, zimage, ramdisk.img, system.img, userdata.img 등이 존재
 - 외부 제어기(OM pin)에 operating mode를 통해 i-rom에서 해당하는 booting 저장장치에 접근, i-ram에 부트로더 중 전처리 부분을 복사한다
 - 전처리 부분에서 HW및 메모리 초기화를 진행하고 후처리부분을 RAM에 복사하여 실행한다
 - 후처리 부분에서 커널(zimage)을 복사, 압축해제를 수행하고 커널의 시작주소로 점프한다
 - 커널 실행(커널 부팅)


12) kernel 및 device driver
kernel
 - 프로세스 관리, 메모리관리를 수행하며, 스케줄러, 디바이스 드라이버, 가상파일시스텀, 파일시스템등을 포함하고 있다
    ex) 프로세스 생성 및 관리, 이벤트 전달, 메모리 할당 및 보호, MMU를 사용한 메모리 관리, 파일생성/접근제어/디렉터리 관리, 디바이스 드라이버 제어를 위한 sequnce control제공
  ** 안드로이드 커널의 경우 추가적인 디바이스 드라이버가 필요하다(ex: binder driver, ashmem driver, low memory killer, logcat uitility 등)

커널 구성요소
 - VFS
     Device File System
       character driver
     General File System
       Buffer Cache
         Block driver
     socket file system
       inet socket, tcp, udp, ip
         network driver
   process management, memory management
   

기타
 - 커널 주요 디렉터리, 커널메세지, linux RFS, device file/device node, translation table, memory access control, system call(VFS, Exception Vector Table), 모듈추가(Kconfig, make menuconfig, make config) 등

'Study > Embedded basic' 카테고리의 다른 글

Arm 구조 및 제어 - 2  (0) 2022.05.29
Arm 구조 및 제어 - 1  (0) 2022.05.29
임베디드 C 프로그래밍  (0) 2021.09.24
임베디드 시스템 이해 - 1  (0) 2021.09.23
복습  (0) 2021.09.23

+ Recent posts