블로그 이미지
No pain, no gain!
lepoussin

Tag

Notice

Recent Post

Recent Comment

Recent Trackback

Archive

calendar

1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
  • total
  • today
  • yesterday
04-29 09:44
2009. 5. 3. 02:45 Embedded System/Embedded Linux
보드상에 있는 직렬 포트는 세 가지 목적으로 사용될 수 있다.
  1. 모든 부트 메시지를 표시하기 위한 시스템 콘솔
    • 커널 내의 모든 메시지 출력은 printk() 함수를 통해 이루어진다. printk() 함수는 출력될 메시지의 목록을 원현 로그 버퍼에 저장하고, 등록된 콘솔 장치의 처리함수들을 호출하여 저장된 메시지를 출력하도록 한다.
    • UART, 프린터, 네트워크와 같은 장치들은 console 구조체를 이용하여 콘솔 인터페이스를 제공하고, printk() 함수에서 메시지를 받아올 수 있다.
  2. 표준 TTY(Teletypewriter) 장치
  3. 커널 디버거 KGDB 인터페이스
    • 커널을 위한 소스-레벨 디버거로 GDB를 이용하여 구현됨
    • KGDB는 주로 직렬 인터페이스상에서 동작하지만 이더넷 인터페이스상에서 KGDB를 사용할 수 있는 패치들도 존재
    • KGDB는 GDB 스텁(stub)과 직렬 드라이버로 구성
    • GDB 스텁은 커널 HAL 내에 존재
    • 직렬 포트 인터페이스와 GDB 스텁과 연결하는 BSP의 몫

※ 출처 : ITC "임베디드 리눅스 시스템 설계와 개발"
posted by lepoussin
2009. 5. 3. 02:21 Embedded System/Embedded Linux
BSP(Board Support Package)에서 설정해야 하는 두 가지 타이머가 있다.
  1. PIT(Programmable Interval Timer) (필수) : 이 타이머는 타이머 인터럽트 내에서 시스템 펄스 혹은 틱(tick)을 발생 시키는 일을 한다.
  2. RTC(Real-Time Clock) (필수 아님): 이것은 보드상에서 프로세서와 상관없이  동작하는 외부 칩이다. RTC는 보드에 전원이 인가되지 않아도 특수한 전지에 의해 계속 전원이 유지된다. 따라서 RTC가 한 번 설정되면 현재 시간을 알려주는 서비스를 제공할 수 있다.

※ 출처 : ITC "임베디드 리눅스 시스템 설계와 개발"
posted by lepoussin
2009. 5. 3. 01:42 Embedded System/Embedded Linux
모든 보드는 고유한 하드웨어 인터럽트 관리 방식을 갖는데, 이는 대부분 보드에 사용된 PIC(Programmable Interrupt Controller) 인터페이스 때문이다. 다음은 PIC의 기본 기능에 대한 설명이다.
  • 마이크로프로세서는 보통 적은 수의 인터럽트만을 처리할 수 있으므로, 보드에 인터럽트를 필요로 하는 많은 장치가 연결된 경우에는 이를 다 처리할 수 없게 된다. 이를 위해 인터럽트 컨트롤러가 사용되는데, 인터럽트 컨트롤러는 여러 개의 인터럽트를 하나의 인터럽트 라인으로 다중화(multiplexing)하여 프로세서의 인터럽트 처리 능력을 높여준다.
  • PIC는 인터럽트의 하드웨어적 우선순위를 제공한다. 이것은 프로세서가 자체적으로 하드웨어 인터럽트 우선순위를 지원하지 않는 경우에는 유용하게 사용된다. 프로세서가 높은 우선순위의 인터럽트를 처리하고 있는 동안 PIC는 프로세서에게 낮은 우선순위의 인터럽트를 보내지 않는다. 또한 두 개의 장치가 동시에 인터럽트를 발생시킨 경우 PIC는 우선 순위 레지스터를 살펴보고 어느 인터럽트가 더 높은 우선순위를 갖는지 판단하여 높은 우선순위의 인터럽트를 먼저 CPU에 전달한다.
  • 트리거(trigger) 방식을 변환한다.
    1. 에지-트리거 인터럽트
      • 신호가 어떤 상태에서 다른 상태로(보통은 하이(high)에서 로우(low)로) 넘어가는 순간 발생
      • 인터럽트 공유 못함
      • ISA 버스 구조에서 사용되는 오래된 방식
    2. 레벨-트리거 인터럽트
      • 프로세서가 처리할 때까지 인터럽트 라인을 하이(high)로 유지
      • 인터럽트 공유 가능하지만 부적절한 설계된 경우 무한 인터럽트 루프에 빠질 수 있음

※ 출처 : ITC "임베디드 리눅스 시스템 설계와 개발"
posted by lepoussin
2009. 5. 3. 00:34 Embedded System/Embedded Linux
임베디드 리눅스 시스템에서 볼 수 있는 세 가지 형태의 주소가 있다.
  1. 물리 주소(혹은 CPU가 변환하지 않는 주소) : 이 주소는 실제 메모리 버스상에서 사용되는 주소이다.
  2. 가상 주소(혹은 CPU가 변환하는 주소) : 이 주소는 CPU가 올바른 주소 영역으로 인식하는 영역이다. 예를 들면 커널에서 주로 사용되는 메모리 할당자인 kmalloc() 함수는 가상 주소를 반환한다. 이 가상 주소는 MMU에 의해 물리 주소로 변환된다.
  3. 버스 주소 : 이 주소는 CPU 외의 장치들에서 사용되는 메모리 주소이며, 버스의 종류에 따라 주소 영역이 달라질 수 있다.
시스템의 메모리 맵을 구성하기 위한 원칙은 다음과 같은 사항들로 나누어질 수 있다.
  1. 프로세서 메모리 맵 : 이것은 제일 먼저 생성해야하는 메모리 맵이다. 이것은 CPU가 (사용자 공간과 커널 공간 등의) 여러 주소 공간을 처리하는 방식과 다양한 메모리 영역 내에 보드상의 각 장치들의 메모리 관리 정책을 결정한다.
  2. 보드 메모리 맵 : 일단 프로세서 메모리 맵이 구성되면 다음으로 프로세서 메모리 영역 내에 보드상의 각 장치들에 대한 메모리 맵을 구성해야 한다. 이것은 하드웨어와 버스 컨트롤러에 대한 이해가 요구된다.
  3. 소프트웨어 메모리 맵 : 다음으로는 부트로더나 리눅스 커널과 같은 소프트웨어들에 대한 메모리 맵을 구성해야 한다. 리눅스 커널은 스스로 자신의 메모리 맵을 구성하고 코드나 힙과 같은 다양한 커널 섹션들이 위치할 장소를 결정한다.
    1. 리눅스 커널 레이아웃 - 링커 스크립트
    2. 부트 메모리 할당자
    3. 가상 주소 공간상에 메모리와 IO 매핑 생성
    4. 커널에 의한 메모리 할당 구역(zone) 생성

※ 출처 : ITC "임베디드 리눅스 시스템 설계와 개발"
posted by lepoussin
2009. 5. 2. 23:59 Embedded System/Embedded Linux
부트로더가 가져야 하는 필수적인 기능은 다음과 같다.
  1. 하드웨어 초기 : 프로세서를 포함하여 메모리 컨트롤러와 같은 필수 컨트롤러들과 커널을 로드하기 위해 필요한 (플래시와 같은) 하드웨어를 초기화한다.
  2. 커널 로드 : 커널을 다운로드하고 메모리상의 적절한 위치에 복사한다.
x86 프로세서는 보통 기본적인 부트 과정과 OS를 로드하기 위해 2단계 부트로더를 로드하는 작업을 수행하는 BIOS를 보드에 포함하고 있다. 다음에 설명하는 과정은 MIPS나 ARM과 같은 x86 프로세서 외의 프로세서들에 대한 설명이다.
  1. 부팅 : 대부분의 부트로더는 플래시에서 시작되며, 제일 먼저 캐시 및 기본 레지스터의 설정, RAM 확인 등 기본적인 프로세서 초기화 과정을 수행한다. 그리고 메모리, 플래시, 버스 등 부팅 과정에 필요한 하드웨어들을 검증하는 POST 루틴을 실행한다.
  2. 재배치 : 부트로더는 빠른 수행을 위해 자기 자신을 플래시에서 RAM으로 복사(relocate)한다. 이러한 복사 과정을 부트로더가 저장 공간의 절약을 위해 압축되어 있는 경우에 압축을 해제하는 루틴도 포함한다.
  3. 장치 초기화 : 다음으로 부트로더는 사용자와의 상호작용에 필요한 기존 장치들을 초기화한다. 이것은 보통 UI를 띄우기 위해 콘솔을 초기화하는 과정을 의미한다. 또한 커널(과 루트 파일 시스템)을 로드하기 위해 필요한 플래시, 네트워크 카드, USB 등의 장치들도 초기화한다.
  4. UI : 다음으로 사용자가 원하는 커널 이미지를 선택할 수 있도록 UI를 띄운다. 이 단계에서 시간제한을 두어서 사용자가 시간 내에 아무것도 선택하지 않으면 기본으로 지정된 이미지를 다운로드하도록 할 수 있다.
  5. 이미지 다운로드 : 커널 이미지를 메모리로 다운로드한다. 사용자가 initrd의 형태로 루트 파일 시스템을 다운로드하도록 선택한 경우, initrd 이미지도 함께 다운로드한다.
  6. 커널 부트를 위한 준비 : 다음으로 커널로 넘겨질 부트 옵션이 존재하는 경우, 명령행 부트 옵션 인수들을 리눅스 커널에 정해진 특정 위치로 복사한다.
  7. 커널 부팅시키기 : 마지막으로 제어를 커널(의 시작 위치)로 넘긴다. 리눅스 커널이 일단 시작되면 부트로더는 더 이상 필요 없어진다. 부트로더가 사용하던 메모리 영역은 보통 커널이 회수하게 되며, 메모리 맵은 이 영역을 고려하여 설정된다.
LILO와 같은 많은 데스트톱용 부트로덜은 PC BIOS에 의종하고 있기 때문에 임베디드 시스템에서는 사용될 수 없다. 하지만 임베디드 시스템에 사용될 수 있는 일반적인 부트로더들도 많이 존재하며, 주로 U-Boot와 Redboot가 사용된다. 다음은 주로 사용되는 임베디드 프로세서들에 특화된 부트로더들의 목록을 보여준다.
  • MIPS : PMON2000, YAMON
  • ARM : Blob, Angel boot, Compaq bootldr
  • x86 : LILO, GRUB, Etherboot
  • PowerPC : PMON2000

※ 출처 : ITC "임베디드 리눅스 시스템 설계와 개발"
posted by lepoussin