KR101295447B1 - 운영 시스템 초기화 동안 코드를 실행하기 위한 시스템 - Google Patents

운영 시스템 초기화 동안 코드를 실행하기 위한 시스템 Download PDF

Info

Publication number
KR101295447B1
KR101295447B1 KR1020060049348A KR20060049348A KR101295447B1 KR 101295447 B1 KR101295447 B1 KR 101295447B1 KR 1020060049348 A KR1020060049348 A KR 1020060049348A KR 20060049348 A KR20060049348 A KR 20060049348A KR 101295447 B1 KR101295447 B1 KR 101295447B1
Authority
KR
South Korea
Prior art keywords
device driver
driver
mini
data
triggering mechanism
Prior art date
Application number
KR1020060049348A
Other languages
English (en)
Other versions
KR20060126372A (ko
Inventor
데르 빈 피터 반
쉐리단 에티에르
브라이언 스테처
브라이언 에드몬드
Original Assignee
큐엔엑스 소프트웨어 시스템즈 리미티드
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by 큐엔엑스 소프트웨어 시스템즈 리미티드 filed Critical 큐엔엑스 소프트웨어 시스템즈 리미티드
Publication of KR20060126372A publication Critical patent/KR20060126372A/ko
Application granted granted Critical
Publication of KR101295447B1 publication Critical patent/KR101295447B1/ko

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/4401Bootstrapping
    • G06F9/4411Configuring for operating with peripheral devices; Loading of device drivers
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/4401Bootstrapping

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Security & Cryptography (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)

Abstract

차량 텔레마틱스 시스템에 의해 지시되는 타이밍 요구 사항과 같이, 요구되는 부트 시간 요구 사항을 충족시키기 위한 시스템이 개시된다. 현재의 컴퓨터 시스템은, 입출력 요구와 같은 요구를 서비스하며, 운영 시스템을 메모리에 로딩하는 데 필요한 시간보다 짧은 타이밍 요구 사항을 갖고 있는 코프로세서와 같은 고가의 하드웨어를 사용하고 있다. 대신에, 운영 시스템이 로딩되기 전에 부트 프로세스 초기에 미니-드라이버가 초기화되어, 상기 요구를 서비스할 수 있다. 예를 들면, 상기 미니-드라이버는 입력 데이터를 버퍼링하고, 및/또는 입력 메시지에 응답할 수 있다. 운영 시스템이 로딩된 후, 제2 장치 드라이버가 초기화되고, 미니-드라이버는 제2 드라이버로 이행될 수 있다.

Description

운영 시스템 초기화 동안 코드를 실행하기 위한 시스템 {SYSTEM FOR EXECUTING CODE DURING OPERATING SYSTEM INITIALIZATION}
도 1은 CAN 버스 마스터 장치를 채용한 시스템에 대한 부트 타이밍 시퀀스의 일례를 도시하는 도면이다.
도 2는 주변장치의 제어를 운영 시스템 초기화 동안에 제1 장치 드라이버로부터 제2 장치 드라이버로 이행시키기 위한 시스템을 도시하는 도면이다.
도 3은 실시간 운영 시스템 부트 타이밍 요건의 일례를 도시하는 도면이다.
도 4는 실시간 운영 시스템 부트 타이밍 요건의 다른 일례를 도시하는 도면이다.
도 5는 미니-드라이버용 논리 아키텍처의 일례를 도시하는 도면이다.
도 6은 부트 프로세스의 단계들과 미니-드라이버 사이의 관계의 일례를 도시하는 도면이다.
도 7은 부트 프로세스의 시작 프로그램 로더(Initial Program Loader) 단계를 실행하기 위한 프로세스의 일례를 도시하는 흐름도이다.
도 8은 미니-드라이버를 초기화하는 부트 프로세스의 시작 프로그램 로더 단계를 실행하기 위한 프로세스의 일례를 도시하는 흐름도이다.
도 9는 부트 프로세스의 시동 프로그램 단계를 실행하기 위한 프로세스의 일 례를 도시하는 흐름도이다.
도 10은 미니-드라이버로부터 전형적인 장치 드라이버로의 시스템 이행의 일례를 도시하는 흐름도이다.
본 발명은 실시간 운영 시스템, 더욱 구체적으로는 시스템 부트(system boot)시부터 한정된 구간(interval) 내에 외부 이벤트에 응답하여야 하는 실시간 운영 시스템에 관한 것이다.
시스템이 더욱 복잡해짐에 따라, 내장형 시스템에 이용되는 실시간 운영 시스템(real time operating system; RTOS)에 대한 부트 시간 요구 사항이 계속 증가하고 있다. 예를 들면, 자동차, 트럭, 농업용 설비, 채광용 설비, 골프 카트, 이동식 로보트 등과 같은 차량은 GPS 항법 시스템, 무선 통신, 자동 운전 보조 시스템 등과 같이 다양한 종류의 유용한 특징을 제공하는 텔레마틱스(telematics) 시스템을 이용할 수 있다. 이들 텔레마틱스 시스템은 시스템이 켜진 후 매우 짧은 시간 내에 메시지를 전송할 수 있는 계측 제어기 통신망(Controller Area Network; CAN) 및 매체 지향 시스템 전송(Media Oriented Systems Transport; MOST®) 버스에 의해 구동될 수 있다. 텔레마틱스 시스템은 종종 매우 짧은 시간 내에 상기 메시지를 수신하고, 가능하게는 그 메시지에 응답할 수 있는 능력을 가질 필요가 종종 있다. 이러한 타이밍 요구 사항은 표준 장치 드라이버를 완전히 부팅하고 그 드라이버를 구동시키기 시작하는 RTOS에 의해 요구되는 시간보다 짧을 수 있다.
예를 들면, CAN 버스 마스터 장치는 시스템이 켜진 후 약 65ms 시점에서 버스 상의 모든 장치에 "파워 업(Power Up)" 메시지를 전송할 수 있고, 텔레마틱스 시스템은 100ms 내에 이 메시지에 응답을 하여야 한다. 이 초기 전원을 켜는 핸드쉐이킹 시퀀스(handshaking sequence) 이후, 텔레마틱스 시스템은 하나의 메시지 당 약 10ms의 속도로, CAN 버스를 통해 수신되는 추가 메시지를 버퍼링할 (가능하면 응답도 할) 필요가 있을 수 있다. 제1 CPU 명령어가 전원을 켠 후 약 10ms 내에 실행되지 않을 수 있다는 사실과 연관하여 생각하면, 텔레마틱스 시스템은 약 55ms 이내에 이 메시지에 응답할 수 있어야 한다. 이처럼 요구되는 부트 시간 요구 사항으로 인해, RTOS는 제1 "파워 업" CAN 메시지 전에 완전한 동작 상태에 있지 않을 것이다. 이는 OS 이미지를 RAM으로 복사하는 것과 같은 부팅 프로세스에서의 병목 현상 때문일 수 있다. 파워-온-리셋(power-on-reset; POR)에서 제1 사용자 애플리케이션을 시작하는 데까지의 통상적인 OS 부트 시간은 수백 밀리초로 측정될 수 있다.
이러한 타이밍 요구 사항을 충족시키기 위하여, 보조 통신 프로세서를 이용하여 RTOS의 기능성(functionality)을 보충하여 왔다. 예를 들면, CAN 메시지가 전달되면, 보조 프로세서는 그 메시지를 수신하고, 소정의 필요한 데이터를 캡처할 수 있다. 이어서, 이들 작업은 일단 OS가 로딩되면 장치 드라이버에 넘겨질 수 있다. 이들 보조 프로세서를 내장형 시스템에 통합하여 타이밍 요구 사항을 만족시키고 있지만, 이들 보조 프로세서는 가격에 민감한 시장에서 고가일 수 있다. 더 욱이, 하드웨어적인 솔루션은 발생하는 요구에 맞춰 수정하기에는 어렵고 비쌀 수 있다.
따라서, 시동 타이밍 요구 사항을 충족시키고, 운영 시스템이 가동되기 전에 동작 상태에 있으며 한정된 기능성을 제공하는 저비용의 쉽게 수정 가능한 솔루션에 대한 요구가 있다.
차량 텔레마틱스 시스템에 요구되는 타이밍 요구 사항과 같이, 요구되는 부트 시간 요구 사항을 충족하기 위한 로버스트(robust) 시스템이 개시된다. 현재의 컴퓨터 시스템은, 입출력 요구와 같은 요구를 서비스하며, 운영 시스템을 메모리에 로딩하는 데 필요한 시간보다 짧은 타이밍 요구 사항을 갖고 있는 코프로세서와 같은 고가의 하드웨어를 사용하고 있다. 대신에, 운영 시스템이 로딩되기 전에 부트 프로세스 초기에 미니-드라이버가 초기화되어, 상기 요구를 서비스할 수 있다. 예를 들면, 미니-드라이버는 입력 데이터를 버퍼링하고, 및/또는 입력 메시지에 응답할 수 있다. 부트 프로세스를 통해 호출할 수 있는 미니-드라이버는 폴링(polling) 또는 인터럽트(interrupt)를 통하는 것과 같은 다양한 방법으로 트리거(trigger)될 수 있다. 운영 시스템이 로딩된 후, 제2 장치 드라이버가 초기화되고, 미니-드라이버의 함수들은 제2 드라이버로 이행될 수 있다. 상기 제2 장치 드라이버는 공지의 방법을 이용하는 운영 시스템의 커널 모듈(kernel module)에 의해 초기화되는 통상적인 장치 드라이버일 수 있다.
본 발명의 다른 시스템, 방법, 특징 및 효과는 이하의 도면 및 상세한 설명의 검토를 통해 당업자에게 명백하거나 명백해질 것이다. 이러한 모든 추가의 시스템, 방법, 특징 및 효과는 본 설명 내에 포함되고, 본 발명의 범위 내이며, 후술하는 특허청구범위에 의해 보호되도록 하기 위한 것이다.
본 발명은 이하의 도면 및 설명을 참고하여 더 잘 이해될 수 있다. 도면의 요소는 반드시 비례하여 나타낸 것은 아니며, 대신 본 발명의 원리를 설명할 때 강조하여 표시하였다. 또한, 도면에서, 동일한 도면 부호는 상이한 도면 전체에 걸쳐 대응 부분을 나타낸다.
먼저, 도 1을 참조하면, CAN 버스 마스터 장치를 이용하는 차량 시스템에 대한 부트 타이밍 순서의 일례가 도시되어 있다. 도시된 바와 같이, CPU는 시스템 파워 온(110) 이후 약 10ms 시점에서 제1 명령어(120)를 실행할 수 있다. 약 55ms 후에 또는 시스템 파워 온(110) 후 65ms 시점에서, CAN 버스 마스터 장치는 "파워 업" 메시지(130)를 버스 상의 모든 장치에 보낼 수 있다. 텔레마틱스 시스템과 같은 버스 상의 임의의 장치는 상기 메시지에 대해 100ms 내에 응답(140)해야 한다. 이러한 초기 파워-온 핸드쉐이킹 시퀀스 후, 추가의 메시지(150a 및 150n)가 하나의 메시지 당 10ms의 속도로 CAN 버스를 통해 제공될 수 있다. 상기한 바와 같이, 파워-온-리셋(POR)에서 제1 사용자 애플리케이션을 시작하는 데까지의 통상적인 OS 부트 시간(160)이 대략 수백 밀리초로 측정될 수 있는 것처럼, 이들 요구되는 부트 시간 요구 사항으로 인해, RTOS가 제1 "파워 업" CAN 메시지 전에 완전한 동작 상 태에 있게 될지는 의문이다.
도 2에는 이러한 부트 시간 요구 사항을 충족시키기 위한 시스템(200)의 일례가 도시되어 있다. 도시한 바와 같이, 상기 시스템은 메모리(210)에 저장된 명령어를 처리하기 위한 중앙 처리 장치(CPU)(202)와 메시지를 생성 및 전송할 수 있는 주변 장치(240)를 포함할 수 있다. 메모리(210)는 다양한 애플리케이션이 시스템 하드웨어에 액세스할 수 있도록 해주는 운영 시스템(212)을 포함할 수 있다. 운영 시스템(212)은 기본적인 서비스를 제공하는 커널 모듈(212)과 시스템의 하드웨어 리소스를 설명하는 시스템 페이지(214)를 포함할 수 있다. 운영 시스템(212)은 또한 예외 테이블(218)을 포함할 수 있다. 운영 시스템 외에, 메모리(210)는 시스템(200)을 부팅하기 위한 부트 모듈(222)을 포함할 수 있다. 메모리는 또한 운영 시스템(212)을 로딩하기 전에 요구들을 서비스하기 위한 미니-드라이버(230)를 포함할 수 있다. 이하에서 더욱 상세하게 설명하는, 미니-드라이버를 인터럽트기반으로 트리거할 수 있도록 일시적 예외 테이블(temporary exception table)(232)도 포함될 수 있다.
차량 텔레마틱스 시스템에서 요구되는 부트 시간 요구 사항을 충족시키기 위한 시스템의 RTOS 부트 프로세스 시간 선도(300)의 일례가 도 3에 도시되어 있다. 처음에, RTOS는 파워-온(310) 시에 부팅을 시작할 수 있다. 이 시점에서, CPU는 리셋되고, 시작 파워-온 코드(initial power-on code)가 실행된다. 이 코드는, 시스템의 리셋 벡터(312)에 위치할 수 있고, 컴퓨터가 운영 시스템을 시작할 수 있도록 해주며, 디스크 드라이브, 키보드, 모니터, 프린터, 통신 포트 등과 같이, 시스 템의 여러 장치와 통신하는 코드를 제공할 수 있는 시작 프로그램 로더(IPL; Initial Program Loader)(310)를 포함할 수 있다. 예를 들면, 리셋 벡터(312)는 퍼스널 컴퓨터의 기초 입출력 시스템(Basic Input Output System; BIOS)을 포함할 수 있다. 이들 명령어는 또한 부트 로더, 예를 들면 시동 프로그램(320)을 초기화하기 위한 명령어를 포함할 수 있다. 일단 부트 로더가 작동하면, OS 이미지 복사, OS 부팅, 입출력(I/O) 요구 처리와 같은 다양한 부팅 관련 작업을 수행할 수 있다. 시작 파워-온 코드는 또한 미니-드라이버(230)를 초기화하기 위한 명령어를 포함할 수 있다.
미니-드라이버(230)는 통상적인 장치 드라이버의 임의의 및/또는 모든 기능성을 제공할 수 있다. 도시한 바와 같이, 미니-드라이버(230)는 주변 장치를 초기화하여 그 장치를 부팅 프로세스(300)를 통해 이용할 수 있도록 하는 능력을 제공한다. 일단 초기화되면, 미니-드라이버(230)는, 예를 들면 주변 버스(340)를 통해 수신된 메시지(342)를 리딩하고, 필요하다면 그 메시지에 응답함으로써, 시스템에 부여된 타이밍 제약을 충족시키는 데 이용할 수 있다. 부트 프로세스(300)가 완료됨에 따라, 상기 시스템은 IPL(310)로부터, 하드웨어를 초기화하고 시스템 페이지를 구축하는 것과 같은 추가의 부트 프로세스를 담당할 수 있는 시동 프로그램(320)으로 이행하고, 이어서, 운영 시스템 커널이 초기화되는 커널 초기화 단계로 이행한다. 상기 프로세스를 통하여, 미니-드라이버(230)는 필요에 따라 폴링(polling)(332)하거나, 인터럽트(334)에 응답할 수 있다. 폴링(332) 및 인터럽트(334)는 이하에서 상세하게 설명한다. 선택적으로, 미니-드라이버(230)는 메시 지 버퍼(336)를 통해 수정된 데이터를 풀 장치 드라이버(full device driver)(370)에 넘길 수 있는데, 이 드라이버는 일단 작동되면 미니-드라이버로부터 제어를 인계받을 수 있다. 이 시점에서, 풀 드라이버 인터럽트(372)가 이용될 수 있다. 미니-드라이버(230)는 또한, 예컨대 도 4에 도시된 것과 같은 시동 프로그램(320)에 의해, 부트 프로세스(300)에서 추후에 초기화될 수 있다. 미니-드라이버(230)라는 용어는 RTOS가 로딩된 후 RTOS에 의해 로딩되는 통상적인 장치 드라이버(370)와 구별하기 위해 사용된다는 점에 유의하여야 한다. 미니-드라이버라는 용어는 어떤식으로든지 제한하고자 하는 것이 아니다. 또한, 미니-드라이버(230)는 부트 프로세스(300) 초기에 폴링(332)되고, 추후에 인터럽트 구동(334)되는 것으로 도시하였지만, 미니-드라이버(230)는 직접 관련되지 않았지만 주기적인 시간 기반 인터럽트를 비롯하여 초기화 이후 임의의 시간에 공지의 방식을 이용하여 트리거될 수 있는 것과 같이, 그러한 특징들은 단지 예시적인 것이다.
예시적인 미니-드라이버(230)에 대한 논리 아키텍처의 일례가 도 5에 도시되어 있다. 논리적으로, 미니-드라이버(230)는 두 가지 구성 요소, 즉 핸들러(510)와 데이터 조작 특징(520)을 포함할 수 있다. 핸들러(510)는 부트 프로세스(300)에 대해 외부 인터페이스인 것처럼 동작하고, 소정 타입의 장치 특이적 기능성을 수행하기 위한 코드 세그먼트를 포함할 수 있다. 핸들러(510)는 부트 프로세스(300)의 임의의 단계에서 호출될 수 있다. 핸들러(510)는 특정 애플리케이션 타이밍 요구 사항을 충족하도록 디자인된 커스텀 함수(custom function)일 수 있다. 다르게는, 또는 추가적으로, 표준 또는 일반적인 핸들러(510)가 실행될 수 있다.
인터페이스로서, 핸들러(510)는 데이터 조작 특징(520)과 같은, 다양한 기능성에의 액세스를 제공할 수 있다. 예를 들어, CAN 또는 MOST 버스 컨트롤러와 같은 주변 장치에의 읽기 및 쓰기 액세스를 가능하도록 되어 있는 핸들러(510)의 일례를 표 1에 나타내었다. 이 경우에, 데이터 조작 특징(520)은 핸들러(510)에 접근가능한 메모리의 블록에 메시지 데이터를 저장하는 데 이용될 수 있다. 예를 들어, CAN 버스 마스터 장치로부터의 메시지와 같이, 장치에 의해 수신된 버퍼 메시지에 저장될 수 있다. 다르게는, 메시지 전환, 메시지 데이터 추출, 추가 장치/소프트웨어로의 메시지 포워딩 등과 같은 다른 데이터 조작 함수(data manipulation function)(520)도 제공될 수 있다. 이러한 함수는 타이밍 요건, 애플리케이션 요구 사항 등에 의해 지시될 수 있다.
예시적인 핸들러 유사코드(pseudocode)
void minidriver_handler(void *data, int *count, int flag)
{
...
//Check if device has data to be read
if(receive_function(data, count))
{
//Transmit "canned" response
transmit_function(CAN_MSG_REPLY);
}
...
//Determine if we have timed out waiting for our initial CAN bus message
if(*count==0 && timer_difference(mdrvr_start_time)> MAX_TIME)
{
//Abort boot process and power down the CPU to minimize power draw
cpu_power_down();
...
}
...
}
이들 기능성을 구현하기 위하여, 핸들러 프로그램(510)은 제공된 다양한 데이터 조작 함수(520)를 이용할 수 있다. 이들 함수(520)는 장치 특이적일 수 있으며 미니-드라이버(230)에 대해 내부적일 수 있다. 다르게는, 복수의 장치를 서비스하기 위해 이용될 수 있는 표준 또는 일반적인 함수(520)가 제공될 수도 있다. 추가적으로, 데이터 조작 특징은 미니-드라이버(230)에 대해 외부적인 함수(520)에 의해 제공될 수 있다. 예를 들어, 장치가 버스 상에서 메시지를 송신 및 수신할 수 있도록 장치 초기화 함수(intialization function)(522), 전송 함수(transmit function)(524) 및 수신 함수(receive function)(526)의 세 함수(520)가 제공될 수 있다: .
장치 초기화 함수(522)는 필요하다면 특정 장치를 초기화할 수 있다. 통상적인 하드웨어 또는 장치 초기화 함수는 하드웨어 레지스터, 장치 특이적 클록(clock) 및/또는 대기열을 구성하는 것, 장치 인터럽트를 허용(이네이블링)하는 것 등을 포함할 수 있다. 상기 장치 초기화 함수는 미니 드라이버(230)가 호출되는 처음에 한 번 호출될 수 있거나 미니-드라이버의 수명 전체에 걸쳐 호출될 수 있다. 본 명세서에서, 미니-드라이버(230)의 수명은 미니-드라이버(230)의 초기화로부터 미니-드라이버(230)의 디세이블링(disabling) 까지의 기간으로 정의된다.
전송 함수(524)는 미니-드라이버(230)와 연관된 장치로부터 데이터를 전송할 수 있다. 이 전송 함수(524)는 서비스되고 있는 특정 장치에 따라 달라질 수 있는 임의의 크기의 데이터를 전송할 수 있다. 예를 들어, 통상적인 시리얼 장치에 대한 데이터 피스(piece)의 전송은 단일 바이트를 포함할 수 있는 한편, 멀티-바이트 메시지는 CAN 마스터 장치 드라이버에 대해 전송될 수 있다.
수신 함수(526)는 장치로부터 판독될 데이터가 이용 가능한지 여부를 체크할 수 있다. 만일 데이터가 이용 가능하다면, 수신 함수(526)는 수신된 데이터를 미니-드라이버(230)의 데이터 영역 내에 저장할 수 있다. 수신 함수(526)는 또한 수신된 데이터의 전체 바이트 카운트를 유지할 수 있다. 예를 들어, 미니-드라이버 데이터가 저장되는 메모리 내의 위치 및 미니-드라이버 데이터 버퍼 내의 현재 바이트수가 수신 함수(526)에 주어질 수 있으며, 그 수신 함수는 만일 이용가능한 새로운 데이터가 없으면 0으로 돌아가고, 또는 저장된 새로운 바이트수로 돌아간다. 메모리 내의 위치는 다른 시스템 리소스를 방해하지 않도록 선택될 수 있는, 하드-코드화되고 미리 정의된 물리적 메모리 어드레스일 수 있다.
데이터 조작 특징(520)을 설정하고 제공하는 것에 더하여, 미니-드라이버(230)는 또한 다른 기능성을 제공하기 위한 추가의 로직을 포함할 수 있다. 예를 들어, 핸들러(510)는 부트 프로세스(300) 전체에 걸쳐 호출될 수 있고, 메시지가 손실되지 않도록 보장할 수 있다. 타임아웃을 폴링하는 함수 등은 미니-드라이버(230)의 행동을 사용자 주문에 맞출 수 있도록 하기 위해 제공될 수 있다. 미니-드라이버 핸들러(230)를 구동시키기 위해 세 가지 트리거링 메커니즘, 즉 1) 폴링 메커니즘(532), 2) 타이머 인터럽트 기반 폴링(534) 및 3) 장치 인터럽트 메커니즘(536)이 있을 수 있다. 다르게는, 핸들러(510)는 임의의 공지의 방식을 이용하여 트리거될 수 있다. 각 트리거 메커니즘은 독립적으로 실행되거나, 또는 트리거 메커니즘의 조합이 부트 프로세스(300) 중에 이용될 수 있다. 특정 인스턴스에서 핸들러를 호출하기 위해 이용되는 메커니즘을 표시하는 플래그가 핸들러(510) 내로 전달될 수 있다. 예를 들어, MINIDRVR_FLAG_POLLED의 플래그 값은 핸들러가 직접 호출되었다는 것을 나타낼 수 있으며, MINIDRVR_FLAG_TIMER_IRQ의 값은 핸들러(510)가 타이머 인터럽트를 통해 호출되었다는 것을 나타낼 수 있으며, MINIDRVR_FLAG_DEVICE_IRQ의 값은 핸들러(510)가 장치 인터럽트를 통해 호출되었다는 것을 나타낼 수 있다. 플래그를 이용하여, 미니-드라이버(230)의 행동은 부트 프로세스(300)의 각 단계에 대하여 최적화될 수 있다.
폴링 메커니즘(532)은 주변 장치가 데이터 또는 메시지를 갖는지를 보기 위하여 주변 장치에 계속 질문할 수 있다. 예를 들어, 시스템은 데이터가 장치로부터 수신되었는지를 결정하기 위하여 부트 시퀀스(300) 전체에 걸쳐 다양한 인스턴스에서 핸들러(510)를 호출할 수 있다. 부트 코드는 전략적으로 부트 프로세스(300) 전체에 걸쳐 함수 호출을 핸들러(510)에 둘 수 있다. 다르게는 또는 추가적으로는, 언제 장치가 폴링(532)되어야 하는지를 결정하는 시간의 의미를 만들기 위해 시스템 타이머가 이용될 수 있다.
타이머 인터럽트 기반 폴링 메커니즘(534)은 폴링 메커니즘(532)과 인터럽트 기반 시스템(536)의 조합일 수 있다. 예를 들어, 미니-드라이버 핸들러(510)는 시스템 타이머의 콰지-인터럽트 핸들러 기반 오프로서 부가될 수 있다. 그러한 경우에, 미니-드라이버는 핸들러(510)가 부트 프로세스(300) 전체에 걸쳐 명백하게 호출되어야 할 필요가 없는 이점을 가진채 폴링 모드에 있을 수 있다. 오히려, 타이머 메커니즘은 시스템의 요구 사항에 의해 특정된 최대 데이터 속도에서 인터럽트를 생성하기 위해 구성될 수 있다. 다르게는, 또는 추가적으로는, 인터럽트는 임의의 속도로 생성될 수도 있다.
마지막으로, 장치 인터럽트 트리거링 메커니즘(536)은 미니-드라이버 핸들러(510)를 장치의 인터럽트(536) 소스에 직접 부가할 수 있다. 이러한 시나리오에서, 시스템은 폴링을 완전히 피할 수 있다. 인터럽트 기반 트리거링 메커니즘(536)은 부트 프로세스(300)에 폴링 또는 타이머 코드를 추가할 필요성을 제거할 수 있으나, 인터럽트 기반 트리거링은 모든 시스템에서 또는 전체 부트 프로세스(300)에 걸쳐 가능하지 않을 수도 있다. 다르게는 또는 추가적으로, 미니-드라이버 핸들러(510)는 부트 프로세스(300) 전체에 걸쳐 또는 미니-드라이버(230)의 수명 동안 트리거링 메커니즘의 임의의 조합을 이용할 수 있다.
이들 트리거링 메커니즘은 다양한 방식으로 제공될 수 있다. 예를 들어, 인터럽트를 초기화하고, 인터럽트 핸들러를 부가하고, 타이머를 초기화하고, 현재 타이머 값을 얻고, 경과한 시간을 결정하기 위한 함수들이 제공될 수 있다. 이들 함수는 이용되는 특정 장치 및 시스템에 특이적이거나, 또는 플랫폼과 무관할 수 있다. 인터럽트를 초기화하기 위해, 미니-드라이버(230)는 CPU 및 보드-특이적 작업을 실행할 필요가 있을 수 있다. 이들 작업은 인터럽트를 수용하도록 CPU를 구성하고 미니-드라이버(230)와 연관된 장치에 대해 인터럽트를 생성하도록 인터럽트 컨트롤러를 구성하는 것을 포함할 수 있다. 인터럽트 핸들러(410)를 부가하기 위하여, 미니-드라이버 인터럽트가 시작(fire)할 때 핸들러(510)를 호출하도록 예외 테이블(232)을 생성하고 구성할 수 있다. 공지된 바와 같이, 예외 테이블은 기저 플랫폼에 따라 메모리 내의 특정 위치에 저장되어야 할 수 있다. 타이머를 초기화하기 위하여, 원하는 타이머 레졸루션(timer resolution)이 설정될 수 있다. 타이머는 대개 미니-드라이버(230)에 의해 이용되거나, 또는 인터럽트 타이머로서 구성될 수 있다. 선택적으로는, 타이머 인터럽트를 허용하고(이네이블링하고) 및/또는 금지(디세이블링)하기 위하여 플래그가 이용될 수 있다. 예를 들어, MDRVR_TMR_INTR_ENABLE의 플래그 값은 타이머 인터럽트를 허용할 수 있고, MDRVR_TMR_INTR_DISABLE의 값은 타이머 인터럽트를 금지할 수 있다.
상기한 바와 같이, 미니-드라이버(230)는 수신된 데이터를 버퍼링하기 위해 필요할 수 있는 데이터 저장 기능성을 포함할 수 있다. 이 버퍼링된 데이터는 풀 드라이버(370)가 일단 로딩되면 그 드라이버로 전달될 수 있다. 버퍼링되는 데이터의 양, 및 버퍼링을 위하여 할당되어야 하는 메모리의 양은 하드웨어 및/또는 소프트웨어 요구 사항에 따라 변할 수 있다. 사용자는 RAM 내의 임의의 위치와 같은, 데이터 버퍼링을 위한 임의의 메모리 위치를 특정할 수 있으며, 또는 메모리의 안전하거나 보호된 영역이 미니-드라이버(230) 버퍼링을 위해 남겨질 수 있다. 이 위치는 메모리가 겹쳐쓰기되거나 시스템 또는 사용자 애플리케이션에 할당되지 않도록 커널(214)에 알려져야 한다. RAM의 소정 영역이 미니-드라이버 데이터 저장을 위해 할당된다면, 이러한 할당 프로세스는 RAM이 초기화된 후 수행되어야 한다. 미니-드라이버(230)에 할당된 메모리는 시스템에 의해 내부적으로 관리되지 않을 수 있다. 오히려, 미니-드라이버(230) 자체가 메모리의 일체성을 보장하는 것을 담당하고, 시스템 메모리가 겹쳐쓰기되지 않도록 할 수 있다. 다르게는, 미니-드라이버(230)에 할당된 메모리는 시스템 메모리와 함께 관리될 수 있다. 미니-드라이버(230)에 할당된 메모리는 미니-드라이버(230)가 전체 드라이버(370)로 이행된 후에 자유로워질 수 있다.
도 6을 참고하면, 예시적인 부트 프로세스(600)의 단계와 미니-드라이버 이행 프로세스 사이의 관계를 설명하는 다이아그램이 도시되어 있다. 도시한 바와 같이, 예시적인 부트 프로세스(600)는 캐나다 온타리오 카나타에 소재하는 QNX 소프트웨어 시스템즈사(QNX Software Systems Ltd.)에 의해 제공되는 분산형 운영 시스템인 QNX Neutrino RTOS의 부트 프로세스일 수 있다. 부트 프로세스(200)는 여러 단계를 포함할 수 있다. 예를 들어, QNX Neutrino 부트 프로세스는 세 단계, 즉 시작 프로그램 로더(IPL) 단계(610), 시동 단계(620) 및 커널 초기화 단계(630)로 나뉘어진다. 이들 단계 및 이들 단계 중에 실행된 부트 프로세스 함수들은 단지 예시적이며 청구범위를 제한하고자 하는 것이 아니다.
미니-드라이버(230)는 부트 시간 요구 사항에 따라 필요로 할 수 있는, 부트 프로세스(600)의 임의의 단계 중에 초기화될 수 있다. 예를 들어, 미니-드라이버(230)는 요구되는 보다 많은 타이밍 요구 사항을 갖고 있는 시스템에 대해 IPL 단계(610) 중에 초기화될 수 있다. 덜 엄격한 부팅 요구 사항을 갖고 있는 시스템의 경우, 미니-드라이버(230)는 시동 단계(620) 또는 커널 초기화 단계(630) 중에 초기화될 수 있다. 다르게는, 미니-드라이버는 일부 부트 단계에서만 초기화될 수 있다. 예를 들어, 미니-드라이버(230)의 초기화는 시동 단계(620)와 같이, 부트 프로세스(600)의 특정 단계에 한정될 수 있다. 미니-드라이버(230)가 부트 프로세스(600)의 어느 단계에서 초기화되는 가에 따라, 미니-드라이버(230)가 부트 프로세스(600) 전체에 걸쳐 호출될 수 있도록 하기 위해 여러 이행 동작이 요구될 수도 있다.
처음에, 부트 프로세스(600)는 시스템의 리셋 벡터(602)에 위치한 명령어를 실행하는 것을 포함할 수 있다. 부트 프로세스(600)의 이 단계는 IPL 단계(610)라고 지칭할 수 있으며, 하드웨어 클록 및 메모리를 초기화하고 OS 이미지를 RAM에 복사하기 위한 명령어를 포함할 수 있다. 통상적인 IPL 단계(610) 프로세스 흐름을 설명하는 예시적인 흐름도가 도 7에 도시되어 있다. 도시한 바와 같이, IPL 단계(610)는 단계(710)에서, 시스템의 리셋 벡터에 위치한 명령어를 실행하는 것을 포함할 수 있다. 이들 명령어는 시스템 클록을 구성하고, 메모리 컨트롤러를 구성하는 것 등을 위해 어셈블리 코드를 포함할 수 있다. 이어서, 단계(720)에서 주함수(main function)가 실행하기 시작할 수 있다. 이 주함수는 IPL 단계(610)의 나머지를 관리하는 것을 담당할 수 있다. 그러한 함수는 단계(730)에서 OS 이미지에 대하여 시스템을 스캔하고, 단계(740)에서 RAM에 OS 이미지를 복사하고, 단계(750)에서 시동 부트 단계로 이행하는 것을 포함할 수 있다.
IPL 단계(610) 중에 미니-드라이버를 초기화하기 위하여, 추가의 단계를 취할 수 있다. 도 8은 미니-드라이버(230)를 초기화하는 IPL 단계를 설명하는 예시적인 흐름도이다. 도시한 바와 같이, IPL 단계(610)는 단계(810)에서 리셋 벡터 명령어를 실행함으로써 다시 시작하고, 그 후 IPL 주함수가 단계(820)에서 시작할 수 있다. 이 시점에서, 미니-드라이버는 단계(830)에서 초기화될 수 있다. IPL 단계(610)에서의 이 시점에서 미니-드라이버(230)를 초기화하는 것은 엄격한 타이밍 요구 사항을 충족시킬 수 있다. 미니-드라이버가 IPL 단계(610) 이전에 초기화되어야 하는 극한 상황에서, 미니-드라이버(230)는 부트 프로세스에서 보다 빨리 초기화될 수 있다. 이어서 IPL 단계(610)는 단계(840)에서 OS 이미지에 대하여 스캔하고, 단계(850)에서 OS 이미지를 RAM에 복사하고, 단계(860)에서 시동 프로그램에 제어를 이전하는 것과 같이, 표준 프로세스를 계속 수행할 수 있다. 핸들러(510)는 또한, 만일 미니-드라이버(230)가 인터럽트 구동되지 않는다면(도시 생략) IPL 단계(610)의 나머지 전체에 걸쳐 여러 단계에서 호출될 필요가 있을 수 있다는 점에 유의하여야 한다.
미니-드라이버(230)를 초기화하기 위해, 다양한 동작이 수행될 수 있다. 이들 동작은 데이터 전송과 수신을 허용하기 위하여 장치 하드웨어를 초기화하는 것, 시스템 리소스를 초기화하는 것 등을 포함할 수 있다. 도시한 바와 같이, 장치는 단계(832)에서 초기화될 수 있고, 타이머 메커니즘은 단계(834)에서 초기화될 수 있으며, 장치에 대한 예외가 단계(836)에서 생성될 수 있으며, 인터럽트는 단계(838)에서 초기화될 수 있다. 다르게는 또는 부가적으로, 초기화하기 위해 다른 동작이 수행될 수 있다. 이들 동작은 초기화될 특정 장치, 이용되는 하드웨어 플랫폼, 및/또는 다른 시스템 정보에 의존적일 수 있다. 단계(832,834,836,838)는 전술한 장치 초기화, 타이머 초기화, 예외 생성, 및 인터럽트 초기화 함수를 이용하여 실행될 수 있다. 다르게는, 또는 부가적으로, 다른 함수를 이용하여 미니-드라이버(230)를 초기화할 수 있다.
일단 IPL 단계(610)가 완료되면, 이행(612)이 일어나 부트 프로세스의 제어를 시동 프로그램(620)에 전달할 수 있다. 시동 프로그램(620)은 하드웨어를 초기화하는 것, 시스템의 하드웨어 리소스를 기술하는 커널에 의해 요구되는 데이터 구조인 시스템 페이지를 구축하는 것과 같은 추가의 부트 프로세스를 담당할 수 있다. 예시적인 시동 프로그램(620) 프로세스 흐름도(900)가 도 9에 도시되어 있다. 도시한 바와 같이, 시동 단계는 그 주함수가 단계(910)에서 IPL에 의해 호출될 때 시작할 수 있다. 이어서, OS 이미지는 필요하다면 단계(920)에서 압축이 풀린다. 보드 특이적 초기화 작업은 단계(930)에서 실행될 수 있으며, 시스템 페이지는 단계(940)에서 생성될 수 있다. 다르게는 또는 부가적으로, 시동 프로그램(620)은 다른 작업들을 수행할 수 있다.
만일 미니-드라이버(230)가 IPL 단계(610)동안 초기화되면, 이행(612)은 IPL(610)로부터 시동 프로그램(620)으로 정보를 전달하는 것을 포함한다. 이 정보는 트리거링 방법에 의존할 수 있다. 예를 들어, 미니-드라이버(230)가 인터럽트 구동되면, 시동 프로그램(620)은 핸들러(510)를 호출하여 장치를 주기적으로 폴링할 필요가 있을 수 있으며, 따라서 핸들러(510)에 대한 정보를 필요로 할 수 있다. IPL(610)로부터 시동 프로그램(520)으로 정보를 전달하기 위해 미니 드라이버 시동 정보 구조가 이용될 수 있다. 예시적인 미니 드라이버 시동 정보 구조를 표 1에 나타내었다. 나타낸 바와 같이, 시동 정보 구조는 핸들러(510)의 어드레스, 핸들러(510)의 크기, 할당된 RAM의 위치, 미니 드라이버 데이터의 크기, 미니 드라이버(230)에 의해 저장된 바이트의 전체 수를 나타내기 위해 이용되는 정수의 어드레스, 최소 폴링 시간, 인터럽트 정보, 예외 핸들러의 위치, 현재의 핸들 함수 트리거링 모드에 대한 정보 등을 정의하는 데이터 요소를 포함할 수 있다. 다르게는 또는 부가적으로, 다른 데이터가 시동 정보 구조에 포함될 수 있다.
IPL 함수 호출은 시동 프로그램(620)에 제어를 이행(612)시키기 전에 시동 정보 구조를 쉽게 정착(populate)시키기 위해 정의될 수 있다.
예시적인 시동 정보 구조 데이터 요소
uint32_t handler 핸들러의 어드레스
uint32_t handlersize 핸들러의 크기
uint32_t data RAM에서 미니-드라이버 데이터의 어드레스
uint32_t datasize 미니 드라이버 데이터의 크기
uint32_t handlerdatacnt 미니 드라이버에 의해 저장된 바이트의 전체 수를 나타내기 위해 이용되는 정수의 어드레스
uint32_t msec 최소 폴링 시간
uint32_t irq 인터럽트 정보
uint32_t exceptptr 예외 핸들러의 위치
uint32_t flags 현재 핸들러 트리거링 모드에 대한 정보
다르게는, 미니-드라이버(230)는 부트 프로세스의 시동 단계(620)에서 초기화될 수도 있다. 이 미니-드라이버 초기화 프로세스는 언제 초기화가 발생하는 지, IPL(610) 또는 시동 단계(620)에서인지에 관계없이 유사한 단계를 포함할 수 있다. 상기한 바와 같이, 미니-드라이버 초기화 프로세스는 장치를 초기화하는 것, 수신 및 전송 함수 및 핸들러를 공급하는 것, 가능하게는 타이머와 인터럽트를 초기화하는 것 등을 포함할 수 있다. 타이밍 요구 사항에 따라, 미니-드라이버(230)는 시동 단계(620)의 임의의 시점에서 초기화될 수 있다.
다시 도 6을 참고하면, 시동 프로그램(620)은 일단 완료되면, 커널(214)을 초기화하고 표준 장치 드라이버(370)와 같은 사용자 애플리케이션(632)을 시작하는 커널 초기화 단계(630)로 제어를 이행(622)시킬 수 있다. 미니-드라이버(230)가 IPL 단계(610) 또는 시동 단계(620)에서 초기화되었다면, 미니-드라이버(230)에 대한 정보는 커널 초기화 단계(630)로 전달될 필요가 있을 수 있다. 이 정보는 예를 들어, 시스템 페이지(216)에서 새로운 엔트리를 생성함으로써 전달될 수 있다. 이 프로세스를 단순화하기 위하여, 임의의 초기화된 미니드라이버에 대한 커널(214) 정보를 나타내기 위해 시동 프로그램(620)에 의해 호출될 수 있는 함수가 생성될 수 있다. 이 함수는 활성 상태에 있는 각 미니-드라이버(230)에 대해 호출될 수 있으며, 또는 이 함수는 모든 미니-드라이버(230)에 대해 한번 호출될 수 있다.
각 호출은 예를 들어, 시스템 페이지(216)의 미니-드라이버 섹션에서 엔트리를 동적으로 생성하고, 핸들러를 위한 구조(510)에 필요한 정보를 저장하며, 미니-드라이버 데이터와 연관된 메모리를 보존할 수 있다. 이 메모리의 내용은 수신된 메시지 등과 같은 유효한 미니-드라이버 데이터를 이미 포함할 수 있으므로 삭제되어서는 안된다는 점에 유의하여야 한다. 예시적인 미니-드라이버 시스템 페이지(216) 엔트리 및 핸들러 구조를 각각 표 3 및 4에 나타내었다.
예시적인 시스템 페이지 엔트리 정보
struct syspage_entry {
...
syspage_entry_info smp;
syspage_entry_info pminfo;
syspage_entry_info mdrvrinfo;
...
}
예시적인 핸들러 구조 데이터 요소
uint32_t handler 핸들러의 어드레스
uint32_t handlersize 핸들러의 크기
uint32_t data RAM에서 미니-드라이버 데이터의 어드레스
uint32_t datasize 미니 드라이버 데이터의 크기
uint32_t datacnt 미니 드라이버에 의해 저장된 바이트의 전체 수를 나타내기 위해 이용되는 정수의 어드레스
uint32_t msec 최소 폴링 시간
uint32_t irq 인터럽트 정보
uint32_t exceptptr 예외 핸들러의 위치
uint32_t spare[3] 추가 데이터 요소에 대해 보존된 공간
커널 초기화 단계(630)는 커널(214)을 초기화하는 것을 주로 담당할 수 있으며, 이어서 표준 장치 드라이버(370)와 같은 사용자 애플리케이션(632)을 시작할 수 있다. 그러나, 미니-드라이버 타이밍 요구 사항은 여전히 부트 프로세스(600)의 이 단계 전체에 걸쳐 충족되어야 한다. 미니-드라이버 다크 기간(dark period)은 시스템 초기화의 임의의 단계 중에 디세이블된 인터럽트를 가진 미니-드라이버 핸들러(510)의 폴(poll) 사이의 시간이다. 다크 기간 중에, 미니-드라이버는 주변 장치에서의 하드웨어 이벤트에 응답할 수 없다. 다크 기간의 길이는 주변 장치의 예상된 간격 속도에서 어떠한 하드웨어 이벤트도 손실되지 않도록 하기에 충분히 작아야 한다. 커널 초기화 단계(530) 동안 가장 긴 미니-드라이버(230) 다크 기간은 미니-드라이버(230)가 지원할 수 있는 최대 데이터 속도를 정의할 수 있다. 다르게는, 최대 데이터 속도는 임의의 공지 방법을 이용하여 선택될 수 있다. 핸들러(510)의 현재 인터럽트(만일 있다면) 및 최대 다크 시간과 같은 미니-드라이버 핸들러(510)에 관한 정보가 유지될 수 있다. 예를 들어, 만일 미니-드라이버(230)가 인터럽트 구동되지 않으면, 또는 만일 커널 초기화 단계(630)가 임의의 시점에서 인터럽트를 디세이블시키려고 한다면, 커널(214)은 미니-드라이버 타이밍 요구 사항이 여전히 충족되도록 해야 하는데, 이는 이미 이네이블된 인터럽트를 다루는 능력을 필요로 할 수 있다. 예를 들어, IPL(610) 또는 시동 프로그램(620) 동안 미니-드라이버(230)에 대해 일시적 예외 테이블이 생성될 수 있다. 이어서 정보는 상기 일시적 테이블로부터, 커널 초기화 단계(630) 동안 생성된 실제의 예외 테이블로 전송될 수 있다. 커널 초기화 단계(630)는 미니-드라이버(230)의 타이밍 요구 사항을 충족시키는 이러한 프로세스 전체에 걸쳐 여러 시간에서 미니-드라이버 핸들러(630)를 호출할 수 있다. 이는 새로운 예외 테이블을 생성하기 위한 시간이 최대 다크 기간보다 작을 것임을 가정한다. 일단 실제 예외 테이블이 생성되면, 커널(214)은 미니-드라이버(230)의 인터럽트(타이머 또는 드라이버 인터럽트 구동 중 어느 것이건 간에)가 계속 동작하도록 할 수 있다. 예를 들어, 미니-드라이버 핸들러(510)는 실제 예외 테이블(218)로 전송될 수 있다. 다음에, 커널 초기화 단계(630)는 실제 예외 테이블로 이동한 후 모든 인터럽트를 허용(이네이블)할 수 있다. 다르게는 또는 추가적으로, 인터럽트는 임의의 공지 방법을 이용하여 다뤄질 수 있다. 또한, 커널 초기화 단계(630) 동안, 인터럽트가 금지(디세이블)될 수 있는 다른 기간이 있을 수 있다.
CPU가 예외를 다루기 위해 어떻게 구성되는 지에 따라서, IPL(610)은 예를 들어 CPU의 벡터-베이스-레지스터(VBR)를 프로그래밍함으로써, SH 플랫폼에서와 같이, RAM 내의 임의로 선택된 위치(실제 예외 테이블 위치에서가 아님)에서 일시적 예외 테이블의 위치를 설정할 수 있다. SH 플랫폼은 레네사스(Renesas)에 의해 생산된 32-비트 SH 마이크로프로세서를 이용하는 임의의 컴퓨터 시스템이다. 이어서 시동 프로그램(620)은 제어를 커널 초기화 단계(630)로 이행시키기 전에 상기 VBR을 실제 예외 테이블의 위치에 설정할 수 있다. 예를 들어, 미니-드라이버(230)의 일시적 예외 테이블은 커널 초기화 단계(630)로의 이행(622) 이전에 디세이블될 수 있다.
일단 커널(214)이 부트되고 실제 장치 드라이버(640)가 작동 상태로 되면, 미니-드라이버(230)는 제어(652)를 실제 장치 드라이버(640)에 이행시킬 수 있다. 예를 들어, 드라이버(640)는 그 드라이버에 미니-드라이버(230)를 알려주며 제어(652)를 이행시키는 데 필요한 여러 작업을 트리거하는 커맨드 라인 옵션(command line option)을 포함할 수 있다. 예시적인 이행 활동은 적어도 부분적으로 이네이블되어야 하는 하드웨어의 초기화를 변화시키는 것, 하드웨어의 FIFO 또는 버퍼로부터 유효한 데이터를 복구하는 것, 미니-드라이버의 메모리 저장소(그 어드레스는 시스템 페이지(216)로부터 검색할 수 있음)로부터의 데이터를 그 내부 데이터 버퍼에 추가하여 클라이언트 애플리케이션에 이용가능하게 만드는 것을 포함할 수 있다. 실제 장치 드라이버(640) 역시 미니-드라이버의 인터럽트(510)와 그 자신의 인터럽트 핸들러 사이에서의 원만한 이행을 필요로 할 수 있다. 예를 들어, 커널(214)이 기존의 인터럽트 핸들러를 새로운 것으로 대체하도록 하기 위하여 플래그를 이용할 수 있다. 일단 실제 장치 드라이버(640)가 인터럽트 핸들러를 대체하고 미니-드라이버의 데이터를 판독하면, 미니-드라이버의 데이터 메모리는 자유로와지거나 재할당될 수 있다.
미니-드라이버(230)로부터 도 3 및 4의 실제 장치 드라이버(370)로의 예시적인 이행이 도 10에 도시되어 있다. 도시한 바와 같이, 도 6의 이행(652)은 단계(1010)에서 완전히 또는 부분적으로 하드웨어를 초기화함으로써 시작할 수 있다. 이어서, 드라이버(370)는 단계(1020)에서 시스템 페이지 내에 미니-드라이버 엔트리를 위치시키고 단계(1030)에서 그 인터럽트에 부착할 수 있다. 이어서, 미니 드라이버(230)는 단계(1040)에서, 필요한 임의의 소거를 수행하고 장치 인터럽트를 디세이블시킬 수 있다. 만일 전체 드라이버(370)가 성공적으로 인터럽트에 부착할 수 있으면, 상기 인터럽트는 단계(1050)에서 다시 허용(이네이블)될 수 있다. 미니-드라이버(230) 데이터는 단계(1060)에서 실제 드라이버(370)의 수신 버퍼내로 전송될 수 있다. 선택적으로, 미니-드라이버(230) 데이터 메모리는 단계(1070)에서 재할당될 수 있다. 마지막으로, 미니-드라이버 데이터는 단계(1080)에서, 실제 드라이버(370)가 정상 작동을 시작하기 전에, 실제 드라이버(370)에 의해 수신된 임의의 새로운 데이터와 동기화될 수 있다. 실제 드라이버(370)는 미니-드라이버 저장 버퍼 내에 저장된 미니-드라이버 데이터를 실제 드라이버(370)의 데이터 버퍼 내로 복사할 수 있다. 미니-드라이버 데이터와 새 데이터의 동기화는 데이터가 시스템 내의 다른 애플리케이션으로부터 수신된 정확한 순서로 나타나도록 무결절성으로(seamlessly) 실행될 수 있다. 예를 들어, 실제 드라이버(370)는, 저장 버퍼(336) 내의 미니-드라이버 데이터가 실제 드라이버(370)의 데이터 버퍼 내로 복사되는 동안, 새로운 데이터가 수신되었음을 나타내는 하드웨어로부터 인터럽트를 수신할 수 있다. 실제 드라이버(370)는, 새로운 데이터가 하드웨어로부터 수신되는 동안, 미니-드라이버 저장 버퍼(336)의 복사를 관리할 수 있어야 한다. 실제 드라이버(370)는 또한 데이터를 동기화된 채 유지할 수 있다. 실제 드라이버(370)는 미니-드라이버 데이터를 실제 드라이버(370) 데이터 버퍼의 시작에 복사하고 수신된 새로운 데이터를 실제 드라이버(370) 데이터 버퍼의 끝에 추가함으로써 데이터를 동기화된 채 유지하고 무결절성 이행을 형성할 수 있다. 이것은 실제 드라이버(370)에 의해 수신된 새로운 데이터를 액세스하기 전에, 먼저 미니-드라이버(230)에 의해 수신된 데이터를 다른 애플리케이션이 액세스할 수 있도록 해준다.
본 발명의 여러 가지 실시 형태를 설명하였지만, 당업자에게는 본 발명의 범위 내에서 보다 많은 실시 형태 및 구현 형태가 가능하다라는 것이 명백할 것이다. 따라서, 본 발명은 이하의 특허청구범위 및 그 등가물을 제외하고, 제한되지 않는다.
본 발명에 따르면, 차량 텔레마틱스 시스템에서 요구되는 타이밍 요구 사항과 같은 엄격한 조건을 충족시키면서 입출력 요구와 같은 요구를 서비스할 수 있다.

Claims (29)

  1. 운영 시스템(operating system), 메모리, 그리고 적어도 하나의 주변 장치를 포함하는 컴퓨터 시스템을 운영하는 방법에 있어서,
    상기 운영 시스템을 로딩하기 전에 상기 적어도 하나의 주변 장치에 대한 제1 장치 드라이버 - 상기 제1 장치 드라이버는 상기 적어도 하나의 주변 장치를 초기화하고 상기 적어도 하나의 주변 장치를 인터럽트(interrupt)와 연관시키도록 동작함 - 를 로딩하는 단계;
    상기 운영 시스템의 로딩 이후에 상기 적어도 하나의 주변 장치에 대한 제2 장치 드라이버를 로딩하는 단계;
    상기 적어도 하나의 주변 장치에 대한 제어를 상기 제2 장치 드라이버로 이행(transition)시키는 단계를 포함하며,
    상기 이행시키는 단계는,
    상기 제2 장치 드라이버를 상기 인터럽트에 부착(attach)시키는 단계;
    상기 인터럽트를 디스에이블시키는 단계;
    상기 제2 장치 드라이버에 의한 사용을 위해 상기 인터럽트를 다시 인에이블(re-enable)시키는 단계; 및
    상기 제1 장치 드라이버와 연관된 데이터를 상기 제2 장치 드라이버로 전송(transfer)시키는 단계에 의한 것인, 컴퓨터 시스템 운영 방법.
  2. 삭제
  3. 삭제
  4. 삭제
  5. 삭제
  6. 삭제
  7. 제1항에 있어서,
    상기 적어도 하나의 주변 장치에 대한 제어를 상기 제2 장치 드라이버로 이행시키는 단계는 상기 전송된 데이터를 상기 제2 장치 드라이버에 의해 획득된 데이터와 동기화시키는 단계를 더 포함하는 것인, 컴퓨터 시스템 운영 방법.
  8. 제1항에 있어서,
    상기 제1 장치 드라이버는 상기 운영 시스템의 이미지가 메모리로 복사되기 전에 로딩되는 것인, 컴퓨터 시스템 운영 방법.
  9. 삭제
  10. 삭제
  11. 삭제
  12. 삭제
  13. 삭제
  14. 삭제
  15. 삭제
  16. 삭제
  17. 커널 모듈을 포함하는 운영 시스템 및 입출력 요구들에 응답하는 적어도 하나의 주변 장치를 포함하는 컴퓨터 시스템의 부팅 프로세스 동안에 적어도 하나의 입출력 요구를 서비스하는 방법에 있어서,
    상기 커널 모듈을 로딩하기 전에, 상기 적어도 하나의 주변 장치와 연관된 제1 장치 드라이버 - 상기 제1 장치 드라이버는, 상기 적어도 하나의 입출력 요구를 서비스하고 상기 부팅 프로세스 내내 호출 가능한 핸들러, 및 상기 핸들러와 통신하고 상기 적어도 하나의 입출력 요구와 연관된 데이터를 조작(manipulate)하도록 동작 가능한 데이터 조작 구성 요소를 포함함 - 를 로딩하는 단계;
    상기 커널 모듈을 로딩한 이후 상기 적어도 하나의 주변 장치에 대한 제2 장치 드라이버를 로딩하는 단계;
    상기 데이터 조작 구성요소에 의해 조작된 데이터를 상기 제2 장치 드라이버로 이행(transition)시키는 단계;
    상기 제1 장치 드라이버로 상기 입출력 요구들을 서비스하기 위해서 일시적 예외 테이블을 생성하는 단계;
    상기 제2 장치 드라이버로 상기 입출력 요구들을 서비스하기 위해서 상기 커널 모듈에 의해서, 제2 예외 테이블을 생성하는 단계; 및
    상기 일시적 예외 테이블로부터 상기 제2 예외 테이블로 예외 정보를 이행(transition)시키는 단계를 포함하는, 입출력 요구 서비스 방법.
  18. 삭제
  19. 삭제
  20. 삭제
  21. 운영 시스템 및 입력 및/또는 출력 데이터 요청들을 처리하기 위해 적응된 적어도 하나의 주변 구성요소를 가지는 컴퓨터 시스템을 운영하는 방법에 있어서,
    상기 운영 시스템의 로딩 이전에 상기 적어도 하나의 주변 구성요소가 입력 및/또는 출력 데이터 요청들을 처리하도록 제1 장치 드라이버를 로딩하는 단계;
    상기 제1 장치 드라이버를 이용해서 수신 및/또는 송신된 데이터를 저장하는 단계;
    상기 운영 시스템의 로딩 이후에 상기 적어도 하나의 주변 구성요소에 대한 제2 장치 드라이버를 로딩하는 단계;
    상기 적어도 하나의 주변 구성요소의 제어를 상기 제1 장치 드라이버로부터 상기 제2 장치 드라이버로 이행(transition)시키는 단계; 및
    상기 제1 장치 드라이버를 이용해서 수신 및/또는 송신된 상기 데이터를 상기 제2 장치 드라이버로 이행(transition)시키는 단계를 포함하는, 컴퓨터 시스템 운영 방법.
  22. 제21항에 있어서,
    상기 제1 장치 드라이버는 제1 트리거링 메커니즘에 응답하고,
    상기 제2 장치 드라이버는 제2 트리거링 메커니즘에 응답하며,
    상기 제1 트리거링 메커니즘 및 상기 제2 트리거링 메커니즘은 서로 상이한 것인, 컴퓨터 시스템 운영 방법.
  23. 제22항에 있어서,
    상기 제어를 이행시키는 단계는,
    제어를 상기 제1 트리거링 메커니즘으로부터 상기 제2 트리거링 메커니즘으로 이행시키는 단계를 포함하는 것인, 컴퓨터 시스템 운영 방법.
  24. 제21항에 있어서,
    상기 제1 장치 드라이버는 제1 트리거링 메커니즘에 응답하고,
    상기 제2 장치 드라이버는 제2 트리거링 메커니즘에 응답하며,
    상기 제1 트리거링 메커니즘 및 상기 제2 트리거링 메커니즘은 실질적으로 동일한 것인, 컴퓨터 시스템 운영 방법.
  25. 제21항에 있어서,
    상기 제1 장치 드라이버 및 상기 제2 장치 드라이버는 상기 적어도 하나의 주변 구성요소와 연관되는 메시징을 제어하도록 적응된 것인, 컴퓨터 시스템 운영 방법.
  26. 운영 시스템 및 버스상의 통신과 연관된 입력 및/또는 출력 데이터 요청들을 처리하기 위해 적응된 적어도 하나의 주변 구성요소를 가지는 컴퓨터 시스템을 운영하는 방법에 있어서,
    상기 운영 시스템의 로딩 이전에 상기 적어도 하나의 주변 구성요소가 통신 버스상의 입력 및/또는 출력 데이터를 처리하도록 제1 장치 드라이버를 로딩하는 단계;
    상기 제1 장치 드라이버를 이용해서 수신 및/또는 송신된 데이터를 저장하는 단계;
    상기 운영 시스템의 로딩 이후에 상기 적어도 하나의 주변 구성요소에 대한 제2 장치 드라이버를 로딩하는 단계;
    상기 적어도 하나의 주변 구성요소의 제어를 상기 제1 장치 드라이버로부터 상기 제2 장치 드라이버로 이행(transition)시키는 단계; 및
    상기 제1 장치 드라이버를 이용해서 수신 및/또는 송신된 상기 데이터를 상기 제2 장치 드라이버로 이행(transition)시키는 단계를 포함하는, 컴퓨터 시스템 운영 방법.
  27. 제26항에 있어서,
    상기 제1 장치 드라이버는 제1 트리거링 메커니즘에 응답하고,
    상기 제2 장치 드라이버는 제2 트리거링 메커니즘에 응답하며,
    상기 제1 트리거링 메커니즘 및 상기 제2 트리거링 메커니즘은 서로 상이한 것인, 컴퓨터 시스템 운영 방법.
  28. 제27항에 있어서,
    상기 제어를 이행시키는 단계는,
    제어를 상기 제1 트리거링 메커니즘으로부터 상기 제2 트리거링 메커니즘으로 이행시키는 단계를 포함하는 것인, 컴퓨터 시스템 운영 방법.
  29. 제26항에 있어서,
    상기 제1 장치 드라이버는 제1 트리거링 메커니즘에 응답하고,
    상기 제2 장치 드라이버는 제2 트리거링 메커니즘에 응답하며,
    상기 제1 트리거링 메커니즘 및 상기 제2 트리거링 메커니즘은 실질적으로 동일한 것인, 컴퓨터 시스템 운영 방법.
KR1020060049348A 2005-06-03 2006-06-01 운영 시스템 초기화 동안 코드를 실행하기 위한 시스템 KR101295447B1 (ko)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US11/145,373 2005-06-03
US11/145,373 US7461247B2 (en) 2005-06-03 2005-06-03 Method for transitioning control of a peripheral device from a first device driver to a second device driver during operating system initialization

Publications (2)

Publication Number Publication Date
KR20060126372A KR20060126372A (ko) 2006-12-07
KR101295447B1 true KR101295447B1 (ko) 2013-08-12

Family

ID=36997731

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020060049348A KR101295447B1 (ko) 2005-06-03 2006-06-01 운영 시스템 초기화 동안 코드를 실행하기 위한 시스템

Country Status (6)

Country Link
US (1) US7461247B2 (ko)
EP (1) EP1736871B1 (ko)
JP (1) JP2006338664A (ko)
KR (1) KR101295447B1 (ko)
CN (1) CN1912835A (ko)
CA (1) CA2548509C (ko)

Families Citing this family (35)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7590839B2 (en) * 2005-03-22 2009-09-15 Qnx Software Systems Gmbh & Co. Kg System employing fast booting of application programs
US7461247B2 (en) * 2005-06-03 2008-12-02 Qnx Software Systems Gmbh & Co. Kg Method for transitioning control of a peripheral device from a first device driver to a second device driver during operating system initialization
US8667184B2 (en) 2005-06-03 2014-03-04 Qnx Software Systems Limited Distributed kernel operating system
US7840682B2 (en) 2005-06-03 2010-11-23 QNX Software Systems, GmbH & Co. KG Distributed kernel operating system
US20070011200A1 (en) * 2005-07-06 2007-01-11 Lg Electronics Inc. Operating auxiliary apparatus
US20070201059A1 (en) * 2006-02-28 2007-08-30 Radzykewycz Tim O Method and system for automatically configuring a device driver
US7624260B2 (en) * 2006-05-04 2009-11-24 Qnx Software Systems Gmbh & Co. Kg System executing a fast boot wake-up
JP5029076B2 (ja) * 2007-03-12 2012-09-19 日本電気株式会社 カーネル起動方法、カーネルソースコード最適化方法、カーネルソースコード最適化装置及びプログラム
JP5178282B2 (ja) * 2008-04-02 2013-04-10 キヤノン株式会社 情報処理装置、制御方法及びプログラム
US8302109B2 (en) * 2009-02-24 2012-10-30 International Business Machines Corporation Synchronization optimized queuing system
US8819321B2 (en) * 2010-06-03 2014-08-26 Dell Products L.P. Systems and methods for providing instant-on functionality on an embedded controller
US8868811B2 (en) * 2011-10-03 2014-10-21 Via Technologies, Inc. Systems and methods for hot-plug detection recovery
KR101863250B1 (ko) * 2012-02-17 2018-06-04 인포뱅크 주식회사 프로그램 실행 방법 및 장치와 이를 위한 기록매체
KR101869425B1 (ko) * 2012-02-26 2018-06-20 인포뱅크 주식회사 프로그램 운영 방법 및 장치와 이를 위한 기록매체
DE102013004178A1 (de) * 2012-03-16 2013-09-19 Marquardt Gmbh Schließsystem, insbesondere für ein Kraftfahrzeug
FR2995755B1 (fr) * 2012-09-18 2015-12-04 Parrot Equipement electronique audio/video, tel qu'un autoradio multimedia, apte a etre installe dans un vehicule automobile.
US9465621B2 (en) * 2012-12-17 2016-10-11 Itron, Inc. Priority activation of metrology driver in boot sequence
CN103077046A (zh) * 2012-12-21 2013-05-01 太仓市同维电子有限公司 一种计算机系统中利用网口替代串口的方法
US9250922B2 (en) 2013-02-28 2016-02-02 Qualcomm Incorporated Method and apparatus for prefetching peripheral device drivers for smart phones and other connected devices prior to HLOS boot
US20150089102A1 (en) * 2013-09-23 2015-03-26 Lsi Corporation Solid state drives that cache boot data
CN103489301A (zh) * 2013-09-25 2014-01-01 东风汽车公司 一种双处理器架构的车辆运行信息采集系统和方法
US10379871B2 (en) * 2014-07-10 2019-08-13 Harman International Industries, Incorporated Operating system startup acceleration
CN106663009B (zh) * 2014-07-10 2021-08-17 哈曼国际工业有限公司 操作系统启动加速
KR102388836B1 (ko) * 2014-07-10 2022-04-20 하만인터내셔날인더스트리스인코포레이티드 운영 체제 스타트업 가속
DE102014016842A1 (de) * 2014-11-13 2016-05-19 Technisat Digital Gmbh Starten von Datendiensten einer Navigationseinrichtung eines Fahrzeugs
KR101663114B1 (ko) * 2015-01-21 2016-10-07 현대자동차주식회사 차량용 멀티미디어 단말기 및 그의 데이터 처리 방법
JP6528901B2 (ja) * 2016-03-28 2019-06-12 村田機械株式会社 通信機器、通信機器の制御方法、及び記録媒体
US10162643B2 (en) * 2016-06-29 2018-12-25 Wipro Limited Method and system for booting automotive electronics in an electronic control unit of an automobile
US10452561B2 (en) 2016-08-08 2019-10-22 Raytheon Company Central processing unit architecture and methods for high availability systems
RU2649293C1 (ru) * 2017-04-28 2018-03-30 Акционерное общество "Лаборатория Касперского" Система и способ передачи перехваченных запросов от драйвера к драйверу в процессе инициализации драйверов
KR101984558B1 (ko) * 2018-03-21 2019-05-31 인포뱅크 주식회사 프로그램 운영 방법 및 장치와 이를 위한 기록매체
KR101984564B1 (ko) * 2018-03-21 2019-09-03 인포뱅크 주식회사 프로그램 운영 방법 및 장치와 이를 위한 기록매체
KR101984568B1 (ko) * 2018-03-21 2019-05-31 인포뱅크 주식회사 프로그램 운영 방법 및 장치와 이를 위한 기록매체
DE102019203130A1 (de) * 2019-03-07 2020-09-10 Continental Automotive Gmbh Nahtlose Audioübergabe in einem Mehrprozessor-Audiosystem
JP7180542B2 (ja) * 2019-06-03 2022-11-30 株式会社デンソー 情報処理装置および情報処理方法

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR20000008628A (ko) * 1998-07-15 2000-02-07 구자홍 컴퓨터 시스템의 부팅음악 출력방법
US20020062437A1 (en) * 2000-11-17 2002-05-23 Seung-Gi Shin Computer and control method thereof

Family Cites Families (19)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5410709A (en) 1992-12-17 1995-04-25 Bull Hn Information System Inc. Mechanism for rerouting and dispatching interrupts in a hybrid system environment
JP3212007B2 (ja) 1993-04-26 2001-09-25 インターナショナル・ビジネス・マシーンズ・コーポレーション オペレーティング・システム環境の起動方法およびシステム
US5694600A (en) * 1996-02-09 1997-12-02 Iomega Corporation Methods and apparatus for booting a computer having a removable media disk drive
US5978912A (en) * 1997-03-20 1999-11-02 Phoenix Technologies Limited Network enhanced BIOS enabling remote management of a computer without a functioning operating system
US6272629B1 (en) * 1998-12-29 2001-08-07 Intel Corporation Method and apparatus for establishing network connection for a processor without an operating system boot
US6353885B1 (en) * 1999-01-26 2002-03-05 Dell Usa, L.P. System and method for providing bios-level user configuration of a computer system
US7051326B2 (en) 2000-12-13 2006-05-23 International Business Machines Corporation Code image distribution in a multi-node network of processors
US6801994B2 (en) 2000-12-20 2004-10-05 Microsoft Corporation Software management systems and methods for automotive computing devices
US6978018B2 (en) * 2001-09-28 2005-12-20 Intel Corporation Technique to support co-location and certification of executable content from a pre-boot space into an operating system runtime environment
TW588284B (en) 2002-11-12 2004-05-21 Mitac Technology Corp Computer real-time power-on system and method
US7036040B2 (en) 2002-11-26 2006-04-25 Microsoft Corporation Reliability of diskless network-bootable computers using non-volatile memory cache
US20040143696A1 (en) 2003-01-21 2004-07-22 Francis Hsieh Data storage system for fast booting of computer
JP3861828B2 (ja) * 2003-02-26 2006-12-27 カシオ計算機株式会社 カメラ装置、及びカメラ装置の起動方法、プログラム
US7475233B2 (en) 2003-05-20 2009-01-06 Intel Corporation Method and apparatus for displaying a language specific text string in a pre-boot environment
JP3906825B2 (ja) 2003-06-17 2007-04-18 日本電気株式会社 計算機システム、計算機システム起動方法およびプログラム
US7174447B2 (en) * 2003-11-14 2007-02-06 Intel Corporation Providing a pre-boot driver for use during operating system runtime of a computer system
US7266727B2 (en) 2004-03-18 2007-09-04 International Business Machines Corporation Computer boot operation utilizing targeted boot diagnostics
US7590839B2 (en) 2005-03-22 2009-09-15 Qnx Software Systems Gmbh & Co. Kg System employing fast booting of application programs
US7461247B2 (en) * 2005-06-03 2008-12-02 Qnx Software Systems Gmbh & Co. Kg Method for transitioning control of a peripheral device from a first device driver to a second device driver during operating system initialization

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR20000008628A (ko) * 1998-07-15 2000-02-07 구자홍 컴퓨터 시스템의 부팅음악 출력방법
US20020062437A1 (en) * 2000-11-17 2002-05-23 Seung-Gi Shin Computer and control method thereof

Also Published As

Publication number Publication date
US20060277400A1 (en) 2006-12-07
EP1736871A2 (en) 2006-12-27
KR20060126372A (ko) 2006-12-07
CA2548509A1 (en) 2006-12-03
JP2006338664A (ja) 2006-12-14
US7461247B2 (en) 2008-12-02
EP1736871B1 (en) 2018-04-04
CN1912835A (zh) 2007-02-14
CA2548509C (en) 2012-12-04
EP1736871A3 (en) 2009-01-21

Similar Documents

Publication Publication Date Title
KR101295447B1 (ko) 운영 시스템 초기화 동안 코드를 실행하기 위한 시스템
EP2189901B1 (en) Method and system to enable fast platform restart
EP1844394B1 (en) Operating-system-friendly bootloader
US7913072B2 (en) Information-processing apparatus and activation method thereof
US5497497A (en) Method and apparatus for resetting multiple processors using a common ROM
US6128745A (en) Power management inactivity monitoring using software threads
US7093116B2 (en) Methods and apparatus to operate in multiple phases of a basic input/output system (BIOS)
JPH09293041A (ja) 周辺デバイスの自動イネーブル方法、及び周辺デバイスの自動イネーブル・プログラムを格納した記憶媒体
US7051222B2 (en) Robust computer subsystem power management with or without explicit operating system support
JP2007206885A (ja) コンピュータシステム及びシステム起動方法
US20040107359A1 (en) Utilizing the suspend state of an information handling system
CN111095205A (zh) 用于片上系统的预启动环境的多核框架
TW200525365A (en) Optimization of SMI handling and initialization
KR20140127341A (ko) 휴대용 컴퓨팅 디바이스에서 요청들을 스케쥴링하기 위한 방법 및 시스템
US7231512B2 (en) Technique for reconstituting a pre-boot firmware environment after launch of an operating system
US7451454B2 (en) Event handling mechanism
US20040098722A1 (en) System, method, and computer program product for operating-system task management
EP3633507B1 (en) Technologies for secure and efficient native code invocation for firmware services
US8732441B2 (en) Multiprocessing system
JP2009223805A (ja) 情報処理装置およびデバイスコントローラの駆動制御方法
CN114064128A (zh) 内核重启方法
KR101119458B1 (ko) 비동기 통신 기술
JP2001155001A (ja) マルチプロセッサタスク制御方法及びタスク制御装置
KR100930017B1 (ko) 다수 개의 커널을 운영하는 시스템 및 방법
US20040267998A1 (en) Method to support legacy and native mode interrupts with multiplexed execution of legacy and native interrupt service

Legal Events

Date Code Title Description
A201 Request for examination
E902 Notification of reason for refusal
N231 Notification of change of applicant
N231 Notification of change of applicant
E701 Decision to grant or registration of patent right
GRNT Written decision to grant
FPAY Annual fee payment

Payment date: 20160722

Year of fee payment: 4

FPAY Annual fee payment

Payment date: 20170726

Year of fee payment: 5

FPAY Annual fee payment

Payment date: 20180727

Year of fee payment: 6

FPAY Annual fee payment

Payment date: 20190725

Year of fee payment: 7