고급 개발자로 가는 길

OS/Linux

임베디드 리눅스의 구조

다크엔지니어 2020. 4. 25. 15:41
반응형

root filesystem - 어플리케이션이 존재하며, 실제 사용자의 인터페이스를 제공
----------------------
operating system - 사용자나 어플리케이션 들의 요청사항을 처리, 하드웨어 및 전체 시스템을 제어
----------------------
bootloader - 하드웨어 초기화 등 부팅환경 설정하고 운영체제를 실행
---------------------

1. bootloader
bootloader = bl0, bl1, bl2 구성
bl0 - 주로 전원이 들어오면 BIOS 에서부터 시작되서 MBR 을 찾게되고... 그 다음 어떤 모드로 부팅을 하면되고
       셋팅하면되는지를 찾게되며 CPU internal 에 있는 iRom에 있는 코드를 읽어서, iRam에서 수행?된다.
       부팅을 어떤 모드로 하냐가 중요해지며 이것을 Operation Mode 이라고 하는데 OM 은 주로 DIP Switch 형태
       로 구성된다. BL0은 Om을 체크해서 어떻게 부팅되는지를 판단한다고 정리하자.
bl1 - BL0은 부팅을 하고 싶지만 iRom사이즈가 작은 관계로 전제시스템제어나 동작을 하지는 못하므로, Bl1에게 부탁한다,
       BL1은 4KB ~ 16KB 작은사이즈로 구성된다. -> HW dependency 의존 체크와 같은 녀석이다.
       bl1 은 부트스토리지인 nand sdcard 등에 있는 bl2 를 읽어서 메모리로 로딩&실행을 시켜준다.
       즉 bl2 로 nand 나 sdcard 에 올리면 bl1 으로 메모리에 로딩 및 실행은 bl1 이 하는것이다.
bl2 - 이 녀석이 흔히 이야기하는 bootloader 이다. 내가아는 LILO GRUB도 있지만 arm architecture 에서는 uboot가
       많이 이용된다.
       uboot 가 하는일은 cpu 초기화 memory, hw 초기화 램타이밍 등을 설정한다고 보면된다. 몇MHz, GHz로 동작할거냐
       등등 Memory의 Access Timing 등 이다.

#bootloader 를 정리 해보면 boot 스토리지에 있는 즉 nand, sdcard에 있는 OS 즉 linux kernel 을 읽어와 메모리에 로딩하여   동작시켜주는 역할을 한다고 보면된다. 이말을 하고싶었다.

2. Operating System
말그대로 운영체제이다. 전반적은 시스템을 제어하기 위함이다. kernel 자체라고 보면된다.
운영체제는 사용자를 위한 인터페이스와 시스템 리소스(하드디스크, 랜카드인 물리적인것과, filesystem proccess 인 logical )
을 처리 및 관리하ㅣ위한 녀석이다.

이 시스템을 제어하는 linux라는 운영체제가 어떤구조인지 볼 필요가 있다.


==========================================
  Root Filesystem
==========================================

    kernel area(1GB~3GB)

  Systemcall Interface

----------------------------------------------------------------------

  Virtual Filesystem

----------------------------------------------------------------------

Filesystem   DeviceDriver   NetworkProtocol   Process   MemoryManagement

==========================================
  Bootloader
==========================================


Linux 는 kernel 이라고 했는데 kernel에 shell 을 사용하여 user interface를 제공한다.

Filesystem - 하드디스크와 같은 저장장치에 있는 데이터에 접근 가능하기 위한 interface이다. 물론 저장장치 내부의 테이터
     를 표현하는 블럭이기도 하다. kernel에서는 저장장치 외에도 특수한 목적을 위한 filesystem 도있다.
DeviceDriver - 하드웨어를 제어하기 위한 블럭?이다.
Network - kernel 내부에 구현되어있는 프로토콜대로 ipv4, ipv6, wireless Lan, bluetooth 등
Process - 프로세스는 작업위 단위이다. task? 라고 보면된다. Thread 의 큰 개념이다. 큰개념? 걍 Process 이다.
Memory Management - 대부분의 프로그램은 자신이 동작하기 위해 반드시 필요한 조건이 있다.
         바로 메모리이다. 소스코드는 메모리영역에 에 값을 쓰고 메모리를 할당 받고 바이너리 파일로
                    구성이 된다. 메모리는 프로그램이 동작하는 중간중간에도 할당받기도 한다. 그러한 회수등 관리를
                    하는 블럭이라고 보면된다.
Virtual Filesystem -Virtual filesystem 과 systemcall 은 긴밀한 관계를 갖고있는데, 리눅스라는 운영체제는 추상화를
  잘 이루고 있다고 한다. 추상화란 물리적인 개념을 인식할 수 있는 형태로 표현하는것인데
  그냥 형태를 만든다 라고 이해해도 된다. 물리적으로 존재하는것이 바로 시스템 리소스가 된다.
  시스템 리소스는 물리적으로 존재하는 하드디스크 cpu, sdcard 메모리등 HW와 관련된 녀석들이다.
  개념적으로 존재하는것은 하드디스크를 어떤 알고리즘으로 input output 처리 할것이냐에 대한 disk i/o
  과정, cpu를 어떻게 사용할 것이냐에 대한 scheduler, cpu 를 사용하느 녀석에 해당하는 process/task
  같은 녀석들이 이에 해당한다. 바로 FILE 이다.
  리눅스에서 이 file 은 무척이나 재미있께 표현 및 사용된다.
  일반적으로 파일이라고 하면 하드디스크와 같은 스토리지 내부에 특정 포멧으로 저장되어 있는 데이터
  를 의미한다. flash memory에 있는 녀석 데이터를 file 화 한다 뭐 그런말이다.
  
  근데 이 file 은 스토리지에 실제로 존재하지않는 데이터들도 파일로 표현한다.
  /proc/ /sys에 있는 파일들이 이에 해당한다. 실제로 하드디스크에 존재하지도 않는다.
  특수한 파일시스템으로 Ram, 즉 메모리를 통해서 그 file 정보를 관리하는 녀석들이다.

  이중에서 /dev 내부의 내용은 조금 특이하다. Ram 을이용하여 표현되는 녀석도 있고,
  하드디스크 내부에 포함되어 있는 녀석도 있다.
  정리하자면 시스템 리소스 중 HW에 해당하는 녀석들을 File로 추상화하고 있는 녀석이 바로 /dev 이다.
  
SystemCall Interface - libc 라이브러리에서 제공하는 함수가 실행될 때, 이에 대응해서 OS 에서 실행되는 SW Interupt
      이다. 그냥 OS 안에 포함되어 있는 래퍼함수라고 이해해도 된다.    
      libc 는 Glibc/Blibc/bionic libc 등 다양한 종류가 있으나 System Call Interface를 동작시킨다는
      관점에서는 모두 동일하다.
      어플리케이션 단에서 sys_open() 을 사용하면 /dev/abstracted_device_file 얘를 동작시켜주는 녀석이
      Virtual FileSystem 이다.
      즉, 어플리케이션 단 에서 하드웨어를 제어하고싶은 게 있는데,
                 어플리케이션을 만들면서 하드웨어를 어떻게 제어할 것인가.. 그 하드웨어가 어떤방식(I2C, SPI, SDIO,
      I2S .. )  으로 CPU와 통신하며 동작하는지, 하드웨어가 아닌 파일시스템 이라면 어떤 포멧(FAT,
      NTFS, EXT3,4, YAFFS2, UBIFS )인지 알아야하는 문제가 있는데 그것을 대신해주는 녀석이
      VFS Virtual File System 이다.
      어플리케이션단이 System Call 인터페이스를 구동시킬때 동일한 방식으로 시스템을 제어하도록
      돕는 도구가 Cystemcall and Virtual Filesystem 이다.
     
      시스템이 존재하는 리소스들을 하나하나 File로 표현하면 어플리단에서 libc를이용해 동일한방식
      open() 하고 동일한 방식으로 read() 하며, 동알힌방식으로 write() 수행하게 된다.
      그러면 시스템이 제어가 된다. 어플리케이션에서는 단순히 파일만 access하는 거지만 , 그 파일이
      시스템 리소스오 ㅏ연결되어 있는 녀석들이니깐..
     
      결국 File 이라는 것은 단순히 하드디스크 안에 저장되어있는 녀석이 아니라 시스템 리소스들도 file 로
   다루기때문에 중요하다.

 

ftp://ftp.denx.de/pub/u-boot

 

반응형

'OS > Linux' 카테고리의 다른 글

shell script  (0) 2020.05.08
UBI 혼자 끄적  (1) 2020.04.29
Oracle, Ubuntu 18.04 Install  (0) 2020.04.11
Putty, Tera Term VT 사용  (1) 2020.04.09
Arm 에 대하여  (0) 2020.03.18