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

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

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

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

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

 

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
728x90

shell

- 리눅스 운영체제의 명령어 해석기

- 해당 프로그램 실행, 리눅스 커널에 작업 요청

 

쉘 프로그래밍

- 시스템 관리작업 실시나 특정 작업을 한꺼번에 순차적으로 처리

-> 시스템에 필요한 환경변수 사전 설정

-> 응용 프로그램 실행에 필요한 설정 작업

 

(1) 쉘 개요

1) 쉘 개요

2) 리눅스 쉘

3) 프로그램 표준 스트림

4) 리눅스 쉘의 특수 기능

 

1) 쉘 개요

쉘 이란

- 사용자의 명령어를 시스템 커널에 전달 -> 명령어 해석기

- 사용자와 리눅스 사이 인터페이스 제공 프로그램

- 사용자가 shell을 통해 입력한 명령어들을 운영체제가 실행

- 리눅스는 여러 shell을 동시 사용 가능

- 커널 : 운영체제의 핵심

- X window : 사용자 그래픽 인터페이스

- ohter program : 사용자 응용프로그램

- csh, bash : 사용자가 입력한 명령어를 해석하여 필요한 작업 실행 또는 운영체제에 요청

 

유닉스 쉘

- sh Bourn shell : AT&T 의 스테판 본이 개발

- csh  C shell : 버클리 대 빌 조이가 개발

- ksh  korn shell : 데이비드 콘이 개발

- bash bourn-again shell : GNU 프로젝트 쉘

 

쉘 설정파일

- sh, ksh : ~/.profile

- csh : ~/.cshrc

- bash : ~/.bash_profile

- 쉘 사용에 필요한 각종 환경변수, 실행파일 탐색장소, 동작과 외형 등 제어하는 스크립트가 저장

 

2) 리눅스 쉘

- 리눅스 기본 쉘 : bash 

- 리눅스 기본 쉘 지정 : /bin/sh -> link -> /bin/bash 가 실행

    - 기본 쉘을 bash에서 csh로 변경시 -> link -> /bin/csh로 설정

 

bash 쉘 설정파일

- 환경변수, 쉘 명령어,, 쉘스크립트 등 포함

1. /etc/profile : 모든 bash 쉘 사용자에게 적용. 로그인 쉘에 적용

2. ~/.bash_profile : 특정 사용자에게만 적용

 

로그인 쉘

- 사용자가 로그인시 실행되는 쉘 프로그램

 

3) 프로그램 표준 스트림

표준 입력 스트림 -> 프로그램 -> 표준 출력 스트림

                                        -> 표준 에러 스트림

- 표준 이름 스트림 stdin : 키보드

- 표준 출력 스트림 stdout : 모니터. 파일 디스크립터번호 1

- 표준 에러 스트림 stderr : 모니터. 파일 디스크립터번호 2

 

4) 리눅스 쉘의 특수기능

- redirection : 프로그램 입출력 스트림 방향을 파일로 변경

    > 문자 : 표준 출력 스트림을 파일로 변경, 덮어쓰기

    < 문자 : 표준 입력 스트림을 파일로 변경

   >> 문자 : 표준 출력 스트림을 파일로 변경, 파일 끝에 추가

   << 문자 : 표준 입력 스트림을 스트림 리터럴로 변경 - 키보드 입력을 스트림으로 생성

   <<< 문자 : 표준 입력 스트림을 문자열로 변경

 

pipe

- 프로그램 출력을 다른 프로그램 입력으로 사용

- 여러 개 프로그램을 파이프로 연결하여 작업 메모리 공간 절약

- 파이프로 연결된 2개 프로그램은 데이터 스트림이 가용상태면 동시에 실행 가능.  2개의 프로그램 사이 데이터 흐름 제어

- 파이프 연산자 | 로 사용

ex) $ program1 | program2 | program3

- 프로그램1의 출력을 프로그램2 입력으로 사용. 프로그램 2의 출력을 프로그램 3의 입력으로 사용

 

filter

- 파이프와 함께 사용됨. 표준 입력스트림을 처리하여 표준 출력스트림으로 출력

- sort : 정렬하여 출력

- uniq : 중복 라인 제거

- grep : 특정 문자열 패턴을 찾아 출력

- fmt : 포맷해서 출력

- tr : 대소문자, 파일형식 변환

- sed : 스트림 편집기 사용

- awk : 문자열 패턴 검색 및 조작에 사용

 

expansion

- 특수 문자를 사용하여 문자열 패턴 확장

- 글로빙 : 와일드 카드를 사용하여 문자열 패턴 확장

- * : 해당 위치에 있는 모든 크기 문자

- ? : 해당 문자에 있는 크기가 1인 모든 문자열

- [123] : 1또는 2또는 3 한문자를 포함하는 모든 문자열

- [^123] : 1,2,3을 포함하지 않은 모든 문자열

 

추가 확장

- Brace 확장 : a{1, 2, 3} -> a1,a2,a3 한 문자를 포함하는 3개의 문자열

- Tilt 확장 : 현재 사용자의 홈 디렉토리 이름. cd 시 홈으로 이동

- 파라미터 확장 : $AAA -> 쉘 환경변수 AAA 값으로 확장

- 산술 연산 확장 : $((2+2)) -> 4

- 명령어 확장 : $(명령어) or `명령어` : $echo $(ls a?b) -> afb

- single quote 확장 : '문자열' 문자열 유지. 문자열 내 확장 문자 있어도 무시

- double quote 확장 : "문자열" : 파라미터 확장, 산술연산 확장, 명령어 확장이 포함시 확장 적용. 나머지 확장은 무시

 

(2) 쉘 스크립트

1) 쉘 스크립트 개요

2) 쉘 스크립트 작성절차

3) 쉘 스크립트 디버깅

4) 쉘 스크립트 문법

 

1) 쉘 스크립트

 쉘 스크립트

- 쉘이 실행할수 있는 명령어와 문법으로 만든 프로그램 파일

- 용도 : 사용자 입력/파일로 부터 읽은 데이터를 처리해 출력하는 작업. 반복적 작업 실행 자동화. 배치처리

- 실행 방법 : 쉘 스크립트 파일 직접 실행 or 파일 작성해서 순차적 실행

 

2) 쉘 스크립트 작성절차

- 문서 편집기 사용하여 편집

- 스크립트 파일 확장자 -> sh

- 스크립트 첫라인 첫 번째 문자 #! (쉬뱅)*       // #!이 쉬뱅. 이는 스크립트 파일임을 알려줌

- 쉬뱅 다음에 스크립트를 실행할 해석 프로그램 지정

- 실행 성공을 표시하기 위해 마지막에 exit 0 추가

 

예시

#! /bash/sh

exit 0

 

실행 방법

1. 쉘 스크립트 직접 실행 sh 파일명

2. 실행 권한 설정 : 실행 권한 부여후 ./파일명

3. 스크립트 실행 경로 설정 : export PATH=$PATH:.  -> ./파일명

 

 

3) 쉘 스크립트 디버깅

- 비교적 용이하여 별도 디버깅 툴 없음

- 에러 발생시 쉘은 에러를 포함하는 스크립트 라인번호 출력

- echo를 사용하여 변수값 출력하면서 코드 테스트

- 복잡한 에러 추적은 쉘 옵션 사용

-n : 명령어 실행하지 않고 문법만 검사

-v : 명령어 실행전 출력

-x : 실행시 자세한 인자, 명령어, 변수 출력

-u : 정의하지 않은 변수 사용시 에러 출력

-e : 오류 발생시 실행 중지

ex) sh -xv hello.sh

 

4) 쉘 스크립트 문법

변수 : 대소문자 구분, 문자열료 표현, 값 정의는 "=" 사용

- 변수값 참조시 변수명앞에 $사용

- 변수값 출력시 echo. 사용자 입력값을 변수에 할당시 "read" 명령어 사용

 

환경 변수

- 쉘 실행환경과 관련된 사전에 정의된 쉘 변수

- 쉘 스크립트 시작시 초기화

- 환경 변수 확인 -> "env" 명령어 사용

- 쉘 변수를 환경변수로 전환 : export 변수명

 

환경변수 예시

- $HOME : 홈디렉토리

- $PATH :명령어 탐색경로

- $PS1 : 명령어 프롬프트

- $IFS : 필드 구분자 리스트

- $0 : 쉘스크립트 파일이름

- $# : 쉘스크립트에 전달되는 파라미터 수

- $$ : 쉘스크립트의 process id

- $* : IFS 환경 변수의 첫번째 구분자를 사용하여 모든 파라미터를 1개의 변수로 표현

- $@ : IFS를 사용하지 않는 "$*"

Test 명령어

- 쉘에서 사용하는 조건 명령어

- "test" 또는 '[' ']' 사용

- 테스트 조건 등 검사한 후 그 결과를 참 또는 거짓값을 반환

- 아래는 foo.c 라는 파일의 존재 여부를 검사

if test -f foo.c

  then

to do something

  fi

 

if [ -f foo.c ]

  then

to do something

  fi

 

test 명령어로 사용할수 있는 조건 유형

- 문자열 비교 : string1 = string2/ -n string 문자열이 널이 아니면 참/ -z string 문자열이 널이면 참

- 수식 비교 : exp1 -eq ex2 두 표현식이 동일하면 참/ exp1 -gt exp2 exp1이 exp2보다 크면 참

- 파일 존재여부 : -d file 파일이 디렉토리인지 검사/ -e file 파일이 있으면 참 / -f file 파일이 일반파일이면 참 /

               -g file에 그룹 id가 설정시 참 / -r file 파일을 읽을수 있으면 참 / -s file 파일 크기가 0이아니면 참

 

if 문

- 실행 조건을 테스트 해서 선택적 실행

- cond 에서는 test 명령어 사용

- if문 종료시 fi로 마침

if cond

then

  task1

else

  task2

fi

 

if 문을 사용한 예시 

- if와 then을 같은 라인에서 사용시 ;(세미콜론)을 사용해서 if의 test와 then을 분리해야함

#!/bin/sh

echo "hello world ! who u are?"

read name

if [name="momo"]; then

   echo "it's U"

else

   echo "Not U"

fi

exit 0

 

for 문

- 변수 값이 지정된 범위 내에서 변수값을 바꿔가면서 반복 실행

- 문법

for var in values

do

  task

done

- 예시

#!/bin/sh

for name in foo bar boo

do

  echo $name

done

exit 0

 

while 문

- 실행 조건을 테스트해서 결과가 거짓이 될때까지 반복 실행

- 문법

while cond do

  task

done

-사용 예

#!/bin/sh

echo "Enter name"

read myname

while ["$myname"!="momo"]; do

  echo "Sorry, not myname"

  read myname

done

exit 0

 

Until 문

- 조건을 테스트해서 결과가 거짓이 될때까지 반복.

- while과 반대

- 적어도 한번은 수행

- 문법

until cond

do

   task

done

- 사용예

#!/bin/sh

echo "start!"

icnt=10

until [$icnt -eq 12]

do

  echo $icnt

  icnt=`expr $icnt+1`

done

exit 0

 

case 문

- 변수 패턴을 검사하여, 패턴에 따라 다른작업 실행

- 문법

case variable in

pattern [|pattern] ...)

statements;;

pattern [|pattern] ...)

statement;;

esac  //case의 반대로

exit 0

- 사용예

#!/bin/sh

echo "Type your color"

read mycolor

case "$mycolor" in

  green|g* ) echo "GREEN";;

  red|r* ) echo "RED";;

  * ) echo "OTHERS";;

esac

exit 0

 

List 문

- 문장 또는 명령어들을 직렬로 연결하여 사용

- AND 리스트 : 연산자 &&, 앞 명령어 성공시 뒷 명령어 실행

- OR 리스트 : 연산자 ||. 앞명령어 실패시 다음명령어 실행

- 사용 예

#!/bin/sh

...

if [ -f myfile ] && echo "hello"

then

echo "AND list"

fi

...

if [ -f myfile ] || echo "hello"

then

echo "OR list"

fi

...

exit 0

 

쉘스크립트의 함수

- 문장 그룹에 이름을 붙여 함수로 정의해 사용가능

- 함수를 사용하여 스크립트 구조화 가능

- 함수 파라미터 전달 : 쉘 스크립트 파라미터 전달과 동일.

   첫번재 파라미터 $1, 파라미터 전체 문자 $@, 파라미터 수 $# 

- 함수 리턴 값: return 명령어 사용

- 함수 호출에서 리턴값을 $?으로 참조

- 포맷

fname (){

  task

}

 

function fname{

  task

}

- 사용예

#!/bin/bash

myadd(){

  sum=$(($1+$2))

  return $sum

}

op1=10

op2=20

myadd $op1 $op2

echo "sum:$?"

exit 0

300x250
728x90

프로세서 명령어 구조

- 프로그래머 모델중 가장 중요한 요소

- 프로세서를 이해하는 출발점

- 인라인 어셈블리 프로그래밍/ 어셈블리 수준 소스 디버깅

- 프로세서 명령어 문법과 사용법을 알아야함

 

ARM 명령어 세트

- RISC 간략하고 적은수 명령어

- 고유 특징 : 모든 명령어를 조건부 명령어 -> 분기 명령어 실행 속도 향상

- 16/32비트 명령어 함께 사용 -> 프로그램 코드 크기 절약

=> 임베디드 시스템의 메모리 자원 제약 극복

 

(1) ARM 명령어 1

1) 명령어 형식

2) 조건 필드

3) 명령어 요약

4) 데이터 전송 명령어

 

1) 명령어 형식

명령어 형식

- 명령어 길이 : 32비트로 동일

- 최상위 비트에 조건부 명령 실행을 결정하는 4비트 조건 필드 -> 조건을 만족해야 명령어 실행 가능

- opcode : 명령어 동작을 정의한 코드

- Rn, Rd, Rs : 명령어 실행에 필요한 오퍼랜드를 저장한 레지스터 정의 

ARM 명령어 형식

 

2) 조건 필드 condition field

- 명령어 실행 여부를 판단하는 조건 -> 만족시 실행

- 조건 필드는 CPSR의 조건 플래그들 참고

- 조건 필드값과 명령어에 상요되는 접미사 및 조건 플래그

- ADD R0, R1, R2 : 명령어의 실행 조건이 이전 결과가 음수라는 조건인 경우

 => ADDMI R0, R1, R2가 된다.

명령어 조건 필드

 

3) 명령어 요약

명령어 요약

- ARM 명령어는 아래의 4가지로 분류 가능. ARM7TDMI 명령어 세트 예시임. 상위 버전은 추가 명령어 사용 가능

- 데이터 전송 : 메모리와 레지스터, 메모리-상태 레지스터 사이 데이터전송  LDR, LDRB ...

- 데이터 처리 : ALU와 곱셈기를 사용해 처리 - ADD, ADDC, ...

- 프로그램 제어 : 프로그램 흐름제어 - BL, BX, SWI

- 부프로세서 : 부프로세서 제어 및 부프로세서와 데이터 전송을 위한 명령어 CDP, LDC, STC, ...

 

 

4) 데이터 전송 명령어 유형

- 메모리와 데이터 사이 데이터 전송 실행

1. 단일 데이터 전송 명령여(워드 및 바이트 단위)

2. 하프워드 및 signed 데이터 전송 명령어

3. 블록 데이터 전송 명령어(여러 데이터를 차례로 전송)

4. 상태 데이터 전송명령어(상테레지스터 메모리 저장 및 복구) 

5. 데이터 스왑 명령어(메모리 저장 데이터와 레지스터 교환)

 

단일 데이터 전송 명령어

- 4바이트 워드, 1바이트 데이터를 메모리-레지스터 사이 전송

- Rn : 베이스 레지스터

- Rd : 소스 or 목적 레지스터

- Offset : 인덱스 어드레싱을 워함

- 플래그들

  I :인덱싱 오프셋 값이 상수값인지 레지스터에 저장된 값인지

  P :인덱스 어드레싱 시점을 지정. 1이면 전송전 어드레스값 계산 0이면 전숭후 계산

  W : 1인 경우 베이스 레지스터에 저장

  U : 베이스 레지스터에서 오프셋을 뺄지 더할지 결정

  B : 1이면 바이트 단위 전송

  L : 데이터 전송방향. 1일시 메모리 -> 레지스터. 0인경우 레지스터 ->메모리로 전송

어드레싱 방법 : Index 어드레싱(유효 어드레스=베이스 레지스터 + 오프셋)

1. pre indexed : 명령어 실행에 필요한 어드레스를 실행전에 계산

2. pre indexed auto update : pre indexed와 동이랗나 베이스 어드레스값 갱신

3. post indexed : 명령어 실행후 유효 어드레스를 계산하여 베이스 어드레스 갱신

4. PC relative : 현재 프로그램에서 오프셋 만큼 떨어진 메모리 장소에 저장된 데이터 엑세스

 

오프셋값 유형

- unsigned 12비트

- 레지스터 Rm 값 지정

- 레지스터 Rm 만큼 shift 방법

 

명령어 예제

1. LDR R0, [R1, R2] : (R1+R2) 어드레스에 저장된 데이터를 R0에 저장

2. LDR R0, [R1, #4]! : R1+4 어드레스에 저장된 데이터를 R0로딩후에 R1=R1+4로 갱신

3. STR R0, [R1], R2 : R0 값을 (R1+R2) 어드레스에 저장 후 R1=R1+R2로 갱신

 

하프워드 및 signed 데이터 전송 명령어

- 하프워드를 메모리와 레지스터 사이에서 전송

- 명령어 형식 : 인덱스 어드레싱에 오프셋 지정 방법에 따라 나뉨

1. 레지스터를 사용하여 오프셋 지정

2. 명령어내 8비트 상수 지정

어드레싱 방법 : 단일 데이터 전송 명령어와 동일

 

블록 데이터 전송 명령어

- 레지스터와 메모리 사이의 데이터 블록 전송

- 여러 레지스터 값을 베이스 레지스터가 지정한 어드레스를 시작 어드레스로 하는 메모리 공간에 써넣음

- 메모리 저장된 값을 차례로 읽어 레지스터들에 로딩하는 작업 실행

명령어 형식 : 레지스터 리스트 필드에 비트맵 형식으로 지정

상태 레지스터 전송 명령어

- 상태 레지스터와 범용 레지스터 사이 데이터 전송

- 상태 레지스터의 조건 플래그를 상수 값이나 레지스터 값으로 변경시 사용

- MRS 명령어 : 상태 레지스터 값 -> 범용 레지스터 값으로

- MSR 명령어 : 범용 레지스터 값 -> 상용 레지스터값

 

데이터 스왑 명령어

- 레지스터와 메모리 사이 데이터 교환

- 실행 중인동안 메모리 일긱와 쓰기 동작인 Lock 상태 - 인터럽트 금지로 정상적인 동작 보장

- 소프트웨어 세마포어 구현에 적합

 

(2) ARM 명령어 2

1) 데이터 처리 명령어

2) 프로그램 제어 명령어

3) 부 프로세서 명령어

 

1) 데이터 처리 명령어

- 산술 연산 + 논리연산 + 곱셈 연산

- 하드웨어 32비트 곱셈과 MAC 연산과 64비트 곱셉 지원

 

산술/논리 연산 명령어

- 3 오퍼랜드 명령어

- opcode : 산술/논리연산 유형 선택

- s 플래그 : 상태 레지스터 조건 코드 갱신 여부 결정.

명령어 형식
opcode 필드

 

2) 프로그램 제어 명령어

- 분기 명령어 : B, BL (분기 및 링크 레지스터를 사용한 분기)/ BX(프로세서 state 변경을 통한 분기)

- 기타 프로그램 제어 명령어 : SWI(소프트웨어 인터럽트), Undefined

 

Thumb 명령어 세트

- 자주 사용하는 32비트 ARM 명령어를 16비트로 재정의 -> 프로그램 크기 절약으로 메모리 사용량 감소

- 프로그램 작성 보다 디버깅에 주로 사용됨.

Thumb 명령어 형식

300x250
728x90

실행할 프로그램 + 데이터 -> 메모리에 저장

- 프로그램 접근 방법 이해 -> 실행 과정 이해

- 메모리 사용 -> HW측면 : 제어방식 고려, SW 측면 : 접근방식고려

- 한번에 읽을수있는 데이터 최소길이와 최대 길이 -> 데이터 구조를 정하거나 구조체 변수 선언시 필요

 

ARM 프로세서의 예외처리 절차

- 운영체제 개발, 초기화 프로그램 개발, 새 입출력장치 추가시 필요

- 임베디드 시스템에 새 디바이스 추가시 디바이스 드라이버가 제공되며 예외 처리 절차에 대한 상세한 이해 필요

 

(1) 메모리 구성

1) 메모리 저장 방식

2) 메모리 접근 방식

3) 메모리 맵

 

1) 메모리 저장방식

메모리 저장 방식

- 바이트 단위로 접근하는 메모리에 멀티 워드 데이터 저장

- 빅엔디언 방식 : MSB 부터 하위 어드레스에 저장

- 리틀 엔디언 방식 존재 : LSB 부터 하위 어드레스에 저장

 

ARM 프로세서의 메모리 저장방식

- 빅엔디언, 리틀엔디언 모두 지원

- ARM 프로세서 엔디언 선택 -> 외부 설정 핀, 시스템 설정 레지스터 사용

- ARM 11 코어의 경우 -> 2개의 외부핀, 15부 프로세서 c1 레지스터의 U,A,E 비트값으로 설정

- 컴파일 시 엔디언 적용 : -EB 빅엔디언, -EL 리틀엔디언

 

2) 메모리 접근 방식

- Word, Half-word, byte 단위 접근 가능

- 정렬된 메모리 접근 -> 워드 단위 접근 : 4배수 어드레스, 하프 워드 단위 접근 : 2의 배수접근

- 정렬되지 않은 메모리 접근 -> 하프/하프워드 단위 접근 모두 연속된 어드레스 사용.

 

3) 메모리 맵

- CPU가 메모리 접근시 사용하는 어드레스 공간 할당 방법

- 메모리 유형, 어드레스 범위, 접근제어 방식에 따라 메모리 공간 분리 사용

- 어드레스 공간 할당 방법 -> 가변 메모리맵/ 고정메모리맵(대부분 ARM프로세서 사용)

 

가변 메모리맵

- 메모리맵을 사용자가 결정

- 메모리가 단일한 어드레스 공간으로 구성

- 메모리 맵이 변경되면 어드레스 디코더 및 제어회로필요

 

고정 메모리맵

- 메모리맵을 프로세서가 결정

- 메모리 유형과 어드레스 범위가 사전에 결정

- 외부 추가회로 없이 프로세서로부터 제어신호 출력

 

(2) 예외 처리

1) 예외

2) 예외처리 절차

3) ARM에서의 예외 처리

4) 시스템 리셋

 

1) 예외

-프로세서 내부/외부에서 발생하는 작업 요청 또는 이상

- 내부 : 소프트웨어 인터럽트, 트랩

- 외부 : 인터럽트 포함

- 예외 발생시 현재 작업 중단 하여 신속히 처리

 

예외 처리기(exception handler)

- 예외 발생시 처리해야할 작업들을 정의

- 발생 시 실행죽인 작업을 중단하고 예외처리기 실행후 원상태로 복귀

- 예외 유형에 따라 우선순위 부여하여 예외처리

 

예외 처리 응답시간지연 exception latency

- 예외 발생시점서 처리기 진입할때까지 소요시간

- 시스템 실시간성 보장에 영향

 

예외 벡터 exception vector

- 예외처리기가 저장된 메모리 어드레스

 

예외 벡터 테이블 exception vector table

- 예외 벡터들을 모아놓은 테이블

- 프로그램 메모리 시작 어드레스부터 일정 크기 공간을 확보하여 저장

- 예외처리기로 분기하는 명령어들이 저장

 

예외 우선순위 priority

- 여러 예외가 동시발생시 처리 순서 결정

 

 

2) 예외처리 절차

1. 프로그램 실행중 외부에서 인터럽트 요청을 받거나 트랩이 발생

2. 현재 실행 위치를 stack에 저장.

3. 프로그램 시작위치를 예외 벡터로 변경

4-5 예외벡터에 저장된 명령어 jmp를 실행

6. 예외 처리기를 실행

7. 스택에 저장된 프로그램 시작위치를 복구하여 이전 작업을 다시수행

 

3) ARM에서의 예외처리

예외 처리기 진입 절차

1. 리턴 어드레스를 링크 레지스터에 저장

2. CPSR을 SPSR로 복사

3. CPSR 동작모드 비트 설정

4. 예외 벡터를 PC로 복사

- Thumb state에서 예외발생 시 -> Arm state로 자동변경, 인터럽트 disable 처리

 

예외 처리기로부터 복귀

- LR로부터 PC값 복사

- CPSR을 SPSR로 복구

- 예외처리 진입시 인터럽트 disable 시킨경우 disable 비트를 clear

 

예외 처리기 진입시 LR값과 리턴시 실행명령어

- ARM 프로세서 명령어 : 32/16비트 명령어 -> 예외발생시 현재 프로그램 카운터 + 오프셋값이 저장

- 예외 처리기 실행 완료 후 리턴시 오프셋 값 재조정 필요

 

ARM 예외 벡터 테이블

- 테이블 엔트리 허용공간 : 32비트 -> 예외 처리기로 분기하는 분기명령 저장

- FIQ의 경우 벡터 테이블 가장 상위에 위치 -> 분기 명령없이 직접 예외처리기 저장가능

- 우선순위 : 리셋 예외 > 소프트웨어 인터럽트 <-> undefined 예외

 

ARM 예외 벡터 테이블

- 예외 발생 -> 실행 프로그램 중단 -> 예외 처리 프로그램 실행 -> 예외 처리

- vector : 실제 프로그램 메모리 어드레스값

- Exception : ARM 프로세서에서 사용하는 예외

- Operation Mode : 예외 발생시 동작 모드

- Priority : 예외 사이의 우선순위

- FIQ는 예외벡터 테이블 맨 마지막에 위치 점프 명령어로 분기할 필요없이 빠른 인터럽트 처리가능

 

 

4) 시스템 리셋

리셋 절차

1. nRESET Low: 실행중인 명령어를 버리고 새 명령어 fetch

2. nRESET High : R14_svc, SPSR_svcd의 현재 PC값과 CPSR 값 복사

3. CPSR의 동작 모드를 슈퍼바이즈 모드(M[4:0]= 10011)로 변경 + I/F비트 set -> 추가 인터럽트 방지

4. PC를 0x0000 0000 번지로 설정하여 리셋 예외처리기 실행

 

리셋 예외처리기

1. 시스템 초기화(시스템 클록 설정, 메모리 컨트롤러 초기화, 입출력 포트 설정)

2. 스택 초기화

3. 응용 프로그램 실행 : 운영체제 사용시 커널 호출, C프로그램의 main 함수 호출

 

300x250

+ Recent posts