2008년 7월 15일 화요일

MOBM(Mini OEM Boot Module)

MOBM(Mini OEM Boot Module)은 NAND Flash를 동작시키기 위한 소스이다. NAND Flash는 NOR Flash 처럼 0x0000_0000 번지에서 실행 할수 없다. NOR Flash는 주소로 구성되어 직접전근을 할 수 있으나, Nand Flash는 명령어 체계를 이용하여 Block과 Page단위로 접근하기 때문에 실행코드가 바로 수행되지 못한다. 또한 NAND Flash의 블력크기는 Small Block인 경우 16KB, Large Block인 경우에는 64KB정도의 크기 밖에 안 된다. 따라서 부트로더의 크기가 200KB 이상인 경우 0번 블럭에 다 복사하지 못한다. MOBM은 부팅시 필요한 기본적인 기능들 만 구현된것을 말한다. 또한 NAND Flash에 있는 loader를 internal SRAM 및 메모리로 복사하고, 제어권을 넘겨주는 역활을 한다.

2008년 7월 11일 금요일

소프트웨어에서의 하드웨어 접근방법

소스트웨서에서 하드웨어는 메모리로 인식된다. 프로그램은 주변기기로부터 값을 읽거나 프로그램에서 처리한 결과를 주변기기로 출력한다. 이러한 동작을 마이크로프로세서 입장에서 본다면 외부에서 데이터가 입력되거나 외부로 데이터를 출력하는 과정이며, 이러한 입출력을 중간에서 연결지어주는 것이 바로 입출력포트이다. 그러므로 프로그램에서는 입출력포트에서 사용할 메모리를 지정하고, 지정된 메모리에 값을 읽거나 쓰면 된다. 데이터 시트는 보드를 구성하는 하드웨어와 마이크로프로세서를 제어하는 정보들을 담고 있다. 특히 어떤 장치를 사용하려면 어떤 레지스터를 등록해야 하고, 어떤 값을 써야 하는지에 대한 정보를 제공받아야 한다.

2008년 7월 10일 목요일

BSP

BSP(board support package) 는 OS 제공자에 의해 제공되는 추가의 컴포넌트이며, 그 주요한 목적은 운영체제와 범용 디비아스 드라이버 사이에 가상 계층을 제공하기 쉽게 하는 것이다. BSP는 OS가 새로운 하드웨어 환경에 더 쉽게 포팅될 수 있도록 만들어준다. 왜냐하면 그 것은 하드웨어에 독립적인 소스 코드와 하드웨어에 의존적은 소스 코드의 시스템 안에 집적해 주기 때문이다. BSP는 하드웨어를 최적화할 수 있는 소프트웨어의 상위 계층에 서브루틴들을 제공하며, 컴파일시 유연성을 제공한다. 이러한 루틴들은 시스템 어플리케이션 소프트웨어의 나머지로부터 컴파일된 디바이스 드라이버 코드를 가르키고 있기 때문에, BSP는 범용 디바이스 드라어버 코드의 런타임 포팅 가능성을 제공한다.BSP는 아키텍처에 특화된 디바이스 드라이버 설정 관리와 범용 디바이스 드라이버에 접근할 수 있는 OS(또는 소프트웨어 상위계층)을 위한 API를 제공한다. BSP는 또한 시스템 안에서의 디바이스 드라이버(하드웨어)와 OS의 초기화를 관리하는 책임을 맡고 있다.

Segmentation

프로세스 내의 모든 다른 종류의 정보는 세그먼트(segment)라고 불리는 가변 크기의 '논리' 메모리 장치로 나누어진다. 세그먼트란 동일한 종류의 정보를 포함하고 있는 한 세트의 논리 어드레스이다. 세그먼트 어드레스는 0에서 시작하는 논리 어드레스 이며, 세그먼트의 베이스 어드레스를 가리키는 세그먼트 번호와 실제 물리 메모리 어드레스를 정의하는 세그먼트 오프셋으로 구성되어 있다. 세그먼트들은 독립적으로 보호된다. 이는 세그먼트들이 공유(다른 프로세스가 그 세그먼트에 접근할 수 있는곳, 읽기 전용, 읽기/쓰기와 같은 접근 속성을 할당받을 수 있다는 것을 의미한다.

대부분의 OS는 전형적으로 프로세스가 세그먼트 내에 5가지 종류의 정보들의 모두 또는 일부 조합을 가질 수 있도록 해준다.
▶ 텍스트(코드) 세그먼트, 데이터 세그먼트, bss(심벌에 의해 시작되는 블럭) 세그먼트, 스택 세그먼트, 힙 세그먼트

● 텍스트(text) 세그먼트 : 소스 코드를 포함하고 있는 메모리 공간
● 데이터(data) 세그먼트 : 소스 코드의 초기화 변수(데이터)를 포함하고 있는 메모리 공간
● bss 세그먼트 : 소스 코드의 초기화 되지 않은 변수(데이터)를 포함하고 있는 정적으로 할당된 메모리 공간
● 스택(stack) 세그먼트 : LIFP(last in, first out)큐로 구조화된 메모리의 일부이다.
● 힙(heap) 세그먼트 : 런타인시 블록 단위로 할당될 수 있는 메모리 영역, 보통 메모리 구역의 자유로운 링크 리스트로 구성

※ 데이터, 텍스트, bss 세그먼트들은 모두 컴파일시에 동일한 크기로 고정되며, 정적 세그먼트와 같다. 이 세가지 세그먼트들은 실행 가능한 파일의 일부이다. 한편 스택과 힙 세그먼트들은 컴파일시 고정되지 않으며, 런타임시에 그 크기가 변경 될수 있다.



2008년 7월 9일 수요일

메모리 관리

커널은 태스크를 통해 임베디드 시스템 안에서 프로그램 코드를 관리한다. 커널은 시스템 내에서 태스크들을 로드하고 실행하는 어떤시스템을 가지고 있어어 한다. CPU는 캐시 또는 RAM안에 있는 태스크 코드를 실행만 하기 때문이다. 동일한 메모리 공간을 고유하는 다중 태스크 코드를 보호하기 위해서는 보안 시스템 메커니즘을 필요로 한다. 또한 OS는 그것들을 관리하고 있는 태스크들과 동일한 메모리 공간 안에 있어야 하기 때문에, 보호 메커니즘은 메모리 안에 있는 그 자신의 코드를 관리하고 자신이 관리하는 태스크 코드로부터 보호 매커니즘을 루틴을 보호해야 한다. 일반적으로 커널의 메모리 관리기능은 다은과 같은 사항들을 포함한다.

● 논리(물리) 메모리와 태스크 메모리 레퍼런스 사이에서 매핑을 관리한다.
● 이용 가능한 메모리 공간으로 어떤 프로세스가 로드될지를 결정한다.
● 시스템을 구성하는 메모리 프로세스를 위한 메모리를 할당 및 해제한다.
● C 언어의 'alloc'과 'dealloc' 함수처럼,(프로세스 내에서) 코드 요청의 메모리 할당 및 해제 또는 특정 버퍼 할당 및 해제 루틴을 지원한다.
● 시스템 컴포넌트들의 메모리 사용을 추적한다.
● 프로세스 메모리 보호를 보장한다.

대부분의 OS 프로세스들은 보통 실행되는 루틴에 따라 kernel mode와 user mode의 두 모두 중 하나에서 동작한다. 커널 루틴들은 미들웨어 또는 어플리케이션과 같은 소프트웨어의 상위 계층들과는 다른 메모리 공간 및 계층 안의 커널모드(관리자모드)에서 동작한다. 전형적으로 소프트웨어의 이러한 상위 계층들은 사용자 모드에서 동작하며, 시스템호출(system call), 커널의 서브루틴으로서의 상위 레벨 인터페이스를 통해서만 커널 모드에서 동작하는 것에 접근이 가능하다.

처리를 위해 RAM으로 로드 될때 다중 프로세스는 동일한 물리 메모리를 공유하고 있기 때문에, 프로세스들이 하나의 물리 메모리 공간의 안팎으로 교체될 때 서로서로에게 의도 하지 않은 영향을 미치지 못하도록 보호 메커니즘이 있어야 한다. 보통 운영체제에 의해 메모리 스와핑이라는 방법으로 해결하는데 이것은 메모리의 일부분이 런타임시 메모리 안팎으로 교체되는것을 말한다.






2008년 7월 5일 토요일

버스

■ 버스란?
버스는 임베디디 보드상에 있는 모든 주요한 컴포넌트들 사이에서, 다양한 데이터 신호들과 어드레스 신호, 그리고 제어신호들(클럭 신호, 요청신호, 응답신호, 데이터 유형등)을 운반해 주는 선들의 모임. 여기서 주요 컴포넌트들이란 I/O 서브시스템들과 메모리 서브시스템, 그리고 주프로세서를 들수 있다.

■ 버스의 종류
1. 시스템 버스(system bus, 메인버스, 로컬버스, 프로세서 메모리 버스)
외부 주 메모리와 캐시를 주 CPU에 연결하고, 브리지들을 다른 버스에 연결하는 것을 말함. 일반적으로 매우 짧고, 고속이며, 관례적인버스이다.
2. 백플레인 버스(backplane bus)
한 버스에 메모리, 주 프로세서, 그리고 I/O를 상호 연결하고 있는 버스
3. I/O 버스
확장 버스, 외부 버스, 호스트 버스라고 불리며, 남아 있는 컴포넌트들을 주 CPU에 연결하거나, 컴포넌트들끼리 연결하거나, 브리지를 통해 시스템버스에 연결하거나, I/O 통신 포트를 통해 임베디드 시스템 그자체에 연결하는등 시스템 버스의 확장 형태처럼 동작한다.

※ 시스템 버스와 I/O 버스 사이의 주요한 차이점은 I/O 버스상에 IRQ(interrupt request) 제어신호의 존재 가능성이다.

2008년 7월 4일 금요일

파이프라인

■ 파이프라인이란?
파이프라인은 RISC 프로세서가 명령어를 실행하기 위해 사용하는 메커니즘이다. 파이프 라인 한 명령어가 해독되어 실행되는 동안, 다음 명령어를 미리 읽어올 수 있도록 함으로써 실행 속도를 향상시켜 준다. 파이프라인은 자동차를 제조하기 위해 특별한 작업을 수행하는 각 단계를 자동차 제조 라인으로 비유할 수도 있다.

■ 3단 파이프라인의 구조
1. Fetch : 메모리에서 명령어를 로드한다.
2. Decode : 실행한 명령어를 해독한다.
3. Execute : 명령어를 처리하고 그 결과를 레지스터에 저장한다.

■ ARM9 5단 파이프라인
Fetch - Decode - Execute - Memory - Write

■ ARM10 6단 파이프라인
Fetch - Issue - Decode - Execute - Memory - Write