728x90

임베디드 시스템

- 부피/전력이 큰 하드디스크 대신 플래시 메모리 사용

- 하드디스크를 가상으로 구현하고 파일시스템을 만든것 -> 플래시 파일시시스템

 

플래시 시스템

- 플래시 메모리 특성에 최적화

- 데이터 읽기는 블록과 관계없이 바이트 단위로 자유롭게 읽음

- 데이터 변경시 블록 단위로 처리

- 쓰기 수명이 있어 메모리 수명고려

- 모든 블럭에 골고루 쓰기하여 수명을 최대한 늘여야한다.

 

(1) 플래시 파일 시스템

1) 플래시 메모리 구조

2) 플래시 파일 시스템

3) JFFS

4) YAFFS

 

1) 플래시 메모리 구조

플래시 메모리

- 저비용 불활성 메모리

- In-system rewritable eprom

- nor형 : 셀 크기가 크지만, 고속 랜덤 액세스 가능

- nand 형 :셀 크기가 작고, 고속의 burst 액세스 가능

 

                       NOR형     NAND형

- 프로그램 속도    느림         빠름

- 직접도              낮음         높음

- 액세스 단위 속도  높음        낮음

                            x     임베디드시스템에서 주로사용

* 데이터 액세스 속도가 느리므로 대부분 프로그램은 플래시메모리 내용을 메인메모리에 복사하여 실행

 

2) 플래시 파일 시스템

플래시 파일 시스템

- 플래시 메모리상에 구현된 전용파일 시스템

- 아래의 이유로  ext2 파일 시스템 구현 힘듬

 ->블록 크기차이 : 플래시 메모리 - 64k ~256k / ext2 - 1 ~ 8k

 -> 플래시 메모리 삭제 및 횟수 제한

- 비용부담 -> 파일 시스템 크기 축소하기위해 파일시스템 이미지 합축

- 파일시스템 신뢰도향상 -> 저널링 사용

 

플래시 메모리의 XIP(Excutable in place) 기능

- 플래시 메모리에 저장된 내용을 RAM에 복사하지 않고 플래시 상에 직접 실행하는 독작모드

- 파일시스템 압축 -> XIP 구현힘듬

- XIP 기능 사용 -> writabe 파일시스템 구현 힘듬

 

MTD(Memory technology device)

- 리눅스에서 제공하는 플래시 메모리 추상화 계층

- 다양한 플래시 메모리에 대해 동일한 API 사용

- MMC, SD, CF 지원하지 않음

- /dev/mtd0, /dev/mtd1 를 통해 데이터 입출력

- ioctl() 함수를 사용하여 MTD 정보 참조

 

FTL(Flash Translation Layer)

- 플래시 메모리를 블록 디바이스로 추상화

- 리눅스에서 플래시 메모리를 블록디바이스로 처리가능 -> 파일시스템 구현 가능

 

3)JFFS

JFFS

- Journaling Flash File System

- 디스크 없는 임베디드 시스템에서 NOR 플래시 메모리를 사용한 저널링 파일 시스템

- MTD 통해접근, 순환로그를 사용해 플래시 메모리 수명 늘림

 

JFFS2

- JFFS의 NAND 플래시용 파일 시스템

- 압축을 통한 성능향상

- 하드링크 지원

 

(2)임베디드 시스템의 플래시 메모리 활용

1) 플래시 메모리 활용

2) 플래시 메모리 맵

3) 플래시 메모리 퓨징

4) 플래시 메모리 퓨징 실시 예

 

1) 플래시 메모리 활용

임베디드 시스템의 플래시 메모리 활용

 1. 부트로더, 커널이미지, 램디스크 이미지 저장공간으로 사용

 - 초기 부팅과정에서 모두 메인메모리로 압축해제된 형태로 복사되어 실행

 - 응용프로그램 실행과정에서 데이터 저장이 필요한 경우 플래시 메모리 특정공간을 할당해서 직접 써넣음

2.. JFFS, YAFFS 플래시 파일 시스템을 사용하여 하드처럼 사용

 

2) 플래시 메모리 맵

- 플래시 메모리의 분할 구조

- 플래시 메모리를 블록단위로 나누어 그 용도를 사전에 정의

- 임베디드 소프트웨어 컴포넌트들이 저장되는 위치들로 맵을 구성

 

플래시 메모리 맵 예시

- 램디스크들의 물리적 위치가 사전에 정의

3) 플래시 메모리 퓨징

- 퓨징 : 프로그램 또는 데이터를 플래시 메모리 맵에 따라 써넣는것

  ->퓨징의 주체에따라 호스트 컴퓨터 퓨징, 타겟보드 퓨징

 

호스트 컴퓨터 퓨징

-호스트 컴퓨터에서 타겟 보드 플래시 메모리를 직접 퓨징

- 호스트 병렬 프린텉 포트와 타겟보드의 JTAG 인터페이스 연결하여 퓨징

- 타겟 보드에 초기화 프로그램(부트로더)가 설치안된경우 초기화 프로그램을 퓨징할때 사용

 

타겟보드 퓨징

- 초기화 프로그램(부트로더)에서 TFTP를사용

- 소프트웨어 컴포넌트를 타겟보드의 RAM에 다운로드

- 부트로더의 퓨징 명령어 사용

- 플래시 메모리 퓨징

-> 초기화 프로그램을 제외한 나머지 컴포넌트를 퓨징할때 사용

 

300x250
728x90

램디스크

- 파일시스템을 램 상에 구현한 가상의 하드디스크

- 부팅 초기에 부팅속도 향상을 위해 루트파일시스템을 마운트하여 사용

- 임베디드 시스템에서는 비휘발성인 플래시 메모리에 램디스크 이미지를 압축해서 저장

- 부팅과정에서 램디스크 이미지를 휘발성 메모리인 램에 로딩해서 사용

- 리눅스 상에서 램디스크를 생성하고 수정하는 절차를 배움

 

(1) 램디스크 개요

1) 램디스크

2) 램디스크 관련 명령어

3) 램디스크 생성 절차

4) 램디스크 수정 절차

 

1) 램디스크

램디스크 개요

- 램디스크 : 메모리의 일정공간을 하드디스크 처럼 사용

- 램디스크 이미지 : ext2 파일시스템의이미지를 갖는파일

   ->  램디스크 이미지 1개로 표현

- 램디스크 오브젝트 : 램디스크 이미지를 가지고있는 ELF 오브젝트 파일

   -> 램디스크를 리눅스 커널에 링크할때 사용

- 램디스크 디바이스 파일명 /dev/ram0

 

램디스크활용

- 장점 : 하드디스크보다 rw 속도빠름

- 단점 : 휘발성 메모리로 전원공급중단시 파괴

- 부팅 초기에 루트파일시스템의 필수부분만을 마운트하여 부팅속도 향상

1. 플래시 메모리에 램디스크 이미지 압축저장

2. 부팅과정에 램디스크 이미지 압축해재

3. 휘발성 메모리 램에 로딩하여사용

 

임베디드 시스템에서 하드쓰지 않는경우

- 램드스크, 플래시메모리상에 플래시파일시스템사용하여 시스템구현

 

응용프로그램개발, 유틸리티 프로그램이 추가되야하는경우

-> 램디스크 이미지 수정작업이 필요

 

루프백(Loopback) 디바이스

- 파일을 블록디바이스처럼 사용하는 가상디바이스

- 사용전에 파일 시스템에 마운팅

- 램디스크같이 파일 시스템이 파일로 표현되는경우 사용

- 램디스크 이미지는 루프백 디바이스로 설정해주어야 한다.

- 루프백 디바이스명 : /dev/loop0

 

초기 램디스크 디바이스

- initr : 주번호 1, 부번호 250, 읽기전용 디바이스, 리눅스부팅시 임시루트파일 시스템저장하는 램디스크

      init 프로세스 실행에 필요한 디바이스 드라이버 및 유틸리티포함

 

초기 램디스크 디바이스 사용한 부팅절차

1. 초기램디스크디바이스마운팅완료

2. 램디스크 상에있는 /linuxrc 프로그램실행

3. 실제 루트파일시스템으로 마운팅

  -> 실제 루트파일시스템이 /initrd 디렉토리를 포함하고있으면 램디스크 디바이스 마운팅 위치가/에서 /initrd로바뀜

4. 램디스크상에 있는 /linuxr 프로그램이 실행

 

2) 램디스크 관련 명령어

dd(Data definition) 명령어

- raw 데이터를 저수준에서 복사하거나 변환 하는 명령어

- 초기 램디스크를 만들경우 사용

 

mke2fs 명령어

- 파티션 초기화

- ext2 or ext3 파일시스템 생성

 

mount 명령어

- 파일시스템을 마운트하는 명령어

 

losetup  명령어

- 루프백 디바이스 셋업 및 제어

 

4) 램디스크 수정

- 램디스크 이미지 파일은 압축된 루프백 디바이스 파일

  -> 압축해재후 루프백 디바이스를 사용하여 마운트 과정이 필요

 

 

(2) 루트파일시스템

1) 루트파일 시스템개요

2) 루트 파일 시스템 생성

 

1) 루트파일시스템 개요

개요

- 루트파일시스템 : "/" 디렉토리에 마운트되는 파일시스템

- 시스템  초기화 및 각종 주변장치들을 제어하기위한 파일 및 부팅에 필요한 내용들을 포함하는 파일시스템

- 루트 파일 시스템은 일반적으로 읽기 전용으로 마운트 되었다가 커널이 정상적으로 로딩 되면 RW모드로 변경

 

루트파일시스템의 구성

- 루트파일 시스템에 필요한 최소 디렉토리로 시스템 운영에 필요한 디렉토리로 구성

1. /dev : 디바이스 파일

2. /proc : 커널 실행정보

3. /etc : 시스템 설정파일

4. /sbin : 시스템 관리에 필요한 필수실행파일

5. /bin : 시스템 기본 실행파일

6. /lib : 런타임 공유 라이브러리

7. /mnt : 마운팅 포인트로 사용

8. /usr : 유틸리티와 응용프로그램

9. /root : 루트사용자의 홈디렉토리

10. /boot : 부트로더의 디렉토리

 

루트파일시스템 구현

- 임베디드시스템은 하드디스크가 없거나 부팅속도향상을 위해 루트파일시스템을 램디스크상에 구현

- 범용 리눅스시스템은 부팅속도 향상을 위해 부팅 초기단계에서 램디스크 사용

 

루트 파일시스템 생성 절차

1. dd 명령어로 램디스크 이미지 생성

2. 파일시스템 ext2 포멧

3. 파일 시스템 마운팅

4. 기본 디렉토리 생성 : /dev,/proc,/sbin ...

5. 필수 라이브러리 복사 : glibc 복사

6. init 및 스크립트 설치 : sysvinit 패키지

7. 디바이스 파일 설치 :mknod

8. 필요한 응용프로그램 설치 :busybox, tinylogin

9. 쉘프로그램 설치 ; bash

10. 루트파일 시스템 이미지 생성 : gzip과 mkimage 명령어 사용

 

 

300x250
728x90

리눅스  파일 시스템

- 리눅스 커널에서 사용하는 데이터, 프로그램 저장

- 커널 동작을 위한 데이터/실행파일들이 루트파일시스템에 마운트되야 사용가능

- 모든 파일들을 계층적 구조로 관리 -> 최상위에 /가 있고 아래에 트리구조로 연결됨

 

기본 파일 시스템 "ext2"

- 가상 파일 시스템을 사용해서 다른 종류의 다양한 파일 시스템 지원

- 파일 시스템 생성 및 관리 도구 사용방법 숙지 필요

- 임베디드 시스템의 경우 램이나 플래시메모리로 파일 시스템 생성 및 관리

- 파일 시스템에 대한 기본적인 정보는 범용 컴퓨터와 동일하게 적용

 

(1) 파일 시스템 개요

1) 파일 시스템

2) 리눅스 파일 시스템

3) 리눅스 파일 유형

4) 가상 파일 시스템

5) 리눅스 파일 시스템 구조

6) /proc 파일 시스템

 

1) 파일 시스템

파일 시스템

- 운영체제가 파일들을 효율적으로 디스크에 저장하고 관리하기 위한 방법과 자료구조

- 데이터나 프로그램을 저장하고 있는 파일들을 저장, 탐색, 접근, 조작하기 위한 추상적 자료구조 집합체

- 디스크의 물리적인 트랙, 섹터, 실린더를 논리적 단위로 할당

 

파일 유형

- 일반 파일, 디렉토리

- 디바이스 파일 :문자디바이스, 블록디바이스

- 기타 파일 : 소켓, 파이플, 심볼릭/하드링크

- 모든 자원들을 파일과 동일하게 처리

 

저장 자원

- 하드 디스크

- 플로피

- CD롬

- DVD

- Flash ROM

 

루트파일시스템

- 리눅스 디렉토리 구조의 최상위 위치인 "/"에 연결된 파일 시스템

- 리눅스 리눅스 실행시 필요한 데이터와 프로그램 저장

 

루트 파일 시스템 최소 구성

-최소 디렉토리 : /dev, /proc, /bin, /etc, /lib, /lusr, /tmp

-기본 유틸리티 프로그램 : sh, ls, cp, mv, etc

- 최소 설정 파일 : rc, initab, fstab, etc.

- 기본 디바이스 : /dev/hd*, /dev/tty*, /dev/fd0, etc.

- 유틸리티 위한 런타임 라이브러리 준비되야함

 

마운트

- 마운팅 : 새 파일시스템을 루트파일시스템에 연결

- 마운팅포인트 : 새파일시스템이나 파일이 연결되는 위치

 

inode

- 파일에 대한 정보를 보관하는 커널 데이터 구조체

- 구성 정보 : 파일 유형, 접근권한, 소유권, 시간기록, 크기, 링크카운터, 데이터블록에대한 포인터

- include/linux/fs,h에서 정의

 

접근 권한

- 파일에대한 읽기 쓰기 실행에 대한 접근 허가권

- setuid, setgid, chmod, umask 로 설정

 

2) 리눅스 파일시스템

리눅스 파일시스템

- 가상 파일시스템 (VFS)를 사용하여 다양한 파일시스템 지원 및 통일된 접근 방법 제공

- 대표적인 파일시스템

  ext2 : 기본파일 시스템

  ext3 : ext2에 저널링 기능 추가

  NTFS : 윈도우 파일시스템

 

리눅스 기본 파일시스템

- 초기 파일시스템 : Minix 파일시스템

- ext(extended file system) : 1992. 리눅스 버전 0.96c서 사용

- ext2 : 1993.1 개선된 ext파일 시스템 릴리즈

  -> 최대 2gb 파일크기와 4TB 전체파일시스템 구성 가능

  -> 가변 블록 크기 변경 및 파일시스템 확장 가능

 

3) 리눅스 파일 유형

일반 파일

- 데이터나 프로그램을 저장한 일반 파일은 커널 내에서 inode라는 데이터 구조체로 표현

-포인터로 직접 연결

- 포인터로 간접 연결

- 이중 연결

-> 많은 블록을 필요한 대용량 파일도 사용가능

 

디렉토리

- 계층적 파일시스템 구성

- 파일과 하위디렉토리에 대한 정보 저장

- indoe 번호와 파일이름을 테이블 형태로 저장하는 파일

 

디바이스 파일

-모든 디바이스는 디바이스 파일을 통해 접근

- 디스크 공간을 쓰지 않고, 디바이스 드라이버에 대한 접근 포인터 가능

- 입출력 장치 유형에 따른 디바이스 파일 사용

   문자 디바이스 파일 : 문자 모드 입출력 동작

   블록 디바이스 파일 : 버퍼캐쉬를 통한 블록 단위 입출력 동작

- 디바이스 파일에 대한 입출력요청은 디바이스드라이버에 전달

- 디바이스 식별은 주번호와 부번호를 사용

 

링크

- 하나의 파일에 여러개 indode 지정

- 동일한 파일에 서로 다른 파일명 지정 가능

- 하드링크 : inode 에 대한 포인터 사용. 동일 파일시스템 내에서 사용가능

- 심볼릭 링크 : inode에 대한 포인터를 사용안함. 해당 파일의 파일이름을 저장하고있는 파일

- 하드링크는 동일 시스템내에서만 링크가능, 심볼릭링크는 다른 파일시스템도 링크가능

 

4) 가상 파일시스템

- VFS

- 파일시스템과  커널 사이 가상의 파일시스템 층 생성

- 파일시스템에 통일된 인터페이스 제공

 

가상 파일 시스템 구조

- 다양한 파일 시스템 접근 가능하게 함

1. 사용자 프로세스는 시스템 콜로 파일 시스템 접근 요청

2. 가상 파일 시스템을 통해 실제 파일시스템에 접근

3. 어떤 파일시스템을 사용하더라도, 동일한 접근방식 사용 -> 안정성, 이식성 증가

 

VFS가 지원하는 파일시스템

1. 디스크 기반 파일 시스템 

  - 로컬 디스크 파티션의 저장공간  관리

  - ext2, NTFS, MS-DOS, CD-ROM

2. 네트워크 기반 파일 시스템

  - 네트워크상 다른 컴퓨터의 파일시스템에 접근가능

  - NFS, SMB

3. 특수 파일시스템(가상 파일시스템)

  - 디스크 공간을 사양하지 않음

  - /proc : 사용자가 커널 데이터 구조에 접근할수 있는 인터페이스 제공

  - /dev/pts : UNIX98 표준 가상 단말 제공

 

5) 리눅스 파일 시스템 구조

파일 시스템 개요

- / : 최상위 디렉토리

- bin : 중요한 명령어들 포함

- boot : 커널 시스템 부팅관련 파일 저장

- dev : 시스템 디바이스 파일 저장

- etc : 시스템 전체 환경 설정 파일 저장

- home : 사용자 홈 디렉토리

- initrd : 부팅과정에서 사용되는 초기 램디스크

- lib : 프로그램에 필요한 라이브러리 저장

- lostfound : 파일시스템 검사 명령어 fsck 가 사용하는디레게토리

- misc : 시스템 아키텍처에 독립적인 자료 저장

- mnt : 마운트 포인트 사용되는 디렉토리

- opt : add-on 패키지가 설치되는 패키지

- proc : 실행중인 프로세스나 현재 시스템 정보를 파일형태로 보여주는 가상파일시스템

- root : root사용자 홈디렉토리

- sbin : 시스템 관리자용 명령어들이 저장된 디렉토리

- tmp : 임시저장디랙토리

- usr: 각종어플리케이션

    lib : /lib 에 있지않은라이브러리 디렉토리

    include : C프로그램에 필요한 헤대 퍼일

    local : 웹 서버등 추가 소프트웨어 설치

    sbin : /bin에서 제외된 명령어와 네트워크 관련 명령어

    src : 프로그램 소스 저장

- var : 시스템 운용중 생성되었다가 삭제되는 임시보관장서

  6. /proc 파일 시스템

- 커널 내부데이터 구조에 대한 인터페이스 제공

- 커널 상태나 실행중인 프로세스에 대한 정보 제공

- 커널, 프로세서, 주변장치들의 운용상태 및 동작상태 정보 제공

- /proc/pid : 실행중인 프로세서에 대한 정보. 프로세서 번호별로 디렉토리 생성

- /proc/loadavg : 1,5,15분 단위 평균시스템 부하

- /proc/uptime : 시스템 시작후 지난 시간 초단위 표시

- /proc/meminfo : 메인메모리와 스환 전체 크기, 사용량, 여유공간을 바이트단위로 표시

- /proc/ksmg : 커널 메시지

- /proc/cpuinfo : 프로세서 파라미터

- /proc/pci : pci 슬롯 점유상호아

- /proc/scsi : scsi 디바이스 정보

- /proc/net : 리눅스 네트워크 레이어 관련 정보 

     unix : 사용중인 unix domain 소켓 정보 저장

     arp : arp 테이블

     route : 라우팅 테이블

     tcp : TCP 소켓 정보

...

 

(2) ext2 파일 시스템

1) ext2 사양 비교

2) ext2 구조

3) ext3 및 ext4

 

1) ext2 사양 비교

ext2 사양비교

- 1993.1 기존 ext 파일시스템 개선한 파일시스템

- 데이터 블록 크기 : 1~8KB

- 디렉토리 당 최대 하위디렉토리 수 : 32,768

- 최대 파일 시스템 크기 : 2T ~ 32TB

- 최대 파일 사이즈 : 16G ~2TB

- ext2 파일시스템은 ext3,4 로 확장되어 리눅스에 사용

 

ext2 파일 시스템 구조

- /usr/include/linux/ext2_fs.h에 정의

- 맨 앞에 boot sector

- 뒤로 block group이 따라감

- block group은 boot sector, block group, data bitmap, inode bitmap, inode table, data block로 구성

 

슈퍼 블록

- 파일 시스템에 대한 메타 데이터 저장한 구조체

- 하드디스크 시작위치에서 1024 바이트 오프셋 위치에 저장된 메모리공간

- 파일 시스템 마운팅에 필수 정보

- 구성 : inode 수, 사용중인 블록, 블록 크기, 프래그먼트 수, 파일시스템 마운팅 시간, 마지막 쓰기 시간 등

 

inode

- 128 바이트로 구성

- 파일 타입, 접근권한, 생성시간, 접근시간, 소유자 아이디, 데이터 블록의 수와 데이터 포인터, 간접블록용 포인터

 

ext2 라이브러리

- libext2fs

- ext2 파일시스템 제어구조 처리할수있는 함수

- 파일 시스템 관련 함수

- 디렉토리 관련함수

- inode 관련함수 제공

 

유틸리티 프로그램

- e2fsprogs

- ext2 파일시스템을 생성 수정 변경 디버깅 할수있는 유틸리티 포함하는 패키지

- mke2fs : 파일시스템 초기화하여 ext2 파일시스템 생성

- tune2fs : 파일시스템 파라미터 수정

- e2fsck : 비정상 종료후 파일시스템 일관성 검사

 

3) ext3, ext4

 

ext3

- ext2+저널링 : 파일시스템 신뢰도 향상

 

저널링 파일 시스템

- 파일시스템 변동이력을 저널에 보관하여 신뢰도 향상

- 갑자기 전원공급 중단이나 시스템 다운시 복구를 용이하게함

 

ext4

- ext3의 개선

- pre-allocation : 파일 저장에 필요한 디스크 공간 미리 확보

- delayed allocation : 데이터가 디스크에 쓰여질떄까지 디스크 할당 지연

 

300x250
728x90

커널

- 운영체제 핵심 기능

- 파일 시스템 및 입출력장치 지원

-응용 소프트웨어 실행 환경 제공위한 소프트웨어 모듈

 

하드웨어 자원이 제한적이고/ 응용분야에 특화된 소프트웨어의 경우

- 운영체제 커널 필수 기능/소프트웨어만 남기고 나머지 삭제

-> 하드웨어 자원 활용도 높이고, 시스템 성능 향상

 

임베디드 시스템에 리눅스 설치

- 사용하는 타겟보드에 맞추어 커널 수정 필요

- 리눅스 소스 수정? -> 커널에 대한 정확한 이해, 안정성 보장 힘듬

=> 커널 코드 수정 대신 구성이나 기능을 선별적으로 선택하여 재구성을 함

- make 유틸리티

- 커널 기능과 sw 모듈들의 선택적 컴파일

=> 커널 실행파일

 

(1) 커널 재구성 옵션

1) 커널 컴파일 및 재구성

2) 커널 재구성 옵션

 

1) 커널 컴파일 및 재구성

 

커널 컴파일 및 재구성

1. 커널 컴파일 : 커널 소스로부터 커널 실행파일 얻는 과정

    - generic 커널 소스에 사용하고자하는 하드웨어 플랫폼용 패치 추가

    - make 유틸리티로 컴파일

   - make 유틸리티로 커널 컴파일 과정 시 다양한 커널 옵션 제공.

      사용 목적에 따라 커널 기능 설정하여 크기나 성능 최적화하도록 구성

  - 커널 옵션 설정 후 컴파일 하여 커널 이미지를 생성하여 실행

 2. 커널 재구성

   - 메뉴로 커널 옵션 선택/해제

    -> 커널 기능 일부 활성화/비활성화

    -> generic 커널이나 기존 커널 변경

   - 커널 소스 직접 수정 -> 소스 깊은 이해 필요

   - 커널 옵션을 통해 컨러 설정

    -> 주요 설정을 옵션 매뉴형태로 제공하여 쉽게 간단히/비활성화

3. 커널옵션 설정

  - 텍스트 기반 메뉴를 사용한 설정 : make menuconfig

  - X-윈도우 기반 설정 : make xconfig

  - 커널 옵션 설정 : /usr/src/linux/.config 파일 설정

 - 변경된 커널 실행 : 부트로더에 등록. 시스템 부팅시 변경된 커널이 선택되어 실행되도록 해줌

 

2) 커널 재구성 옵션

커널 재구성 옵션

- 커널 메인 메뉴에는 설정가능옵션 나열

- 선택시 서브메뉴 표시

- 메인 메뉴 옵션리스트는 시스템에 따라 다름

 

code maturity level options

- 불완전한 커널코드나 드라이버 사용여부 -> 시스템 안정성확보를 위해 선택안하는게 좋음

 

Loadable module support

-  set version information on all module symbols : 다른 버전 커널에서 생성한 모듈을 사용할 경우

 

processor type and feature

- math emulation : 수치연산 보조프로세서가없는 경우 에뮬레이션하는 경우 선택

- MTRP(memory type range resister) support : pci나 agp 버스를 사용하는 경우 선택

- 특정 프로세서, 플랫폼에 따른 설정 파라미터들을 정의해 선택적 커널 컴파일

 

general setup

- networking support : 네트워크 지원 여부 -> 대부분 임베디드시스템에서 쓰므로 선택이 좋음

- pci/eisa/mca support : pci/eisa/mca 버스지원여부 선택

- system v ipc : system v ipc 사용여부 설정

- pcmcia/cardbus support : pcmcia 카드 사용여부

- support hot-pluggable device : hot plug 디바이스 사용 여부

- bsd processing account : 프로세스 종료시 프로세서 관련 정보를 파일로 저장

- sysctl support : 커널 실행 중에 커널 파라미터나 변수값 설정

- kernel core format  : 커널 코어 포맷 설정

- kernel support for elf binaries : elf 지원 여부

- power management support : 자원 관리 모드 지원 여부

 

Memory Technology Device(MTD)

- MTD support : 플래시 메모리 사용여부 - 대부분 임베디드 시스템에서 플래시 메모리 쓰므로 반드시해야함

- Parallel port support : 프린터 및 병렬포트 사용하는 디바이스 지원

 

Plug and Play configuration

- plug and play support : PnP 기능을 가진 디바이스 지원

 

Block devices

- Loopback device support : 루프백 디바이스 사용 여부 -> 램디스크 사용하는 경우 루프백 디바이스 기능 사용

- RAM disk supoort : 램디스크

- Default RAM disk size : 기본 램디스크 크기지정

- Initial RAM disk supoort: 초기 램디스크

- Flash memory block support : 플래시 메모리를 램디스크로 쓸건지 설정

 

Networking options

- 대부분 임베디드 시스템에서 이더넷 지원하므로 네트워크 설정 작업은 매우 중요

- 다양한 옵션들을 시스템 동작환경에 따라 신중하게 설정해야함

- packet socket : 패킷 프로토콜 사용 여부 ->네트워크 디바이스에 직접 접근할경우 설정

- neetwork packing filtering : 네트워크 패킷에 대한 필터링 기능 지원 여부 ->라우터 게이트웨이,방화벽등 사용시 필요

- socket filtering : 소켓에 대한 필터링 여부

- undix domain sokets : 유닉스 도메인 소켓 지원 여부

- TCP/IP networking : TCP/IP 지원 여부

 

Network device support

- Network device support : 네트워크 카드 사용, SLIP, CSLIP 등 프로토콜 지원

- Ethernet : Ethernet network interface card(NIC) 사용 여부

- 네트워크 인터페이스 카드는 시스템에서 사용하는 네트워크 디바이스에 따라 선택적으로 선택

-> 커널 재구성전 네트워크 인터페이스에 대한 정보 파악

 

IrDA(infrared) support

- IrDa subsystem supoort : 적외선 통신 지원

 

Input core support

- input core support : 키보드 마우스 조이스틱 사용여부

 

character devices

- virtual terminal : 가상 단말 지원 여부

- support for console on virtual terminal : 가상터미널을 콘솔로 사용

- support for console on serial port : 표준 시리얼 포트를 콘솔로 사용

- unix98 pty support : pty 단말기 지원 여부

- watchdog cards : 하드웨어 및 소프트웨어 와치독 지원

 

USB support

- support for usb : usb 지원

- usb device file system : usb 파일 시스템 지원

 

console drivers

- vga text console : 일반 vga 표준 모드 콘솔 지원

- video mode selection support : 커널 시작시 비디오 모드 설정

- frame buffer support : 콘솔에서 그래픽 기능 지원하도록 설정

 

file systems

- quota support : 사용자별로 디스크 사용량 제한

- kernel automounter support : 원격 파일 시스템 자동 마운트

- /proc file system support : 시스템 상태 정보를 제공하는 가상 파일 시스템인 /proc 파일시스템 사용 여부

- /dev/pts file system for unix98 pys : /dev/pts 파일시스템 지원 여부. 텔넷 사용할 경우 선택

- second extended fs support :ex2 파일시스템 지원 여부. 리눅스 기본 파일시스템이므로 반드시 설정

- network file system : nfs 기능 쓰려면 설정

 

kernel hacking

- verbos kernel error message : 시스템 내부 에러 출력 여부

- verbos user fault message : 사용자 프로그램 에러 메시지 제공여부

 

 

(2) 커널 이미지 생성 절차

1) 임베디드 커널 이미지 생성 절차

2) make 유틸리티 작업 흐름

 

1) 임베디드 커널 이미지 생성 절차

임베디드 커널 이미지 생성 절차

- 임베디드용 커널 이미지 생성 절차는 일반 pc에서 리눅스 커널 컴파일 절차와 크게 다르지 않음

-> 커널 소스에 사용하는 프로세서와 타겟보드에 관련된 소스패치 작업이 필요

-> 재구성 과정에서 타겟보드에 관련된 커널 구성옵션 사용함

-> 생성된 이미지를 타겟 보드에 퓨징해서 사용함

 

임베디드 커널 이미지 생성 절차

1. 커널 소스를 다운받아 작업 디렉토리 /usr/src/linux에복사

2. 크로스 컴파일러를 포함한 툴체인 설치 확인 /usr/local/arm/bin

3. 타겟보드 환경에 적합하도록 커널 패치

4. 작업 디렉토리에서 이전 커널작업환경 삭제

5. 커널옵션사용한 커널 재구성

6. 커널 재구성과정을 통해 매뉴를 소스에 적용

7. 메이크파일간 상호의존성 검사

8. 불필요한 목적파일 삭제

9. 커널을 컴파일 및 이미지 생성

10. 커널 이미지를 FTP 명령어와 플래시메모리 퓨징명령어로 타겟보드에 퓨징

11. 타겟 보드 리부팅 후 새로운 커널 실행 확인

 

2) make 유틸리티 작업 흐름

1. check target-board environments

2. make menuconfig

3. make depend

4. make clean

5. make zImage

6. zImage를 타겟 보드에 퓨징 ->ftp zImage kernel, falsh kernel

 

300x250
728x90

리눅스 설치를 위한 리눅스 커널의 기본구조와 특징

- 리눅스 커널 재구성시 필요

- 운영체제에 대한 기본적인 이해 -> 커널 소스 구조 및 커널 내부를 구성하는 구성요소에 대한 이해

- 리눅스 소스 설치 -> 커널 컴파일 -> 부트로더 설정

- 리눅스 커널 수정은 커널에 대한 이해 필요 -> 컴파일은 매우 복잡

* 수정 후 컴파일 보단 설정 변경으로 절차 최소화 하는것이 편리

 

(1) 리눅스 커널 구조

1) 커널 개요

2) 커널 구조

3) 마이크로 커널

4) 모노리식 커널

5) 리눅스 커널 소스

6) 리눅스 커널 내부구조

 

1) 커널 개요

운영체제

- 하드웨어 자원 관리, 응용 프로그램 실행시키는 통합적 환경 제공

- 구성요소 : 커널, 디바이스 드라이버, 명령어 쉘, 사용자 인터페이스, 파일시스템, 시스템유틸리티

- 응용프로그램 인터페이스 -> 시스템 콜

- 하드웨어 인터페이스 -> 디바이스 드라이버

 

커널 kernel

- 운영체제의 가장 핵심적인부분

- 하드웨어 자원관리

- 시스템 원할히 동작하도록 제어

- 사용자가 입력한 명령어 수행

 

커널 구성요소

- 스케줄러 : 프로세서 실행 제어

- 인터럽트 핸들러

- 메모리 메니저

- 시스템 서비스 모듈 : 네트워크, 프로세스간 통신

 

2) 커널 구조

- 사용자 레벨- 응용프로그램

- 커널 레벨 - 시스템콜 인터페이스 / 커널 코어/ 디바이스 드라이버

- HW 레벨-하드웨어

 

자원 관리자로서의 커널

- 하드웨어 요소들과 주변장치 등 물리적 자원 관리

- 물리적 자원을 추상화 시켜 추상적인 자원으로 관리

- 자원의 추상화 : 물리적 자원에 적용되는 연산들을 단순화 시켜 물리적 장치를 다루는 세부적인 사항을 다룸

- 물리적 자원 기반 추상화 : 태스크 스레드, 세그먼트와 페이지, 파일, 디스크 드라이버, 터미널 드라이버

- 물리적 자원과 무관한 추상화 : 세마포어, 메시지

 

커널 동작 레벨

1. 사용자 레벨 : 응용프로그램 레벨. 사용자 프로그램과 응용프로그램이 위치하는 사용자공간사용.

                  일반적인 명령어 +프로그램 실행파일(프로세스

2. 커널 레벨 - 하드웨어 자원 관리. 사용자 레벨 프로세스의 요청 받아 서비스 제공

                - 커널은 하드웨어 인터페이스와 인터럽트 등을 통해 하드웨어와 통신

                - 사용자 프로세스와는 시스템 콜로 통신

3. 하드웨어 레벨 - CPU, 메모리, 하드디스크 같은 물리적인 자원들로 구성

 

커널의 종류

1. 모노리식 커널

2. 마이크로 커널

 

3) 마이크로 커널

마이크로 커널

- 커널의 기능을 최소화 하여 가장 핵심적인 부분만 커널에 포함시킨 구조

- 이외 기능들은 서브 모듈(서비스 서버)로 나누어 각각 프로세스로 구현되어 동작

- 상호간의 메시지 전송 기능을 통해 서비스의 요청과 응답을 수행

마이크로 커널 구조

마이크로 커널의 장단점

- 장점 : 기능 확장과 수정 용이, 다른 시스템으로 이식 쉬움

- 단점 : 프로세스간 통신에 있어 메시지 전달에 따른 오버헤드발생, 문맥 교환으로 인한 자원 이용 효율성 저하

 

대표적인 마이크로 커널

- Mach : 1980년 카네기 멜론대에서 개발

- EROS, Spring OS, VSTa, Symbian OS 등 ..

 

4) 모노리식 커널

- 시스템 관리에 필요한 모든 커널기능들이 통합되어 동작

모노리식 커널 구조

모노리식 커널 장단점

- 장점 : 마이크로 커널에 비해 구현쉽고 빠름. 효율적자원관리

- 단점 : 커널이 커짐, 커널 변경시 커널 전체를 재컴파일 해야함. 다양한 시스템에 포팅이 힘듬

 

대표적인 모노리식 커널

- 리눅스 커널

- UNIX 계열

- 윈도우

 

5) 리눅스 커널 소스

커널 소스 구조

- 압축된 리눅스 커널 소스 다운로드 및 설치시 아래와 같은 디렉토리 구조

- arch : 플랫폼 아키텍처 관련 코드

리눅스 커널 소스구조

arch 디렉토리

- 모든 아키텍처 및 CPU에 종속적인 커널 코드 포함

- 각 아키텍처별 부트 관련 코드 존재

- 지원하는 아키텍처별 하위 디렉토리가 구성 ex)i386, alpha, arm

 

include 디렉토리

- 커널 코드를 생성에 필요한 모든 헤더파일들

- 지원하는 아키텍처별로 서브디렉토리 존재 ex) 인텔 i386 계열 : include/asm-i386

 

init 디렉토리

- 커널 초기화 코드, 메인함수

 

ipc 디렉토리

- 프로세스간 통신 코드 기능을 위한 코드

- 파이프, 시그널, 소켓, 메시지 패싱 등

 

mm 디렉토리

- 모든 메모리 관리 코드

- 아키텍처에 종속적인 메모리 관리 코드 : arm/해당아키텍처/mm  ex) arch/i386/mm

 

drivers 디렉토리

- 블록 디바이스 드라이버, 문자 디바이스드라이버, 네트워크 디바이스 드라이버. 디바이스 드라이버들이 세분화

 

fs 디렉토리

- 파일 시스템 코드가 파일 시스템 별로 디렉토리 세분화 되어 존재

 

kernel 디렉토리

- 메인 커널 코드 : 프로세스, 인터럽트, 타이머, 시그널, 프로그램의 실행 등

-  arch/아키텍처이름/kernel 디렉토리에 저장 ex) arch/i386/kernel

 

net 디렉토리

- 커널의 네트워크 관련 디렉토리

 

lib 디렉토리

- 커널에서 사용하는 라이브러리 코드 ex)arch/i386/lib

 

scripts 디렉토리

- 커널 설정에 필요한 스크립트들이 존재

 

6) 리눅스 커널 내부구조

리눅스 커널 내부구조

- 크게 사용자/커널/디바이스 공간으로 나뉨

- 시스템 콜 : 사용자와 커널 사이 인터페이스

- 디바이스 인터페이스 (디바이스 드라이버) : 커널과 디바이스 사이 인터페이스

리눅스 커널 내부 구조

 

 

프로세스 매니저

- 프로세스의 생성 및 소멸

- 프로세스간 통실

- CPU 스케쥴링

- 시그널 처리

- 프로세스간 동기화

- 다중 프로세서의 효율적인 관리 기능

 

메모리 매니저

- 프로세스에 메모리 할당

- 페이징 기법을 이용한 가상 메모리 관리

- 가상 주소를 실제적인 물리 메모리 주소로 변환

- 페이지 폴트와 같은 예외 상황 처리

 

파일 매니저

- 파일의 생성과 파일 디렉토리 관리

- 파일에 대한 사용자들의 접근 제어

- 가상 파일 시스템을 사용한 다양한 파일시스템 지원

- 디스크 물리구조에 따른 논리적 기법 표현

- 블록디바이스의 입출력을 위한 버퍼캐시관리

 

네트워크 매니저

-통신 자원 관리

- 소켓인터페이스, 통신프로토콜 등 서비스 제공

<- 통신 프로토콜 구현, 네트워크 라우팅 및 주소지정, 네트워크 제어기 관리, 네트워크 드라이버와 접속작업

 

디바이스 매니저

- 시스템에 연결된 여러 주변장치들의 디바이스 드라이버들을 구성하여 관리

- 입출력 요청의 검증

- 입출력 작업 스캐줄링

- 주변장치간의 자료 전송

- 제어기 관리

- 인터럽트 요청 및 처리

 

 

(2) 리눅스 커널 컴파일

1) 커널 다운로드

- 커널 컴파일 과정은 2.4 버전 사용

- www.kernel.org /usr/src 디렉토리에 다운

 

2) 압축 풀기

-  tar xvfz linux-2.4.32.tar.gz

 

3) 설정 초기화

- make mrproper : 기존 설정 있는 커널 설정을 초기화 -> 기존 .config 파일 삭제

 

4) 커널 옵션 설정

- make menuconfig : 커널 옵션 설정하는 부분 -> 커널 설정 정보가 .config에 저장

- make oldconfig : 기존 설정값들로 재설정

- make config : 콘솔 환경에서 설정

- make xconfig : x윈도우 환경에서 설정

 

5) 파일 종속성 검사

- make dep : 커널 설정을 바탕으로 각 파일들의 종속성을 검사

 

6) 오브젝트 파일 제거

- make clean : 기존 컴파일시 생성되었던 object 파일 제거

 

7) 커널 이미지 만들기

- make bzImage : 커널 이미지를 만들기 위한 컴파일 과정

- 커널 이미지 : arch/i386/boot 디렉토리에 생성

- vmIinux : 압축되지 않은 커널 이미지

- zImage : 압축 커널, 1MB 이하

- bzImage : 압축 커널 = vmInux + 초기화 코드 (bootsect.S, setup) + bzImage

 

8) 이미지 복사

- cp arch/i386/boot/bzImage /boot/bzImage-2.4.32

 

9) 모듈 컴파일

- make module : 모듈 컴파일

- 옵션으로 설정한 모듈들을 컴파일

- 처음 컴파일 하는 경우에만 쓰면됨

 

10) 모듈 복사 및 확인

- make modules_install : 컴파일 모듈들을 적절한 디렉토리에 복사

- ls /lib/modules/2.4.32

 

11)  환경 설정 파일 수정

- vi /etc/grub.config 하여 수정(부트로더가 LILO or GRUB)

- default : 부팅 순서. 0이번 1번째, 1이면 두번째 커널 선택해 부팅

- timeout : 대기 시간

- splashimage : GRUB 사용시 표시되는 배경화면

- title : 리눅스 커널의 이름

- root : 루트 파티션 위치

   ex) root(hd0,4) /boot 가 hda5에 위치

- kernel : 부팅시 로딩할 커널파일 위치와 이름 설정

- reboot : 시스템 재시작

 

300x250
728x90

ARM 프로세서, 리눅스 기반 임베디드 시스템에서 사용되는 부트로더

 -> 동일 시스템 개발 시 참고 가능

 -> 처음부터 개발은 힘드므로 이미 개발된 부트로더나 오픈소스 부트로더를 수정

 

(1) 부트로더 구현 사례

1) SM_BOOT

2) SM_BOOT 명령어

3) SM_BOOT 동작 흐름도

 

1) SM_BOOT

SM_BOOT의 의미와 실행화면

- ARM 기반 플랫폼 전용 임베디드 시스템 부트로더

 

SM_BOOT 메모리맵

- 플래시 메모리에 부트로더, 커널이미지, 환경변수 등 존재

- 환경변수 : 시스템 환경변수 설정

- 사용자 : 플래시 메모리 전용 파일시스템 만들어 하드디스크 처럼 사용

 * 램은 전원중단시 사라지므로 보존 필요한 데이터는 따로저장해야함

2) SM_BOOT 명령어

SM_BOOT 명령어

- 임베디드 부트로더의 한사례로 부트로더 구현방법/제공 명령어 검토

-> 새로운 부트로더 설계에 큰 도움

- 부트로더 기능 수행 : boot(램에 로딩된 커널 부팅, 수동 운영체제부팅), reset(부트로더 재실행)

- 시스템 개발 : bootp(bootp 프로토콜로 ip 어드레스 할당-데이터 송수신 필요시 해야함), setpi(ip어드레스 수동 설정),

          macwrite(이더넷 인터페이스 카드의 맥어드레스 설정), tftp(tftp 데이터전송), download(시리얼 전송),

          flash(플래시 메모리에 데이터 저장), 

- 간단한 디버그 : read(특정 메모리주소 값 읽기), write(특정 주소에 값 쓰기), status(메모리,레지스터,이더넷 상태표시)

 

부트로더 공간 크기

- bootroader는 0x00000000에서 시작하며 길이는 0x0000C0000

- 길이가 2^16이므로

- 부트로더에 설정된 공간 크기는 2^6 * 2^10 = 64 * 1024 -> 64KB

SM_BOOT status 명령 예시

 

3) SM_BOOT 실행 흐름도

SM_BOOT 실행 흐름도

1. Power On

2. Start.S

 - 벡터 테이블 설정

 - 레지스터 설정(클럭, 메모리, GPIO 등)

 - 부트로더를 RAM으로 복사

 - 스택 포인터 설정

 - 램 상의 부트로더로 제어권 이동

3. main.c

 - 시리얼 초기화

 - 이더넷 초기화

 - 램으로 이미지 복사(커널, 램디스크)

 - 부트모드 결정

 - 명령어 입력/리눅스 커널 부팅

 

 

(2) 부트로더 동작 흐름

1) ARM 기반 부트로더 동작 흐름

2) 링커 스크립터

 

1) ARM 기반 부트로더 동작 흐름

ARM 기반 부트로더 동작 흐름

1. 인터럽트 벡터 테이블 설정 

  - 시스템 전원 인가시 마이크로 프로세서는 무조건 0x0000 0000 번지의 데이터를 읽음

 - 하드웨어적으로 이벤트 발생시 특정 번지로 이동해 그 위치의 명령어를 읽음

 - 예외 : 하드웨어/소프트웨어적으로 발생하는 이벤트

 - 예외처리기 : 예외상황이 발생시 실행하는 작업

 - 인터럽트 벡터 테이블 : 예외처리기 위치 정보를 가진 테이블

 - 이테이블은 메모리 가장 낮은 위치에 저장되어 부트로더 소스중 가장 먼저 실행되는 코드

2. 인터럽트 마스킹

 - 부트로더 실행중 인터럽트 발생 방지

 - 마스킹 발생 방지 방법 : 마이크로 프로세서에 따라 다름

 - ICMR 값을 클리어하면 인터럽트 발생이 방지됨

3. sleep mode 방지

 - 소비전력 절약을 위한 sleep 모드 지원

 - 부팅 과정 중 시스템이 슬립모드 진입을 막는 코드가 있음

4. cpu 클럭 설정

 - 동작 속도 설정을 위해 cpu 클럭 설정 레지스터에 원하는 cpu 클럭 속도 지정

5. gpio 설정

 - 표준 입출력 포트를 사용하기 위한 기본적인 설정

 - 표준 입출력 포트가 입력용인지 출력용인지, 라이징엣지에서 인식할지 폴링엣지에서 할것인지 정해야함

6. SDRAM 설정

 - 메인메모리로 SDRAM을 많이 사용, 프로세서에 메모리 컨트롤러 내장

 - ARM 프로세서에 SDRAM을 사용시 메모리 동작모드 및 액세스속도 등 관련도니 설정 레지스터, 어드레스 설정값

 - 부트로더에서 설정 레지스터에 적절한 설정값을 지정해야됨

7. 스택 포인터 설정

 - c 함수를 사용하기 위한 스택 포인터 설정

-------------------start.S 파일의 어셈블리 코드 실행과정

8. beforeMain 함수 호철

9. beforeMain 함수 실행

 - 어셈블리 코드가 아닌 c프로그램으로 main.c에 포함

 - cmain 부트로더 메인함수 호출전 실행

 - 플래시 메모리에 저장된 부트로더 코드를 메인 메모리에 복사한후 cmain 함수 호출

10. cmain 함수

 - 시리얼포트 전송/다운로드 속도 설정

 - 시리얼 포트/타이머/lcd/ether 초기화

 - 사용자 key 입력 대기 : 입력시 부트로더 명령어 모드 진입/ 없을시 커널 부팅

11. 부트로더 명령어 모드

 - display prompt 함수 호출 - 명령어 프롬프트 출력

12. 자동 부팅

 - 플래시 메모리에 저장된 커널.램디스크 이미지를 메인메모리에 복사 -> DoBootKernel 함수 호출

 

 

2) 링커 스크립터

링커 스크립터

- 링커명령어로 쓰여진 스크립터

- 목적파일의 섹션들을 실행파일들에 매핑시키는 방법기술

- 실행 파일의 메모리 레이아웃 제어

- 링커 명령어를 사양한 다양한 동작 구현가능

 

링커 스크립터 종류

- 기본 링커 스크립터 : 링커 실행파일 내부에 정의된 기본 스크립터. 사용자가 별도 스크립터 지정하지않을시 적용.

- 사용자 정의 스크립터 : 사용자가 정의함. -T옵션으로 적용 가능

 

부트로더 실장위치

- 부트로더가 램의 특정 위치에 로딩되도록 링커 스크립터에 정의

- 시스템 설계 단계에서 결정한 매모리맵에 원하는 프로그램을 로딩할때 사용

 

300x250
728x90

부트로더 bootloader

- 전원 공급시 가장 먼저 실행

-> 시스템 하드웨어 초기화 + 메모리에 운영체제로딩

- 하드웨어 추가로 운영체제 실행 전 초기화 작업이 필요한 경우 -> 부트로더 실행

- 부트로더 수정/코드 추가 -> 하드웨어 및 운영체제에 대한 이해가 필요

-> 부트로더에 명령어 추가시 부트로더를 다양하게 사용가능

- 초기화 코드가 어셈블리로 작성되는 경우 어셈블리 코드에 대한 이해도 필요

 

(1) 부트로더 개요

1) 부트로더

2) 부트로더 기능

3) 부트로더 소스파일 구성

4) 부트로더 생성 절차

 

1) 부트로더

부트로더(Boot Loader) 역활 및 유형

- 시스템 부팅 후 처음으로 실행되는 프로그램

- 시스템 초기화/ 운영체제 로딩

 

데스크탑 리눅스용 부트로더

-  하드디스크의 마스터부트레코드에서 동작

- 멀티부팅 : 운영체제의 선택적 부팅 기능 제공

- LILO(Linux Loader), GRUB(Grand Unified Boot loader)

 

임베디드 시스템용 부트로더

- 각 임베디드 시스템에 특화된 전용부트로더

- 플래시 메모리에 저장, 메인 메모리에서 실행

- 단일 운영체제 부팅

- 시스템 개발 관련 명령어 지원 : 호스트 컴퓨터와 타겟 보드의 데이터 전송명령어, 플래시 메모리 쓰기, 메모리 dump

- ARMBoot, BLOB(Boot Loader OBject), U-BOOT

 

2) 부트로더 기능

부트로더 주요작업

- 하드웨어 초기화 : CPU클럭설정, 메모리 파라미터설정, 시리얼 포트 설정, TCP/IP 설정

- 프로그램 복사 : 플래시메모리에 저장된 부트로더 자신, 커널이미지, 램디스크 이미지를 메모리에 옮김

-부트로더 명령어 제공 : 명령어 제공. 호스트 컴퓨터와 데이터교환, 플래시 메모리 퓨징, 간단한 디버깅 기능

- 운영체제 부팅 : 저장된 운영체제로 부팅하여 프로그램 제어권을 운영체제로 넘김 -> 응용프로그램 실행준비

               + 임베디드 시스템 개발에 필요한 작업, 환경설정 변수들을 추가/변경 -> 부트로더 기능 확장

 

3) 부트로더 소스파일 구성

소스파일

- 1개의 어셈블리 소스파일과 여러개의 C소스파일

- makefile : make에서 사용하는 컴파일 스크립트파일

- start.S : 부트로더 초기 코드로 어셈블리 코드, CPU, 메모리, gpio 초기화, 플래시 메모리를 DRAM 영역으로 복사

- main.c 부트로더 메인 소스코드

- commands.c : 명령어처리고드 포함

- lib.c 부트로더에서 사용하는 라이브러리 포함

- 타겟 보드에 실장된 디바이스에 대한처리프로그램 : flash.c, serial.c, time.c, net.c, bootp.c, tftp.c

 

헤더 파일

- 각 소스파일에서 사용하는 변수나 매크로들을 정의한 파일

- ld-xsacle : 링커 스크립트 파일(컴파일된 프로그램의 링크 방법)

- config.h : 부트로더 환경설정파일

 

부트로더 환경설정 파일

- config.h 매크로 형태로 정의된 변수

- 시리얼 포트 전성속도

- 자동부팅 지연시간

- 메모리 맵 : 부트로더, 커널, 램디스크 등 소프트웨어 컴포넌트를 플래시 메모리나 DRAM 어디에 저장할지 설정

  -> 매크로 선언 값을 수정하여 메모리 저장위치를 변경할수있음.

- 프로세서가 메모리 컨트롤러 내장한 경우

  -> 메모리 액세스 타이밍정보, 파라미터들이 메모리 제어 레지스터에 정확하게 설정되어야 함

 

4) 부트로더 생성절차

소스 컴파일

1. 부트로더 소스파일 sm_boot.tar.gz 준비

2. 압축파일 해제 tar zxvf sm_boot.tar.gz

3. 소스파일 수정 vi main.c

4. 부트로더 컴파일 make

 -> 부트로더는 타겟 임베디드 시스템에서 실행되므로 크로스 컴파일러로 부트로더 소스를 컴파일

 

부트로더 퓨징 fusing

- 부트로더 소스 수정, 컴파일해서 실행파일 만듬

- 실행파일을 타겟보드에 다운로드하여 플래시 메모리에 넣어야 함

 -> 이 작업을 플래시 프로그래밍 or 퓨징 이라 함

- 부트로더는 초기화 프로그램이므로, 보드 상태에 따라 퓨징 작업이 달라짐

 

퓨징하는 방법

1. 호스트 컴퓨터에서 전용 프로그램으로 직접 퓨징

 - 플래시 메모리에 아무런 소프트웨어도 설치안된경우

 - 타겟보드에 호스트 컴퓨터와 통신할수있는 프로그램이 없으므로, 하드웨어 적으로 플래시 메모리에 부트로더를 씀

 - 타겟보드의 JTAG 인터페이스 사용

  타겟 보드의 JTAG 인터페이스와 호스트 컴퓨터 병렬 연결 -> 전용 프로그램으로 플래시 메모리에 부트로더 실행파일을 넣음

 

2. 기존에 설치된 부트로더 사용하는 방법

 - 기존 부트로더를 새 부트로더로 교체하는 방식

 - 기존 부트로더에 호스트와 통신가능한 통신명령어와 플래시 메모리 쓰기 명령어를 포함함

 - 통신 명령어로 호스트 컴퓨터로 새 부트로더를 다운로드받고 플래시 메모리 쓰기 명령어로 대체함

 - 고속 데이터 전송을 위해 이더넷 인터페이스와 플래시 메모리의 특정 주소에 데이터를 쓰는 플래시 쓰기 명령지원

  -> 이더넷 인터페이스를 통한 부트로더 퓨징

   1. 호스트 컴퓨터에서 FTP 서버를 설치하고, FTP로 전송할 파일을 루트 디렉토리에 옮김

   2. 타겟보드 부트로더에는 FTP전송을 위해 필요한 IP를 설정한 후, FTP 명령어로 새부트로더 다운

   3. 다운로드 후 플래시 쓰기 명령어로 다운 받은 부트로더를 플래시 메모리에 써넣음

   4. 타겟 보드를 재시작하면 새 부트로더가 시작

 

(2) 부트 초기화 과정

1) 부트 초기화란

2) 부트 초기화 순서

 

1) 부트초기화란

부트 초기화

- 메모리에 커널 로등 후 하드웨어가 초기화 되어 시스템을 사용가능한 상태로 만드는 과정

- 프로세서 초기화, 메모리 점검 및 초기화, 각종 하드웨어 점검 및초기화

- 커널로딩, 커널 자료 구조 등록 및 초기화, 시스템 사용환경구성 설정

 

2) 부트 초기화 순서

- power on : 시스템 전원 인가

- rom-bios 실행 : 바이오스가 실행

- post 과정 실행 : power on self test. 진원 인가 동시에 디바이스들의 오류 여부 확인

- mbr의 부트로더 읽기 : 보조기억장치 부팅파티션에 있는 MBR을 읽어 부트로더 실행

- 부트로더 실행

   부팅 메뉴 선택(/boot/grub/grub.conf 환경설정)

   압축 kernel 이미지 로드 (/boot/bmlinuz-버전)

   시스템 제어권을 커널(kernel)에게 넘겨줌

   스와퍼(swapper)프로세서 호출

- swapper 프로세스 실행 : 커널 이미지 압축 해제. 각 장치 드라이브 초기화

            루트 파일 시스템을 ro 모드로 마운트 후 파일 시스템 검사, 루트파일시스템을 rw 모드로 마운트하여 init 호출

- init 프로세스 실행 : /etf/initab 파일 참조 -> /etc/rc.d/rc.sysinit 스크립트 실행 -> /etc/rc.d/rc.local 실행

                          -> 가상 콘솔 프로토콜 (mingetty)실행 -> login 프롬프트 출력

 

 

 

300x250
728x90

임베디드 시스템 개발 과정

- 하드웨어 플랫폼 준비 : 마이크로 프로세서와 주변 부품으로 회로 설계 -> PCB 설계 구현

- 프로그램 개발 : 시스템 동작에 필요한 프로그램 구현 - 개발도구 준비, 개발환경 셋업

 

(1) 임베디드 시스템 개발환경 개요

1) 개발 환경

2) 타겟 보드와 호스트 컴퓨터 연결

3) 호스트 컴퓨터 개발환경

 

1) 개발 환경

타겟 보드

- 임베디드 시스템 개발 과정에서 개발 대상이 되는 하드웨어 보드

- 하드웨어 구성품 : 마이크로프로세서,플레시 메모리, DRAM, 입출력장치

- 소프트웨어 구성 : 부트로더, 커널, 응용프로그램

 

호스트 컴퓨터

- 타겟 보드에서 실행할 프로그램을 개발하는 컴퓨터

- 타겟보드를 디버깅할때 쓰는 컴퓨터

 

호스트 컴퓨터 개발도구

- 터미널 애뮬레이터 : 타겟 보드의 모니터와 키보드 대신

- 플래시 메모리 퓨징 프로그램 : 타겟 보드에 실장된 비휘발성 메모리 플래시 메모리에 프로그램 씀

- 크로스 컴파일러 : 타겟 보드에 실행될 프로그램을 컴파일 해줌

- 디버거 : 디버깅 도움

 

호스트 컴퓨터 운영체제

- 리눅스

- 윈도우

- 보통 타겟보드와 동일한 운영체제 사용

 

2) 타겟 보드와 호스트 컴퓨터 연결

타겟 보드와 호스트 컴퓨터 연결하는 형태

- 개발 소프트웨어에 따라 달라짐

- 타겟보드에 모니터,키보드 같은 입출력장치가 없음 -> 호스트 컴퓨터의 모니터 키보드 사용

- 시리얼 연결 :  호스트 컴퓨터의 터미널 에뮬레이터와 콘솔 연결

- JTAG 연결 : 호스트 컴퓨터의 병렬 포트와 타겟 보드의 JTAG 연결. 플래시 메모리 퓨징, 타겟보드 디버깅

    * JTAG 인터페이스 : 5개의 신호선 사용.

- 이더넷 연결 : 대용량 파일 고속전송, 파일 시스템 공유

- 타겟보드는 성능 부족하여 호스트 컴퓨터의 자원을 사용함.

 

이더넷 연결 방법

- 크로스 케이블 : 타겟 보드와 호스트 컴퓨터를 직접 연결

- 허브 : 타겟보드와 이더넷 허브를 통해 호스트컴퓨터를 연결

 

3) 호스트 컴퓨터 개발환경 구축

- 타겟 보드의 소프트웨어 개발환경을 호스트 컴퓨터에 구축해야함

- 개발도구 : 터미널 에뮬레이터, 크로스 컴파일러 및 디버거, BOOTP서버, TFTP 서버, NFS 서버

   -> 타겟 시스템 유형이나 개발 하고자하는 프로그램에 따라 선택적으로 사용

- 타겟 보드 소프트 웨어 : 운영체제 커널 및 루트파일 시스템, 디바이스 드라이버, GUI 라이브러리, 웹서버 등

 

 

(2) 호스트 컴퓨터 설정

1) 터미널 에뮬레이터

2) BOOTP 서버

3) TFTP 서버

4) NFS 서버

 

1) 터미널 에뮬레이터

터미널 애뮬레이터

- 시리얼 통신을 사용하는 단말기 기능을 구현한 프로그램

- 임베디드 시스템 개발환경에서 타겟보드의 콘솔 사용

- 타겟보드의 콘솔로 사용.

 타겟 보드의 콘솔 포트에 연결 -> 호스트 컴퓨터의 모니터와 키보드를 타겟보드에서 사용 가능

- 파일 업로드/다운로드 가능

 

대표적인 터미널 애뮬레이터

- 리눅스용 : 미니컴

- 윈도우용 : 하이퍼터미널

- 터미널 애뮬레이터 사용을 위해 타겟보드에서 시리얼 인터페이스 프로그램 실행되어야 함.

 

타겟 보드의 시리얼 인터페이스 프로그램

- 운영체제 실장 된 경우 : 콘솔포트 디바이스 드라이버

- 부트로더 실행 단계 : 부트로더 내 별도 시리얼 통신프로그램이 포함되야함

 

미니컴 사용절차

1. 시리얼 통신 케이블 연결

 - 타겟 보드의 콘솔포트와 호스트 컴퓨터의 시리얼 포트를 연결

2. 미니컴 실행환경 설정을 위해 minicom -s 실행

3. 설정 메뉴에서 시리얼 포트 설정 클릭

4. 시리얼 통신 설정

 - 시리얼 장치, 전송속도(115200 8N1 - 115200bps 데이터크기 8, 페리티비트 x, 스탑비트 사용), 흐름 등 설정

5. 저장 후 설정 종료.

6. 타겟보드 리셋스위치 누름

7. 타겟보드의 리눅스 부팅

8. 부팅 메시지가 minicom으로 뜸

 

2) BOOTP 서버

BOOTP 서버

- 타겟보드에서 TCP/IP(이더넷) 사용을 위해 IP어드레스 설정 필요

 

IP어드레스 설정방법

.1 타겟보드에서 직접 설정

2. BOOTP를 사용하여 호스트 컴퓨터의 도움을받아 설정

 - 일반 PC에서 인터넷 연결시 DHCP 사용하는것과 유사

 - 타겟보드의 IP어드레스를 호스트 컴퓨터를 사용해서 설정

 -> 호스트 컴퓨터에는 BOOTP 서버가 실행되야함

 

bootp(부트 프로토콜, boot protocol)

- TCP/IP에서 diskless 클라이언트의 자동부팅을 위한 프로토콜

- UDP와 IP 프로토콜에서 실행

-> BOOTP 서버는 xinetd, bootpd 데몬 프로그램 실행

- 타겟 보드에서 사용할 ip주소를 네트워크를 통해 할당받기위해 사용

 

호스트 컴퓨터에 bootp 서버 설치

1. bootp-server 패키지 설치

2. 체크 컨피그 명령어로 정상 설치여부 확인

3. bootp-server의 설정 파일을 복사

4. bootp 파일 확인

5. bootp 파일 수정 - /etc/bootptab 파일에 타겟보드에 할당할 ip 어드레스 설정

6. bootp가 연결된 xinetd 서비스 재시작

 

타겟 보드에서 bootp실행

- 타겟보드에서 인터넷 접속을 위한 ip어드레스 설정

- 자동 설정 : 부트로더에서 bootp 명령어 사용, 시스템 부팅 후 bootp 명령어 실행 

- 수동 설정 : 시스템 부팅후 ifconfig로 설정

 

3) TFTP

- Tribial File Transfer Protocol

- UDP를 사용한 단순 파일전송 프로토콜

- 부트로더에서 대용량 데이터를 고속으로 다운받기위해사용 - 커널이미지, 램디스크이미지, 응용프로그램등

- 시리얼 포트를 사용해 미니컴 프로그램의 파일전송 기능으로 다운로드 가능하나 느림

 

4) NFS

- Network File System

- 네트워크로 파일 공유

- 타겟보드에서 호스트 컴퓨터의 파일 시스템 공유

- 호스트 컴퓨터 작업 내용을 타겟 보드에 바로 마운트 가능

300x250
728x90

문제 1

문제 2

고유값과 고유벡터

- 고유 벡터 : 선형 변환시 방향이 바뀌지 않고 크기만 변하는 벡터

- 고유 값 : 고유 벡터가 변하는 크기

- 고유 값과 고유 벡터는 n차 정방행렬에 n개가 나옴

 

위 문제의 고유값과 고유벡터

 

고유값과 특성 방정식

- 특성방정식을 풀면 고유값을 구할 수 있다.

 

특성 방정식으로 선형 사상의 고유값 구하기

고유값으로 고유벡터 구하기

- 선형 사상을 적용 한 식에 고유 벡터를 대입

 

n차 정방행렬의 p 제곱 구하기

n차 정방행렬의 대각화

- p=1인 경우 고유값으로 이루어진 대각행렬

노름(Norm)

- 벡터의 크기/길이

내적 inner produdct

- 내적 = 스칼라곱 = 도트곱

 

정규 직교 기저

- orthonormal basis

- 각 벡터의 길이가 1이며두 벡터의 내적이 0인 경우

외적 outer product

- 벡터 곱, 크로스곱

300x250
728x90

임베디드 시스템 소프트웨어 개발

- 소스 편집 -> 컴파일 -> 실행의 반복

- 임베디드 시스템의 성능이나 리소스가 충분하지 않음

-> 개발 기간 단축을 위해 호스크 컴퓨터에서 컴파일 후 실행파일을 임베디드 시스템에 다운로드함

 

make 유틸리티 프로그램

- 반복되는 컴파일 명령어를 간단하게 실행할수 있는 도구

 

디버깅 프로그램 GDB

- 컴파일 과정 중 디버깅 작업을 도와줌

- 소프트웨어 개발 중 가장 많인 시간 필요

- 사양 받음 -> 시스템 모델링 -> 데이터 구조 정의 -> 알고리즘 설계 -> 프로그램 코딩

-> 이후 테스트 및 디버깅이 대부분 시간 차지

 

(1) 크로스 컴파일

1) 컴파일 절차

2) 컴파일 유형

3) 툴 체인

4) ARM용 크로스 컴파일 설치

 

1) 컴파일 절차

컴파일 과정

- 소스 프로그램으로부터 목적파일 만드는 과정

 

2) 컴파일 유형

프로그램 컴파일 방식

1. 네이티브 컴파일

 - 컴파일 프로세서와 실행 프로세서가 동일한 경우

2. 크로스 컴파일

 - 컴파일 프로세서와 실행 프로세서가 다른 경우

 

임베디드 시스템에서의 컴파일

- 임베디드 시스템에선 성능이 부족하여 범용 컴퓨터에서 컴파일 하여 타겟 보드에 다운로드함 -> 크로스 컴파일

 

3) 툴 체인

- 시스템 프로그램 및 응용프로그램 개발에 사용되는 개발도구 모음

- 구성품 : 문서 편집기, 컴파일러, 어셈블러, 링커, 유틸리티 프로그램, 라이브러리

 

대표적인 임베디드 시스템 툴체인

- vi 문서 편집기, gcc 컴파일리, as 어셈블러, ld 링커

- 유틸리티 - binutils 패키지(어셈블러, 링커, 목적코드 분석 프로그램), 표준 C 라이브러리 - glibc

 

ARM 용 툴 체인

- 바이너리 유틸리티 앞에는 arm 접미사가 붙음

- objdump는 목적 파일을 분석하는 명령어

 

4) ARM용 크로스 컴파일러 설치

 

설치방법

1. pre-compiled 툴 체인 설치 

 - 압축파일 해제

 - 저장된 디렉토리를 환경변수 PATH에 등록

 - 미리 컴파일된 툴체인 -> /usr/cross-tools로 설치 위치 고정

 - 실행 파일이 저장된 디렉토리를 쉘 프로파일에 저장해서 쓰는게 편리

  * vi ~/.bash_profile

  * export PATH=/usr/cross-tools/bin:$PATH

 

2. 크로스 컴파일러 소스를 직접 호스트 컴퓨터에 설치

 - GNU 크로스 컴파일러 소스를 다운받아 호스트 컴퓨터에서 컴파일 하여 툴체인 환경 구축

 - 호스트 컴퓨터에 C 컴파일러 사전 설치

 - 소스 설치

 

크로스 컴파일러 테스트

- 정상 설치 여부 확인함

- 네이티브 컴파일러와 크로스 컴파일러를 둘다 실행해서 잘 동작되는지 확인

- 테스트 프로그램 foo.c

#include <stdio.h>

int main(){
printf("Hello Embeded System World!\n");
return 0;
}

네이티브 컴파일

#gcc -o foo-x86 fool.c

크로스 컴파일

#arm-linux-gcc -o foo-arm foo.c

 

실행 파일 타입 확인

Host #file foo-x86

Host #file foo-arm

 

타겟 보드에 다운로드 후 타겟보드에서 실행

TB #./foo-arm

 

(2) Make와 GDB

1) make 유틸리티

2) GDB 디버거

 

1) make 유틸리티

make 유틸리티 개요

- 여러개 파일로 작성된 프로그램을 효율적으로 컴파일하는 유틸리티

- 프로그램 컴파일 과정 제어, 응용 프로그램 설치위치 관리, 메뉴얼 페이지 작성에 활용

=> 프로그램 개발 프로젝트에 유용하게 사용

 

makefile

- make 유틸리티의 컴파일 절차를 정의하는 파일

- make 유틸리티가 참조하는 파일, 소스 파일과 동일한 디렉토리에 저장

- 프로그래머는 소스파일과 함께 makefile 작성

 

makefile 문법

- 의존관계 : 하나의 타겟(실행파일), 타겟과 의존관계에 있는 소스파일들

- 규칙 : 의존 관계에 있는 소스파일들로부터 타겟을 생성하는 방법 정의

 

make 명령어

- 현재 디렉토리에 저장된 makefile이나 makefile을 순차적으로 찾아서 참조

make + 타겟 이름 => make myfoo -> 타겟 = myfoo

make (타겟 미지정시) => all이라는 타겟 정의하여 사용

 

의존 관계 dependency

- 타겟과 소스파일들과의 의존 관계 정의

- 의존관계 표현 방법 : "타겟 이름"+":"+" "+"필요한 파일 이름"

- 예시

foo: boo.o doo.o -> foo를 만들기위해 boo.o, doo.o가 필요

boo.o: boo.c boo.h -> boo.o를 만들기 위해 boo.c, boo.h가 필요

doo.o: doo.c doo.h -> doo.o를 만들기 위해 doo.o, doo.h 필요

 

가상 타겟

- 실제 타겟이 아니라 make에서 사용하는 타겟 ex-all, clean

- all : 타겟으로 여러 파일 만들경우 사용

 

규칙과 주석

- 규칙 : 의존 관계에 있는 파일들로부터 타겟을 만드는 방법

- makefile내 정의시 반드시 TAB 문자로 시작

foo.o:foo.c foo.h

      gcc -c foo.c

- 주석 : #라인으로 시작

 

매크로

- makefile에서 자주사용하는 용어 재정의

- 컴파일 명령이나 옵션등을 재정의해서 사용함

- 정의 : MACRONAME=value

- 사용 : $(MACRONAME), $MACRONAME

- command-line 매크로 : make CC=gcc or make "CC = GCC"

 

내부 정의 매크로

- 사용자가 정의하는 매크로로외 make 유틸리티에서 자체 정의해둔 매크로

- $? : 현재 타겟보다 최근에 변경된 의존파일 리스트

- $@ : 현재 타겟 이름

- $< : 현재 의존파일 이름들

- $* : 접미사를 제외한 현재 의존파일 이름들

- -(minus) : 명령어 앞에 "-" 붙이면 에러발생 무시

- @ : 명령어 실행하기전에 명령어 화면표시금지

 

예시

all:myapp

CC=gcc

INSTDIR=/usr/local/bin

CFLAGS=-g -Wall



myapp:main.o foo.o boo.o

      $(CC) -o myapp main.o foo.o boo.o



main.o:main.c myhead.h

      $(CC) $(CFLAGS) -c main.c



foo.o:foo.c foohead.h

      $(CC) $(CFLAGS) -c foo.c



boo.o:boo.c boohead.h

      $(CC) $(CFLAGS) -c boo.c



clean:

    rm main.o foo.o boo.o

 

2)GDB

GDB 개요

- 텍스트 기반 GNU 디버거

- 리눅스 시스템에서 사용하는 기본 디버거

- 프로그램 소스 컴파일 시 -g 옵션 추가 -> 디버깅에 필요한 정보 생성

- 실행 명령어 : gdb 목적파일이름

 

GDB 명령어

- run 프로그램 실행

- help 명령어 도움말

- backtrace 스택 트레이스, 이전호출함수 표시

- print 함수 파라미터, 지역변수, 전역 데이터 확인

- list 현재 실행위치 주변 코드 표시

- quit GDB 종료

- break n 브레이크 포인트 설정, n번쨰 라인에서 브레이크

- clear n 브레이크 포인트 해제

- display 브레이크 포인트 도착시, 보여줄 데이터 등록

- commands n : n번브레이크 도착시 실행하는 gdb 명령어 등록

- info display : 설정된 브레이크 포인트나 브레이크포인트 도착시 보여줄 등록된 데이터에 대한 정보 표시

- cont : 실행 계속

300x250

+ Recent posts