블로그 이미지
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
11-26 04:50

'Embedded System/Embedded Linux'에 해당되는 글 8건

  1. 2009.05.03 임베디드 리눅스 - 인터럽트
  2. 2009.05.03 임베디드 리눅스 - 메모리 맵
  3. 2009.05.02 임베디드 리눅스 - 부트로더
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