KR101130361B1 - 코프로세서 내의 연산을 스트림라인하는 방법 - Google Patents

코프로세서 내의 연산을 스트림라인하는 방법

Info

Publication number
KR101130361B1
KR101130361B1 KR1020040010768A KR20040010768A KR101130361B1 KR 101130361 B1 KR101130361 B1 KR 101130361B1 KR 1020040010768 A KR1020040010768 A KR 1020040010768A KR 20040010768 A KR20040010768 A KR 20040010768A KR 101130361 B1 KR101130361 B1 KR 101130361B1
Authority
KR
South Korea
Prior art keywords
coprocessor
memory
buffer
context
delete delete
Prior art date
Application number
KR1020040010768A
Other languages
English (en)
Other versions
KR20040074628A (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 마이크로소프트 코포레이션
Priority to KR1020040010768A priority Critical patent/KR101130361B1/ko
Publication of KR20040074628A publication Critical patent/KR20040074628A/ko
Application granted granted Critical
Publication of KR101130361B1 publication Critical patent/KR101130361B1/ko

Links

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/46Multiprogramming arrangements
    • G06F9/50Allocation of resources, e.g. of the central processing unit [CPU]

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Advance Control (AREA)

Abstract

코프로세서 "스타베이션"을 최소화하고, 보다 큰 효율과 전력을 위해 코프로세서에서의 처리를 로세싱을 효과적으로 스케쥴링하는 기술이 제공된다. CPU 인터럽션을 대기하지 않고 코프로세서가 하나의 태스크로부터 그 다음 태스크로 전환할 수 있는 런 리스트가 제공된다. "면 폴팅"이라 불리는 방법에 의해 코프로세서는 태스크의 중간의 어느 지점이 아닌 큰 태스트의 시작에서 폴트할 수 있다. DMA 제어 명령, 즉, "펜스", "트랩" 및 "인에이블/디스에이블 컨텍스트 스위칭"은 처리 스트림 내에 삽입되어 코프로세서 효율 및 전력을 향상하는 태스크를 코프로세서가 수행할 수 있게 된다. 또한, 이러한 명령을 이용하여 고레벨 동기화 오브젝트를 설계할 수 있다. 마지막으로, 하나의 위치로부터 다른 위치로의 디스플레이용 베이스 기준을 전환할 수 있으며 이에 따라 전체 디스플레이 면을 변경하는 "플립" 기술이 기재되어 있다.

Description

코프로세서 내의 연산을 스트림라인하는 방법{SYSTEMS AND METHODS FOR ENHANCING PERFORMANCE OF A COPROCESSOR}
본 발명은 컴퓨터 프로세서에 관한 것이며, 보다 구체적으로는 코프로세서 (coprocessor)의 프로세싱을 스케줄링(scheduling)하기 위한 하드웨어 및 소프트웨어에 관한 것이다.
많은 컴퓨터 시스템들은 현재 코프로세서, 예를 들어, 그래픽 처리 장치(GPU)를 포함하고 있다. 몇몇의 경우에, 코프로세서는 마이크로프로세서와 같은 중앙 처리 장치(CPU)를 구비한 시스템의 마더보드 상에 존재할 수 있으며, 다른 시스템들에서는 코프로세서가 개별적인 그래픽 카드 상에 존재할 수 있다. 코프로세서는 그 프로세싱 태스크들을 수행할 때 종종 보조 메모리(supplemental memory), 예를 들어, 비디오 메모리를 억세스한다. 현재의 코프로세서들은 종종 게임 및 컴퓨터 원용 설계(CAD : Computer Aided Design)와 같은 어플리케이션들을 지원하기위해 3차원 그래픽 연산을 수행하도록 최적화된다. 현재의 컴퓨터 시스템들 및 코프로세서들은 하나의 그래픽 집약적인 어플리케이션을 수행할 때는 적합하게 동작하지만, 이들은 다수의 그래픽 집약적인 어플리케이션들을 수행할 때는 문제점을 가질 수 있다.
그 이유 중 하나는 그 작업부하를 효율적으로 스케줄링하는 것에 대한 전형적인 코프로세서의 무능이다. 현재의 코프로세서들은 전형적으로 현재 코프로세서를 제어하는 어플리케이션이 다른 어플리케이션들에 대해 제어권을 양도해야하는 멀티태스킹의 한 형태인 협력형 멀티태스킹(cooperative multitasking)을 구현하고 있다. 만약 어플리케이션이 제어권을 양도하는 것에 실패한다면, 코프로세서를 사실상 "과점(hog)"할 수 있다. 이는 하나의 그래픽 집약적인 프로그램을 실행할 때는 심각한 일은 아니지만, 다수의 어플리케이션들이 코프로세서를 사용하려고 시도할 때는 코프로세서를 과점(hogging)하는 문제점이 보다 심각해질 수 있다.
동작(operation)들 간의 프로세싱 배분의 문제점은 CPU의 컨텍스트(context)에서 어드레싱(addressing)되었지만, 다수의 동작들의 복잡한 스케줄링이 필요하게되어, 코프로세서들의 스케줄링은 효과적으로 어드레싱되지 않았다. 이는 현재의 시스템들 내의 코프로세서가 일반적으로 심한 연산 동작 및 시간 소모 동작을 CPU로부터 멀리 전환시켜, CPU에 다른 기능들에 대한 보다 많은 처리 시간을 제공하도록 하는 자원으로서 이해되기 때문이다. 이러한 심한 연산 동작은 종종 상당한 처리 능력을 필요로 하는 것으로 알려진 그래픽 연산으로서, 상당한 연산 능력을 필요로 하는 것으로 알려져 있다.
태스크가 코프로세서용으로 스케쥴링되면 발생하는 한 가지 문제점은 코프로세서의 "스타베이션" 가능성이 있다는 것이다. 스타베이션은 코프로세서가 비지 상태가 아닐 때 발생하며, 따라서 컴퓨터 시스템의 자원을 처리하는 것이 효율적으로 이용되지 못한다. 이 이유 및 또 다른 이유 때문에, 다른 스케쥴링 효율성을 가능하게 할 뿐만 아니라, 코프로세서 스타베이션을 최소화함으로써 코프로세서의 성능을 개선하는 시스템 및 방법이 필요하다.
본 발명은, 코프로세서의 "스타베이션"을 최소화하기 위한 그리고 보다 큰 효율성 및 전력을 위해 코프로세서에서의 프로세싱을 효율적으로 스케쥴링하기 위한 나란히 또는 개별적으로 이용될 수 있는 다양한 기술을 제공한다. 이러한 점에서, CPU 인터럽션을 대기하지 않고 페이지 폴트 또는 태스크 완료와 같은 하나의 태스크로부터 다음 태스크로의 스위칭 이벤트 발생시 코프로세서가 즉시 스위칭할 수 있게 하는 중앙 처리 장치(CPU)에 의해 런 리스트가 제공된다. 이 런 리스트에 부가하여, "면 폴팅(surface faulting)"이라 칭하는 방법에 의해 코프로세서는, 상당한 처리 차원이 소모된 후 면의 중간 어디쯤인 아닌 면 렌더링과 같은 큰 태스크의 시작에서 폴트할 수 있다. 또한, 처리 스트림 내에 삽입될 수 있는 DMA 제어 명령, 즉 "펜스", "트랩", 및 "인에이블/디스에이블 컨텍스트 스위칭"이 제공되어 코프로세서 효율성 및 전력을 개선하는 태스크를 코프로세서가 수행할 수 있게 된다. 또한, 이러한 명령을 이용하여 고레벨 동기화 오브젝트를 설계할 수 있으며, 이하 상세히 설명한다. 마지막으로, 하나의 위치로부터 다른 위치로 디스플레이용 베이스 기준을 스위칭할 수 있는 "플립" 기술이 제공되며, 이에 따라 전체 디스플레이 면을 변경하게 된다. 본 발명의 이 양태 및 다른 양태에 부가하여 이러한 기술들이 유용하게 쓰일 수 있는 상황이 제시된다.
본 발명에 의해 이루어지는 여러 개선점들이 도 1과 도 2의 비교를 통해 개념적으로 설명될 것이다. 도 1은 코프로세서를 위한 태스크 스케줄링에 대한 전형적인 종래 기술의 시도를 나타내고 있다. 다양한 어플리케이션들, 예를 들어, 어플리케이션 1, 어플리케이션 2, 및 어플리케이션 3에 의해 억세스될 수 있는 버퍼가 제공된다. 어플리케이션들은 코프로세서에 대한 태스크들을 버퍼로 로딩할 수 있으며, 이러한 태스크들은 이전에 전달된 태스크들이 완료된 후에 코프로세서에 의해 처리될 수 있다. 도시된 바와 같이, 이러한 시도는 코프로세서의 잠재적인 "과점(hogging)"에 대해 무방비 상태이다. 도 1에서, 어플리케이션 1은 코프로세서를 과점한다. 어플리케이션 1은 다른 2개의 결합된 어플리케이션들이 단지 3개의 태스크로 동작을 요청하는 동안 코프로세서가 7개의 태스크로 동작하는 것을 요청했다. 이와 같이 다수의 어플리케이션들이 코프로세서를 필요로 하는 상황에서, 도 2에 의해 제공된 바와 같은 시스템은 향상된 기능을 제공할 수 있다.
도 2는 본 발명에 따른 시스템 및 방법을 제공하여, 각각의 어플리케이션, 예를 들어, 어플리케이션 1, 어플리케이션 2, 및 어플리케이션 3은 그 자신의 버퍼, 즉 도 2에서 "제1 버퍼들"을 유지할 수 있다. 이러한 버퍼들(후에 "명령 버퍼들"로서 언급될 것임)은 다양한 태스크들이 코프로세서에 전달될 때 판정할 수 있는 스케줄링 프로세스에 제시된다. 도 2에 도시된 바와 같이, 스케줄링 프로세서는 본 경우에 "제2 버퍼들"로 삽입되었다. 간소화를 위해, 도 2의 "제2 버퍼들"은 단일 버퍼로 도시되었다. 그러나, 실제로, 도 2에서의 "제2 버퍼들"의 기능을 수행하는데는 여러 버퍼들이 요구될 수 있다. 도 2의 제2 버퍼들은 어플리케이션 1이 더 이상 코프로세서 자원들을 과점(hog)하지 않도록 코프로세서로 전달되는 태스크들을 분할하였다. 이 스케줄링 프로세스는 코프로세서 상에서 어플리케이션 1에 제1 태스크를, 다음에 어플리케이션 2에, 다음에 어플리케이션 3에, 그리고 다음에 어플리케이션 1에 다시 등과 같이 허용하였다.
도 2에 개념적으로 도시된 시스템 및 방법의 구현은 도 2가 설명하는 것보다 복잡하지만, 본 명세서에 개시된 개선점들은 일반적으로 도 2에 도시된 기본 개념을 지원하는 것을 지향한다. 본 발명의 실시예들에 대해 보다 상세히 설명하기 위해, 다음의 용이한 참조를 위한 용어 정의들이 제공된다.
명령 버퍼 - 사용자 모드 드라이버에 의해 구축된 버퍼. 이 버퍼는 렌더링 어플리케이션의 컨텍스트에 할당된 규칙적인 페이징 가능한 메모리(pageable memory)일 수 있다.
DMA 버퍼 - "직접 메모리 억세스" 버퍼. 커널 모드 드라이버에 의해 구축된 버퍼. 이 버퍼는 명령 버퍼의 컨텍스트에 기반할 수 있다. 일반적으로, 커널 페이징가능 메모리로부터 할당되며 오로지 커널 모드에서만 보인다. 이 점에서, 페이지들은 로킹(locking)되어 코프로세서가 그 것을 판독하기 전에 애퍼쳐를 통해 매핑될 수 있다.
페이징 버퍼 - 커널 모드 드라이버에 의해 구축된 버퍼. 이 버퍼는 특정한 DMA 버퍼에 대해 요구되는 메모리 자원을 페이지 인(page in), 퇴거(evict), 및 이동시키는데 사용될 수 있다. 페이징 버퍼들은 그 DMA 버퍼 카운터파트 바로 전에 실행되도록 구성될 수 있다.
링 버퍼 - 이는 코프로세서 컨텍스트 특수 버퍼이다. DMA 버퍼들로의 디렉션(direction)들이 이 버퍼에 삽입될 수 있다. 이 점에서, 코프로세서는 이러한 링 버퍼로부터 실행 명령들을 페치(fetch)할 수 있다. 일반적으로, 링 버퍼는 코프로세서가 DMA 버퍼로부터의 명령 판독을 개시하도록 지시하고 다음에 DMA 버퍼가 완전히 프로세싱되면 링 버퍼를 복귀시키도록 하는 리다이렉션 명령(redirection instruction)들을 포함한다.
보조 메모리 - 일반적으로 코프로세서 전용이며 물리적인 시스템 메모리의 일부일 필요가 없는 메모리. 예를 들어, 그래픽 카드 상에 존재하는 로컬 비디오 메모리일 수 있다. 또한, 시스템 메모리 애퍼쳐를 통해 매핑되는 메모리와 같은 다른 코프로세서 판독가능 메모리일 수 있다. 이러한 메모리는 전형적으로 통합되거나 UMA 그래픽 장치들 내에 존재하지 않는다. 이러한 메모리는 페이지 테이블 기반 애퍼쳐와 같은 GART를 통해 억세스되지 않는다.
시스템 메모리 애퍼쳐 - 이는 물리적인 시스템 메모리의 서브셋이다. 이는 GART 유사 페이지 테이블 기반 애퍼쳐를 통해 코프로세서 보여질 수 있다. CPU는 시스템 메모리 애퍼쳐에 독립적인 물리적인 시스템 메모리를 억세스할 수 있다. 이러한 메모리가 애퍼쳐를 통해 억세스될 때 개념적으로 유사한 몇몇의 예들은 그래픽 가속 포트("AGP" : Accelerated Graphics Port) 메모리, 주변 기기 상호접속 ("PCI" : Peripheral Component Interconnect) 고속 메모리, 또는 통합 메모리 구조("UMA" : Unified Memory Architecture) 메모리이다.
본 발명의 다양한 실시예들에 대한 상세한 도면이 도 3에 도시되어 있다. 도 3은 도 2에서 개념적으로 설명된 기능을 제공하도록 결합될 수 있는 다양한 소프트웨어 및 하드웨어 객체들의 개략도를 제공한다. 도 3은 다음에서 설명되는 순차적인 일련의 단계들을 나타낸다. 이 단계들은 본 발명을 명확히 설명하고 기능하게 하기 위해 순차적으로 제공되며, 본 발명을 실시하는데 필요한 시퀀스를 제공하는 것으로서 구성되는 것은 아니다. 그 순서는 본 기술 분야에 알려진 또는 장차 개발될 실시예들에 따라 변화될 수 있다. 다음의 논의는 도 3의 시스템들 및 방법들에 대한 개요로부터 시작하여, 도 3의 몇몇 특징에 대한 보다 상세한 논의로 진행될 것이다.
도 3에서, 단계 1은 어플리케이션 프로그램 인터페이스("API" : Application Program Interface)에 대한 어플리케이션 호출을 나타낸다. 어플리케이션은 사용자를 위한 소프트웨어를 구성한 임의의 파일 셋일 수 있다. API는 전형적으로 운영 체제 커널과 통신하는 어플리케이션에 의해 사용되는 언어 및 메시지 포맷이지만, 또한 데이터베이스 관리 시스템(DBMS) 또는 통신 프로토콜들과 같은 다른 제어 프로그램들과 통신하기 위한 포맷을 지칭하기도 한다. 본 발명과 관련하여 사용되는 한가지 예시적인 API는 MICROSOFT에 의해 개발된 Direct3D Runtime API이다.
단계 2는 API로부터 사용자 모드 드라이버로의 호출을 나타낸다. 사용자 모드 드라이버는 일반적으로 주변 서브루틴으로 소프트웨어 시스템(대개 운영 체제)을 링크할 수 있는 프로그램 루틴(또는 하드웨어)인데, 이는 소프트웨어일 수도 하드웨어일 수도 있다. 여기서, 사용자 모드 드라이버는 단계 1로부터의 원래의 호출에 대응하는 API 파라미터들을 포함할 수 있는 API로부터의 호출을 수신한다. 단계 3은 사용자 모드 드라이버에 의해 생성되는 렌더링 명령들이 명령 버퍼 내에 누적되는 것을 나타낸다. 버퍼는 중간 저장소로서 사용되기 위해 예약된 메모리의 영역이다. 데이터 영역 및 프로세서 또는 프로세싱을 위한 코프로세서와 같은 두 위치들 사이에서 전송되기를 대기하는 동안 버퍼 내에 데이터가 일시적으로 유지될 수 있다. 사용자 모드 드라이버에 의해 생성되는 명령 버퍼 컨텐트의 특정 부분들은 다음에서 보다 상세히 설명되는 하드웨어 전용 DMA 버퍼로 번역을 용이하게 하도록 선택될 수 있다. 또한, 명령 버퍼 정의시에 "텍스쳐" 또는 "버텍스 버퍼(vertex buffer)"와 같은 메모리 자원들에 대한 직접 메모리 참조를 생략하는 것이 유용할 수 있다. 대신에, 독립 하드웨어 벤더들("IHVs" : Independent Hardware Vendors)은 핸들(handle)들을 선택적으로 포함하는 명령 버퍼들을 정의하여, 메모리 자원들이 생성되는 시점에서 커널 인터페이스가 명령 버퍼에 대한 메모리 참조를 제공할 수 있도록 한다.
단계 4는 명령 버퍼의 플러싱(flushing)을 나타낸다. "플러싱"은 간단하게 누적된 렌더링 명령들을 비우는 것을 지칭한다. 이 렌더링 명령은 도 3에서 설명된 바와 같이 코프로세서 커널에 전달하기 위해 도시된 바와 같이 API로 재전송될 수 있다. 플러싱은 명령 버퍼가 가득 차서 유입되는 렌더링 명령들을 위해 더 많은 공간을 필요로 하기 때문에 플러싱을 제한하지 않는 것과, 즉각적인 프로세싱을 필요로 하는 명령 버퍼 내의 높은 우선순위 렌더링 명령들의 존재를 포함하는 임의의 이유로 발생할 수 있다.
단계 5는 API에 의해 코프로세서 커널에 대해 누적된 명령 버퍼들을 플러싱하는 것을 나타낸다. 커널은 일반적으로 운영 체제의 코어부로서 알려져 있으며, 메모리, 파일들, 및 주변 장치들을 선택적으로 관리하며, 또한 어플리케이션을 런치(launch)시키고 시스템 자원들을 할당할 수 있는 부분이다. 코프로세서 커널은 주 시스템 커널, 또는 개별적인 코프로세서 전용 커널, 또는 예를 들어, MICROSOFT DirectX Kernel("DXG")과 같은 특정한 형태의 커널을 포함하는 임의의 형태의 커널일 수 있다는 것이 인식될 것이다.
단계 6은 커널 모드 드라이버에 대한 명령 버퍼의 제시를 나타낸다. 코프로세서 커널은 명령 버퍼를 커널 모드 드라이버로 유도한다. 커널 모드 드라이버는 일반적으로 그 이름이 제안하는 바와 같이 커널 모드 드라이버가 커널 모드로 동작할 수 있는 것을 제외하고는 상술한 바와 같이 사용자 모드 드라이버에 관한 드라이버일 수 있다. 이 점에서, 커널 모드 드라이버는 명령 버퍼를 DMA 버퍼로 번역할 책임이 있을 수 있다. IHV들은 적절한 유효성을 보장하도록 적절한 메카니즘을 제공하고 명령 버퍼들을 커널 모드 할당 DMA 버퍼들로 복사하는 것을 고려할 수 있다. DMA 버퍼들은 이들이 코프로세서에 대해 궁극적으로 예정된 명령들의 집합들이므로 코프로세서와 지원 하드웨어와 적절하게 인터페이싱하여야 한다는 점에서 하드웨어 특정적일 수 있다.
사용자 모드와 커널 모드를 나누는 도 3을 가로지르는 수평선에 유의한다. 이 선이 제시하는 바와 같이, 본 발명은 시스템의 보안성을 위해 구현되는 컴퓨터 메모리 할당의 전통적인 레이아웃(layout) 내에서 동작할 수 있다. 사용자 모드는 비특권 메모리이며, 어플리케이션들에 의해 억세스될 수 있다. 한편, 커널 모드는 특권적이며, 어플리케이션들에 의해 억세스될 수 없다. 커널 모드 할당 DMA 버퍼는 이론적으로 임의의 메모리 공간으로 매핑될 수 있지만, 어플리케이션들의 전용 프로세스 공간(private process space)으로의 매핑은 보안 위험을 야기할 수 있다는 것을 의식하여야 한다. 이는 어플리케이션의 프로세스 공간 내의 쓰레드들에 의해 참조되는 임의의 가상 어드레스의 컨텐트가 변경될 수 있기 때문인데, 이는 다시 말하면 DMA 버퍼의 컨텐트가 유효화된 시간과 하드웨어에 의해 프로세싱되는 시간 사이에 변경될 수 있기 때문이다.
단계 7이 지시하는 바와 같이, 커널 모드 드라이버는 또한 DMA 버퍼에 의해 사용되는 메모리 자원들의 리스트를 구축할 수 있다. 이는 명령 버퍼의 유효 부분으로서 이루어질 수 있다. 이 리스트는 예를 들어, 리스트 상의 다양한 메모리 자원들에 대한 커널 핸들, 및 메모리 자원들이 참조되는 버퍼 위치를 포함할 수 있다. 이 리스트는 또한 리스트된 메모리 자원들에 대해 예상되는 컨텍스트 상태를 포함한다. 이는 임의의 현재 하드웨어 상태의 부분인 메모리 자원들 (예를 들어, "현재 렌더 타겟(current render target)", "현재 z-버퍼 " 등)이 DMA 버퍼의 개시 시에 재프로그래밍되는 것을 가능하게 하는데, 이는 이들이 코프로세서에 제시되었던 최종 DMA 버퍼 이래로 위치가 변할 수 있기 때문이다.
단계 8은 임의의 메모리 자원 리스트에 따라 DMA 버퍼를 코프로세서 커널로 전달하는 것을 나타낸다. 코프로세서 커널은 다음에 단계 9에 나타난 바와 같이 DMA 버퍼를 코프로세서 스케줄러에 제시할 수 있으며, 단계 10에서와 같이 사용자 모드로 복귀한다.
코프로세서 스케줄러는 일반적으로 (다양한 DMA 버퍼 및 코프로세서들로 전달되는 다른 작업들로 구체화되는) 코프로세서에 대한 태스크들의 플로우를 스케줄링할 책임이 있다. 코프로세서 스케줄러의 기능은 잠재적으로 매우 넓으며, 이러한 기술은 코프로세서 스케줄러가 수행할 수 있는 다수의 잠재적인 기능들을 포함한다. 코프로세서 스케줄러는 코프로세서 스케줄러 또는 간단히 스케줄러로서 지칭될 수 있다. 도 3에 도시된 바와 같이, 다양한 실시예들에서, 스케줄러는 DMA 버퍼를 코프로세서에 제시하기 전에 하나 이상의 기능을 수행할 수 있다. 단계 11a는 스케줄러의 한 기능이 프로세싱 준비가 된 DMA 버퍼들을 제시하는 것을 동적으로 나타낸다.
단계 11b는 스케줄러가 준비된 DMA 버퍼들의 리스트에 추가하거나 다음을 실행하는 것을 결정하는 DMA 버퍼의 선택을 나타낸다. 이 점에서, 스케줄러는 DMA 버퍼를 프리퍼레이션 쓰레드로 통과시킬 수 있다. 본 명세서에서 사용되는 용어 프리퍼레이션 쓰레드는 일반적으로 적절한 메모리 자원들이 DMA 버퍼 프로세싱을 위해 전달되는 것을 보장하는 기능을 제공한다. 먼저, 프리퍼레이션 쓰레드는 보조 메모리 내에 현재 존재하지 않는 요구되는 모든 객체들을 페이징하는 충분한 위치 (그래픽 컨텍스트, "면")를 결정하도록 보조 메모리 관리 프로세스(도시생략)를 호출할 수 있다. (단계 12) 용어 "보조 메모리"는 GPU 코프로세서의 경우에 코프로세서에 의해 사용되기 위해 할당되는 메모리를 지칭하며, 이 보조 메모리는 종종 "비디오 메모리"로 지칭됨을 알아야 한다.
DMA 버퍼에 의해 요구되는 모든 메모리 자원들이 한번에 이용가능한 보조 메모리에 적합한 것은 아니다. 보조 메모리 매니저는 다양한 이유로 인해 상기 지점에서 보조 메모리 내의 모든 면들에 동반하는 것에 실패할 수 있다. 이러한 상황이 발생하면, 몇몇의 추가 프로세싱이 보조 메모리 내에 보다 많은 공간을 만들도록 행해지거나, 대안적으로 또는 보다 많은 공간을 만드는 것과 함께, DMA 버퍼가 다수의 프래그먼트(fragment)들로 분할될 수 있다. 이러한 경우에, 프리퍼레이션 쓰레드는 버퍼 분할하고 보다 작은 DMA 버퍼에 의해 요구되는 메모리 자원들의 서브셋을 배치하는 시도를 하도록 드라이버 프리디파인드 스플릿 포인트(driver pre-defined split point)를 사용할 수 있다.
일단 충분한 보조 메모리가 DMA 버퍼에 대해 배치되었으면, 프리퍼레이션 쓰레드는 단계 13에 의해 설명되는 바와 같이 커널 모드 드라이버를 호출할 수 있다. 이는 단계들 6, 7 및 8과 관련하여 언급된 커널 모드 드라이버일 수 있거나, 본 기술분야에 숙련된 자에 의해 인식될 수 있는 바와 같이 개별적인 커널 모드 드라이버일 수 있다.
단계 14는 커널 모드 드라이버가 DMA 버퍼 대기 프로세싱을 위한 페이징 버퍼를 구축할 수 있다는 것을 나타낸다. 커널 모드 드라이버는 프리퍼레이션 쓰레드로부터 프로세싱 명령들을 기초로 상기 페이징 버퍼를 구축할 수 있다. 페이징 버퍼는 상술한 바와 같이 페이징 메모리 자원들을 위한 버퍼이다. "페이징 (paging)"은 매핑 하드웨어를 사용하여 메모리 블럭(페이지)의 물리적인 어드레스를 변경하는 것을 지칭한다. 페이징 버퍼는 일반적으로 말하자면 메모리 지원들을 그 할당된 위치로 이동시키는 코프로세서 명령들을 포함하는 DMA 버퍼이다. 페이징 버퍼는 DMA 버퍼에 의해 요구되는 임의의 메모리 자원들을 정확한 메모리 위치에 가져가는 기능을 제공하는데, 상기 자원들은 필요할 때 코프로세서에 의해 억세스될 수 있다. 페이징 버퍼가 적절하게 생성되면, 특정한 코프로세서 태스크를 위한 임의의 필수적인 메모리 자원들(즉, DMA 버퍼)이 알려진다.
단계 15는 페이징 버퍼가 생성된 프리퍼레이션 쓰레드에 대한 통보를 나타낸다. 단계 16은 페이징 버퍼가 준비된 스케줄러에 대한 신호를 나타낸다. 스케줄러는 이러한 점에서 다음의 DMA 버퍼가 프로세싱을 위해 준비되거나, 프로세싱을 위해 코프로세서로 전송되기 전에 DMA 버퍼상에서 추가 준비 작업을 수행할 수 있다는 것을 가정할 수 있다. 예를 들어, 메모리 위치들은 원래의 DMA 버퍼의 생성 이래로 변화되므로, 스케줄러는 이러한 점에서 메모리 자원들의 실제 위치로 DMA 버퍼를 패치(patch)하도록 다시 한번 커널 모드 드라이버를 호출할 수 있다. 최종적으로, 스케줄러는 페이징 버퍼(존재한다면)와 DMA 버퍼 모두를 프로세성되는 코프로세서 (및 임의의 다른 보조 하드웨어)에 제시할 수 있다.
상술한 단계 1 내지 단계 16은 하드웨어, 소프트웨어, 및 이들의 조합으로 구현될 수 있다. 이러한 점에서, 도 4a 및 도 4b는 일반적으로 의사 알고리즘의 형태로 도 3의 단계들을 나타내고 있다. 도 4a 및 도 4b는 본 발명과 관련하여 실시될 수 있는 잠재적인 의사 알고리즘 단계들의 포괄적인 리스트는 아니며, 도 4a 및 도 4b의 각각의 그리고 모든 단계는 본 발명을 실현하는데 필수적인 것으로 구성되지 않았다. 대신에, 도 4a 및 도 4b는 본 발명을 이해시키기 위한 함축적인 리스트이다.
도 3과 관련하여 제공된 상술한 논의는 본 발명의 다양한 실시예들의 기술이다. 그러나, 상술한 바와 같이 본 발명의 구현과 관련하여 여러 장점들이 발견되었다. 이러한 기술의 나머지는 다양한 향상들을 가능하게 하고 본 발명의 실시할 때 발생할 수 있는 어려움들을 극복하는데 대한 것이다.
스케줄링 고찰
이전에 정의된 몇몇의 모든 동작들(단계들 1-16 참조)은 DMA 버퍼가 하드웨어에 제시되기 전에 발생할 수 있다. 그러나, 이러한 동작들 중 몇몇은 DMA 버퍼가 하드웨어에 제시될 때까지 수행하는 것이 어려울 수 있다. 예를 들어, 메모리 자원들의 위치는 DMA 버퍼가 코프로세서에 제시되기 직전까지 판정하는 것이 어려울 수 있다. 이는 보조 메모리 자원들이 코프로세서 상에서 실행됨에 따라 각각의 DMA 버퍼로 이동될 수 있기 때문이다.
상기 단계들 1-16에 의해 포함되는 동작들 중 몇몇은 시간 소모적일 수 있으며 따라서 인터럽트 시간, 예를 들어 다음에 어느 태스크가 실행할지를 스케줄러가 선택한 후에 행해지지 않을 수 있다. 유사하게, 정확히 이들은 시간 소모적이기 때문에 코프로세서가 다른 작업을 행하는데 바쁜 동안에 중앙 처리 장치("CPU") 상에서 실행하는 것이 유리할 것이다. 이는 코프로세서 스타베이션(starvation)을 최소화할 것이다. 코프로세서 스타베이션은 주로 코프로세서가 프로세싱 기능들을 수행하지 않고 소모되는 시간을 지칭한다. 이러한 문제점에 응답하여, 스케줄러에 관련한 "워커 쓰레드"를 사용하는 것이 유리할 수 있다. 워커 쓰레드는 시간 소모적인 셋업 작업 중 몇몇을 핸들링하는 것을 돕는 기능을 수행할 수 있다. 워커 쓰레드는 본 발명의 다른 프로세스들과 관련하여 도 4b의 의사 알고리즘 및 그 동작 예에 추가되었다.
이러한 스케줄링 고찰에 더하여, 도 3의 시스템에서 임의의 주어진 시간에, DMA 버퍼(예를 들어, 코프로세서에 의해 현재 프로세싱되는 DMA 버퍼), 준비된 DMA 버퍼, 및 준비된 DMA 버퍼들의 리스트를 실행할 수 있다는 것을 알아야 한다. 스케줄러에 대한 제시 시에 새로운 DMA 버퍼는 준비가 된 큐에 삽입될 수 있으며 그 우선순위에 따라 적절하게 정렬될 수 있다. 그러나, 스케줄러에 대한 제시 시에 새로운 DMA 버퍼가 코프로세서를 위한 다음 태스크로서 선택된 DMA 버퍼를 점유할 수 없다면, 본 발명의 다양한 실시예들은 기능을 증가시킬 수 있다. 그 이유는 DMA 버퍼를 준비하는 것이 보조 메모리 내에서 그리고 밖에서 메모리 자원들을 페이징하는 것을 포함하기 때문이다. 그러므로, 프로세싱을 위해 선택된 다음의 DMA 버퍼의 선점은 보조 메모리 매니저의 지속적인 상태로의 변화를 야기한다. 준비되는 태스크가 선점된다면, 새롭게 채택된 DMA 버퍼의 준비로 인해 보조 메모리 매니저의 지속적인 상태로 이루어진 변화를 되돌릴 수 있다. DMA 버퍼 태스크 상의 동작을 통해 보조 메모리 하프웨이(halfway)로 변화를 되돌리는 것은 사소한 것이 아닐 수 있으며, 잠재적으로 보다 자주 코프로세서 스타베이션을 일으킬 수 있다.
DMA 버퍼 분할
명령 버퍼가 API에 의해 코프로세서 커널에 제시될 때, 커널 모드 드라이버는 다음에 하드웨어 특정 DMA 버퍼 및 그 DMA 버퍼를 실행하는데 필요한 메모리 자원들의 리스트를 생성하는 것이 맡겨질 수 있다. 특정한 DMA 버퍼 포맷들이 IHV들에 의해 정의될 수 있지만, 소프트웨어 공급자들은 이들을 커널 모드 드라이버를 위한 자원 리스트의 포맷을 정의하는 태스크로 찾을 수 있다.
메모리 자원 리스트는 DMA 버퍼에 의해 사용될 수 있는 상이한 메모리 자원들에 대한 타임라인(timeline) 정보를 제공할 수 있다. 스케줄러는 차례로 DMA 버퍼가 코프로세서를 실행하기 전에 임의의 요구되는 메모리 자원들 내에서 페이징하고, DMA 버퍼가 한 번에 너무 많은 자원들을 사용할 때와 같이 DMA 버퍼를 분할하는 것이 필요하다면 DMA 버퍼를 분할하도록 메모리 자원들을 사용할 수 있다.
DMA 버퍼들이 스케줄러에 의해 분할된다면, 커널 모드 드라이버는 이것을 메모리 자원 리스트에 타임라인 정보를 제공함으로써 용이하게 할 수 있다. 이는 DMA 버퍼 내의 "오프셋"을 드라이버가 특정하도록 함으로써 행해질 수 있다. 오프셋은 메모리 자원이 오프셋에서 메모리 자원의 사용을 특정하는 메모리 자원 식별자를 삽입함으로써 프로그래밍될 때 설정될 수 있다. 메모리 자원들은 DMA 버퍼 내에서 한 번 이상 나타날 수 있으므로, 동일한 메모리 자원들이 메모리 자원 리스트에서 여러 번 나타날 수 있다. DMA 버퍼 내의 메모리 자원에 대한 각각의 참조는 자원 리스트에 하나의 엔트리(entry)를 추가할 것이다.
그 자체로, 그 핸들/오프셋 리스트가 DMA 버퍼를 분할하는데 필요한 메모리 자원들에 대한 충분한 정보를 스케줄러에 제공하기에 충분하지 않을 수 있다. 특정한 메모리 자원이 DMA 버퍼에서 요구될 때를 정확히 알기 위해, 스케줄러는 또한 메모리 자원이 다른 자원으로 대체될 때에 관한 정보를 필요로 한다. 예를 들어, 제1 텍스쳐, 텍스쳐 A는 중간에서 제2 텍스쳐, 텍스쳐 B에 의해 대체되는 제1 텍스쳐단 내의 DMA 버퍼의 개시 시에 포함될 수 있으며, 다음에 DMA 버퍼의 말단에서 텍스쳐 A로 복귀한다. 스케줄러는 메모리 자원들을 덜 사용할 청크들(chunks) 내에서 DMA 버퍼를 분할하는 추가 정보를 사용할 수 있다. 그러나, 상술한 시나리오에서, 이는 텍스쳐 A와 동일한 시간에 사용되었으며, DMA 버퍼의 개별적인 서브셋으로 분할되지 않은 경우에, 텍스쳐 B는 또한 제1 텍스쳐단에서 프로그래밍되었다.
상술한 복잡한 방법의 DMA 버퍼들에 요구되는 "파이너 그레인(finer grain)" 일시적인 정보를 달성하기 위해, 스케줄러는 DMA 버퍼를 통해 메모리 자원들의 사용에 대한 정보를 사용할 수 있다. 한 실시예에서, 이는 커널 모드 드라이버가 메모리 자원 리스트 내의 각각의 엔트리에 대한 자원 식별자를 제공할 때 이루어질 수 있다. 자원 식별자는 특정한 메모리 자원이 어떻게 사용될 것인지를 나타내는 간단한 정수값이다. 예를 들어, 0의 값은 메모리 자원이 렌더 타겟으로서 사용되는 것을 나타내며 1의 값은 자원이 z-버퍼로서 사용되는 것을 나타낸다. 이러한 정보로, 스케줄러는 텍스쳐 B가 텍스쳐 A를 대체하는지 (예를 들어, 양자가 동일한 자원 식별자를 사용하는지) 또는 텍스쳐 B가 텍스쳐 A와 동일 시간에 사용되는지 (예를 들어, A와 B가 상이한 자원 식별자를 갖는지)를 판정할 수 있다. 자원 식별자에 대한 실제 값 및 그 의미는 IHV에 의해 정의되거나 소프트웨어 아키텍쳐로 제공될 수 있다. 자원 식별자들로서 사용되는 값들은 0 기반이고, 드라이버는 드라이버 초기화 시간을 사용할 최대 자원 식별자 값을 특정하는 것이 유용할 수 있다.
도 5는 어떻게 스케줄러가 DMA 버퍼 내에 사용되는 메모리 자원들에 대한 타임라인을 정의하도록 제공된 정보를 사용할 수 있는지를 나타낸다. 스케줄러는 버퍼 분할 포인트들을 정의하도록 타임라인 사용을 진행할 수 있다. 일반적으로, DMA 버퍼들이 현재의 (즉, 이전의 DMA 버퍼의 말단에 현재 존재하는) 메모리 자원들의 "셋업" 또는 식별 프로세스로 시작함을 아는 것이 중요할 것이다. 그 이유는 이전의 DMA 버퍼가 실행되었고 따라서 재프로그래밍이 요구될 필요가 있으므로 메모리 자원들이 이동되었을 수 있기 때문이다. 메모리 자원들은 DMA 버퍼가 프로세싱을 위해 스케줄링되는 순간까지 재프로그래밍될 필요가 있을 수 있다.
도 5에 도시된 바와 같이, 메모리 자원 리스트는 임의의 수의 필드들을 포함할 수 있다. 다음의 테이블은 유용한 필드들의 비포괄적 리스트를 제공한다.
Handle 메모리 자원의 핸들
ResourceId 리소스가 어떻게 사용되는지를 선택적으로 특정하는 리소스 식별자
Offset 메모리 자원들이 프로그래밍될 수 있는 DMA 버퍼 내의 오프셋. 스케줄러는 메모리 제한으로 인해 버퍼를 분할할 필요가 있는지를 지적하는 DMA 버퍼를 실행하는 드라이버를 호출할 수 있다. 따라서, 이 오프셋은 DMA 버퍼에 대한 유효 분할 포인트를 제공할 수 있다.
SegmentHint 드라이버가 최적 성능을 제공하도록 특정한 할당에 사용되는 세그먼트를 특정. 이는 할당을 위해 현재의 드라이버 선호도를 대체할 수 있다.
BankHint 커널 모드 드라이버가 할당을 페이징할 수 있는 힌트된 세그먼트 내의 뱅크를 특정. 이는 할당을 위해 현재의 드라이버 선호도를 대체할 수 있다.
SegmentID 메모리 자원들을 유지하는 세그먼트의 세그먼트 식별자를 특정.이는 페이징 동안에 채워질 수 있다.
PhysicalAddress 세그먼트 내의 메모리 자원의 물리적인 어드레스를 특정 이는 페이징 동안에 채워질 것이다.
페이징
일반적으로, DMA 버퍼에 의해 참조되는 메모리 자원들은 DMA 버퍼가 코프로세서에 의해 실행되도록 제시되기 전에 메모리로 제공될 수 있다. 메모리로의 참조된 메모리 자원들의 제공은 자원 페이징으로 불린다. 페이징은 상술한 바와 같은 프리퍼레이션 워커 쓰레드와, 커널 모드 드라이버와 같은 드라이버 사이의 상호작용을 포함할 수 있다. 프리퍼레이션 워커 쓰레드와 보조 메모리 매니저 사이의 동태를 나타내는 의사 알고리즘에 대해 도 6을 참조한다.
페이징 단계는 전형적으로 DMA 버퍼가 프로세싱을 위해 선택되었고, 특정한 DMA 버퍼에 대한 자원 리스트가 생성되었을 때 발생할 것이다. 페이징은 어떻게 메모리 자원을 보조 메모리에 제공하고 보조 메모리가 그들을 어디에 위치시키는지를 판정하도록 수행된다.
페이징 프로세스는 보조 메모리 매너저에 의해 핸들링될 수 있다. 보조 메모리 매니저는 특정한 할당의 생성 시에 커널 모드 드라이버에 의해 선택적으로 제공되는 힌트(hint)를 사용할 수 있다. 이 힌트는 메모리 자원을 위해 메모리 내의 적절한 위치를 찾도록 생성되었다.
메모리 자원 페이징과 관련된 여러 문제점들이 존재한다. 현재 메모리 내의 몇몇의 자원들이 퇴거될 수 있는 경우에 모든 자원들을 제공하도록 이용가능한 비어있는 보조 메모리가 충분하지 않을 수 있다. 보조 메모리 내의 다른 객체들을 회복한 후에도, DMA 버퍼를 위해 불충분한 메모리일 수 있다. DMA 버퍼는 다수의 보다 작은 단편들로 분할될 수 있다는 면에서, 메모리 자원들을 거의 요청하지 않는다.
페이징 동안에, 보조 메모리 매니저는 적절한 위치에 메모리 자원들을 위치시키는데 사용될 수 있는 명령들의 리스트를 구축할 수 있다. 이 명령들의 리스트는 예를 들어, 다음의 동작으로부터 구축될 수 있다.
1) 퇴거(Evict): 다른 자원을 위한 공간을 확보하기 위해 그 현재의 세그먼트로부터 시스템 메모리로 이동.
2) 페이지 인(Page in): 시스템 메모리로부터의 특정한 메모리 자원을 보조 메모리 내의 빈 위치에 제공.
3) 재배치(Relocate): 한 보조 메모리 위치로부터 다른 위치로부터 특정한 메모리 자원을 이동.
보조 메모리 매니저는 메모리 배치 문제점을 해결하기 위해 상기 동작들 중 임의의 동작을 사용하도록 허용될 수 있다. 이러한 포괄적인 명령 리스트는 페이징 동작 동안에 보조 메모리 매니저에 의해 생성될 수 있으며 페이징 버퍼를 생성하도록 후에 스케줄러에 의해 사용될 수 있다. 보조 메모리 매니저는 재배치, 퇴거, 또는 페이지 인, 또는 그렇지 않으면 임의의 방법으로 이동 또는 변경되는 임의의 메모리 자원에 대한 명령 리스트 내에 엔트리를 생성할 수 있다. 이 점에서, 본 발명의 다양한 실시예들은 명령 리스트에 다음의 필드들을 제공할 수 있다.
Handle 재배치를 위한 메모리 자원의 핸들링
SegmentId 메모리 자원이 현재 위치한 세그먼트에 대한 세그먼트 식별자
PhysAddress 메모리 자원들의 현재의 세그먼트 내의 현재의 물리적인 어드레스
NewSegmentId 자원들이 이동될 수 있는 세그먼트에 대한 세그먼트 식별자
NewPhysAddress 자원들이 이동될 수 있는 새로운 세그먼트 내의 새로운 물리적인 어드레스
페이징 버퍼 생성
상술한 명령 리스트를 사용하여, 스케줄러는 명령들을 실행하도록 페이징 버퍼를 생성할 수 있다. 본 발명에 관하여 사용하기 위한 페이징 버퍼의 다양한 실시예들은 도 7에 도시된 바와 같이 구현될 수 있다.
도 7에 도시된 바와 같이, 몇몇의 명령들은 그들이 실행될 수 있기 전에 프리 프로세싱을 필요로 하지만, 다른 명령들은 프리프로세싱 없이 핸들링될 수 있다. 프리프로세싱은 워커 쓰레드에 포함하는 임의의 수의 방법들로 행해질 수 있다. 페이징 버퍼의 일부가 프로세싱될 때까지 프리프로세싱 명령들에서 대기할 필요가 있을 수 있음을 알아야 한다. 도 7에 도시한 모델에서, 워커 쓰레드는 페이징 버퍼를 준비하고 이 페이징 버퍼를 위한 CPU 프리프로세싱을 처리한다. 페이징 버퍼의 동작 이전에 CPU 프리프로세싱이 요구될 때, 워커 쓰레드는 코프로세서 내의 페이징 버퍼 상의 동작들을 차단한다. 다음에, 동작을 완료하도록 다시 페이징 버퍼를 재시작하기 전에 CPU 요청을 제시한다.
따라서, 명령 리스트 내의 각각의 명령에 대해, 다음의 동작들이 적절할 수 있다.
페이징 버퍼 생성 시에 프리프로세싱,
페이징 버퍼 내의 싱크 포인트에서 CPU 프로세싱,
메모리 자원들을 이동시키는 "블릿(Blint)" 명령,
페이징 버퍼가 완료되면 CPU 작업을 포스트 프로세싱.
가능한 동작의 상기 리스트를 참조하여, 페이징 버퍼 그 자체는 CPU가 몇몇의 작업을 핸들링하는 동안 코프로세서가 중단할 것을 요청하는 명령들을 포함할 수 있다. 인터럽트를 생성하고 코프로세서를 스톨(stall)시키는 이러한 명령은 본 명세서에서 "블러킹 펜스(blocking fence)"로서 지칭될 것이다. 페이징 버퍼 내의 임의의 명령은 블러킹 펜스로 프리픽스(prefix)되거나 포스트픽스(post-fix)될 수 있다. 인터럽트들은 바람직하지 않기 때문에, CPU가 코프로세서를 인터럽트시킬 수 있는 횟수가 포스트 오퍼레이션 펜스(post operation fences)들을 버퍼의 말단에 결합함으로써 감소될 수 있다. 포스트 오퍼레이션 펜스들(또는 "포스트-펜스들")이 버퍼의 말단 이전에 요구되는 경우들이 스케줄러에 의해 검출될 것이며 실행되는 포스트 펜스를 필요로 하는 명령의 프리오퍼레이션 펜스와 병합될 것이다.
보조 메모리의 일관성(coherency)을 유지하기 위해, 페이징 버퍼의 프로세싱 시에 인터럽트들을 벗어나지 않도록 하는 것이 유리할 수 있음을 알아야 한다. 따라서, 페이징 버퍼가 완전히 실행되기 전에 다수가 만료된다면, 페이징 버퍼는 완료될 때까지 코프로세서의 제어를 유지하도록 허용될 수 있다.
페이징 버퍼 내의 펜스의 핸들링을 포함하는 워커 쓰레드의 위치를 차지할 수 있는 이벤트들의 체인을 나타내는 의사 알고리즘에 대해 도 8을 참조한다. 도 8과 관련하여, 다음의 테이블은 명령 리스트 내에서 발생할 수 있는 일반화된 명령들의 리스트, 및 프리프로세싱, 페이징 버퍼 생성, 및 생성될 수 있는 임의의 터미네이션 펜스(termination fence)에 기초한 명령의 형태의 가능한 파생물을 제공한다. 다음의 테이블은 단지 유용한 예로서 제공되는 것이며, 그 명령들과 관련하여 발생할 수 있는 가능한 명령들의 형태 또는 동작들의 포괄적인 리스트를 의도하는 것은 아니다.
보조 메모리로부터 다른 보조 메모리 위치로 이동 프리프로세싱:없음.페이징 버퍼에서:전송이 하드웨어로 행해진다면,드라이버는 페이징 버퍼 내에 블릿을 추가 할 수 있다.전송이 소프트웨어로 행해진다면,현재의 페이징 버퍼를 플러싱. 플러싱되면,CPU 상의 전송으로 진행페이징 버퍼의 터미네이션 펜스에서:없음.
보조 메모리로부터 애퍼쳐로 이동 프리프로세싱:이동되는 보조 메모리 자원들을 소유하는 프로세스에 부가;시스템 메모리 버퍼 MmProbeAndLock 및 로킹된 페이지들에 대해 MDL을 얻음;MmProbeAndLock 페이지에 폴트가 발생하면,소프트웨어에서 블릿을 핸들링;프로세스로부터 분리;할당된 애퍼쳐 위치가 현재 비지가 아니고 현재 명령 전의 명령 리스트에 명령이 존재하지 않는다면,애퍼쳐 레인지를 조정생성된 MDL을 갖는 애퍼쳐를 프로그래밍애퍼쳐가 프로그래밍되었음에 유의 페이징 버퍼에서,애퍼쳐가 프리프로세싱단에서 프로그래밍되지 않았다면,현재의 페이징 버퍼를 플러싱. 플러싱 후에, 프로그램 MDL을 애퍼쳐로 프로그래밍. 페이징 버퍼 프로세싱 계속전송이 하드웨어로 행해지면,드라이버가 페이징 버퍼 내에 블릿을 추가할 것임전송이 소프트웨어로 행해지면,현재의 페이징 버퍼를 플러싱. 플러싱 후에, CPU를 사용하여 메모리를 전달. 페이징 버퍼 프로세싱을 계속 페이징 버퍼의 터미네이션 펜스에서:없음.
애퍼쳐로부터 보조 메모리로 이동 프리프로세싱:이동되는 보조 메모리 자원들을 소유하는 프로세스에 부가;시스템 메모리 버퍼 MmProbeAndLock 및 로킹된 페이지들에 대해 MDL을 얻음;MmProbeAndLock 페이지에 폴트가 발생하면,소프트웨어에서 블릿을 핸들링;프로세스로부터 분리;할당된 애퍼쳐 위치가 현재 비지가 아니고 현재 명령 전의 명령 리스트에 명령이 존재하지 않는다면,애퍼쳐 레인지를 조정생성된 MDL을 갖는 애퍼쳐를 프로그래밍애퍼쳐가 프로그래밍되었음에 유의
페이징 버퍼에서,애퍼쳐가 프리프로세싱단에서 프로그래밍되지 않았다면,현재의 페이징 버퍼를 플러싱. 플러싱 후에, 프로그램 MDL을 애퍼쳐로 프로그래밍. 페이징 버퍼 프로세싱 계속전송이 하드웨어로 행해지면,드라이버가 페이징 버퍼 내에 블릿을 추가할 것임전송이 소프트웨어로 행해지면,현재의 페이징 버퍼를 플러싱. 플러싱 후에, CPU를 사용하여 메모리를 전달. 페이징 버퍼 프로세싱을 계속 페이징 버퍼의 터미네이션 펜스에서:애퍼쳐 레인지가 버퍼 내의 다른 동작에 의해 이미 재생되지 않았다면,애퍼쳐 레인지를 언매핑;면을 소유하는 프로세스로부터 부가;시스템 메모리 버퍼 MmUnlock;프로세스로부터 분리
보조 메모리로부터 퇴거 비디오로부터 애퍼쳐로의 이동과 동일한 프로세스. 페이징 버퍼의 터미네이션 펜스 시에 애퍼쳐 레인지가 언매핑되는 것을 제외
애퍼쳐로부터 퇴거 프리프로세싱:애퍼쳐 레인지가 비지가 아니라면,애퍼쳐 레인지 언매핑;면을 소유하는 프로세싱에 부가;시스템 메모리 버퍼 MmLock프로세스로부터 분리 페이징 버퍼에서:없음 페이징 버퍼에 대한 터미네이션 펜스에서:애퍼쳐 레인지가 임의의 이전 동작에 의해 아직 언매핑되지 않았다면,애퍼쳐 레인지 언매핑;면을 소유하는 프로세스 부가;시스템 메모리 버퍼 MmUnlock프로세스로부터 분리
본 명세서에서 제공되는 스케줄링 모델은 코프로세서가 비지를 유지하도록 사소하지 않은 CPU 프로세싱의 상당량을 필요로 할 수 있음을 알아야 한다. 이러한 작업은 적어도 일부에서 오늘날 존재하는 코프로세서 하드웨어의 능력에 의해 필수적이다. 장래의 그래픽 하드웨어는 보다 강력한 메모리 가상화 및 코프로세서 스케줄링을 갖도록 설계될 것이다. 이러한 점에서, 여러 진보가 이루어졌으며 본 발명과 관련하여 또한 개시될 것이다. 각각의 하드웨어 능력에 대해, 우리는 상술한 스케줄링 모델에 대한 향상에 대한 동기 및 영향을 설명하고 있다. 임의의 향상들이 특정한 구현 시도를 기초로 제공된다. 이러한 시도들 모두가 임의의 미래 모델에서 필수적으로 지원되는 것은 아니지만, 특정한 시도가 실현되는지 그리고 실현될 때 그 구현 시도에 대한 향상을 채택하기 위한 기준을 제공하도록 다양한 향상이 본 명세서에서 기술된다.
인터럽트가능 하드웨어
코프로세서 스케줄링의 신뢰도를 증가시키기 위해, 코프로세서는 전체 DMA 버퍼보다 미세한 단위(granularity)로 인터럽트되는 것을 지원할 수 있다. 예를 들어, 코프로세서 및 지원 하드웨어는 단지 트라이앵글을 프로세싱하기 이전 또는 이후 대신에 트라이앵글의 프로세싱 내에서의 인터럽트를 지원할 수 있다.
이러한 인터럽트가능 하드웨어의 다양한 실시예들에서, 양호한 설계 시도는 자동 절약을 통해 코프로세서의 잠재적으로 완전한 가상화를 제공하고 보조 메모리로의 코프로세서 컨텍스트의 재저장을 제공할 수 있다. 각각의 코프로세서 컨텍스트는 예시적으로 (제한하려는 것은 아님) 전용 어드레스 공간(private address space), DMA 버퍼가 누적되는 전용 링 버퍼, 및 코프로세서 컨텍스트가 실행중이 아닐 때 하드웨어의 상태가 저장되는 메모리의 전용 단편을 구비한다. 이러한 셋팅에서 컨텍스트 스위치를 지원하기 위해, 스케줄러는 저장된 컨텍스트의 보조 메모리 내의 물리적인 어드레스를 메모리 매핑 레지스터를 통해 코프로세서에 제공한다. 다음에 코프로세서는 그 코프로세서 컨텍스트를 로딩하여, 모든 메모리 자원들이 유효한지를 확인하고, 다음에 링 버퍼에 누적된 DMA 버퍼들을 실행하고, 그들이 발생함에 따라 필요한 자원들을 폴팅(faulting)한다.
상술한 바와 관련하여, 또한 커널 모드 드라이버가 실행되지 않는 코프로세서 컨텍스트들의 상태를 질의하는 것이 가능할 수 있다. 이는 저장된 컨텍스트를 조사함으로써, "런 리스트" 이벤트 트레이스(event trace)(후술됨)를 사용함으로써, 또는 임의의 질의 수단에 의해 행해질 수 있다. 이 점에서, 드라이버는 (1) 왜 코프로세서가 특정한 컨텍스트(예를 들어, 비어 있는, 새로운 런 리스트, 페이지 폴트)로부터 먼 가장 최근에 스위칭하였는지에 대한 이유; (2) 하드웨어 (면 수준 폴팅이 지원된다면)에 의해 사용되는 메모리 자원의 리스트; (3) 폴팅 어드레스 (페이지 수준 폴팅이 지원된다면); 및 (4) 특정한 컨텍스트가 실행된 코프로세서 클럭 주기의 수와 같은 유용한 정보를 판정할 수 있다.
더욱이, 커널 모드 드라이버는 또한 새로운 DMA 버퍼들을 현재 실행되지 않은 컨텍스트의 링으로 삽입할 수 있다. 또한, 저장된 컨텍스트로, 링의 위치, 페이지 테이블, 또는 그 컨텍스트 내에 저장된 임의의 다른 물리적인 메모리 참조들을 변경할 수 있다. 이러한 변경은 예를 들어, 메모리 내의 자원들의 이동에 따라 요구될 수 있다.
코프로세서 컨텍스트 단위 가상 어드레스 공간
상술한 기본 스케줄링 모델의 몇몇 복잡성은 코프로세서 컨텍스트들이 공통 코프로세서 어드레스 공간을 공유한다는 사실로 인한 것이다. 이러한 어드레스 공간의 가상화는 슬리커 시스템(sleeker system)을 위해 제공될 수 있다. 어드레스 공간의 가상화 시에, 보조 메모리 매니저는 주위의 메모리를 이동시키고 보조 메모리 전체로부터 자원들을 퇴거시킬 수 있다. 이는 그 수명 동안에 자원에 대해 실제 코프로세서 가시 어드레스가 변경될 수 있다는 것을 의미한다. 따라서, 사용자 모드에서 구축된 명령 버퍼는 명령 버퍼가 실행을 위해 스케줄링될 때까지 어드레스가 알려지지 않을 수 있기 때문에 그 어드레스에 의해 직접 할당을 참조할 수 없다.
예를 들어, 상술한 기본 스케줄링 모델의 다음의 엘리먼트들은 코프로세서 컨텍스트 단위 어드레스 공간의 사용자를 통해 제거될 수 있다.
1) 실제 메모리 위치들로 핸들들을 대체함으로써 명령 버퍼를 패칭 (Patching)
2) 메모리 억세스를 위해 명령 버퍼를 유효화(Validating)
3) 커널 모드에서 메모리 자원 리스트들을 구축
4) 개별적인 명령 및 DMA 버퍼들을 생성
5) 인터럽트된 DMA 버퍼들을 위한 자원들을 프리-인터럽션 위치(pre-interruption location)로 제공
코프로세서 컨텍스트 단위 가상 어드레스 공간 제공 시에, 특정한 코프로세서 컨텍스트 내의 할당은 그 컨텍스트의 어드레스 공간 내에서 그 자신의 유일한 어드레스를 얻을 수 있다. 이 어드레스는 할당의 수명 동안에 변화하도록 요구되지 않는다. 따라서, 명령 버퍼들은 그 어드레스들을 직접 참조하고 패칭을 필요로 하지 않을 수 있다. 유효화되어 DMA 버퍼로 복사되는 명령 버퍼들을 가질 필요가 또한 사라진다. DMA 버퍼 내의 메모리 참조들이 코프로세서의 가상 어드레스 공간 내에 있으며, 어드레스 공간은 실제로 임의의 코프로세서 컨텍스트에 대해 전용이므로, 유효화를 위해 메모리 참조를 유효화하며 따라서 어플리케이션에서 보이지 않는 DMA 버퍼 내의 명령 버퍼의 유효화된 컨텐트를 숨길 필요가 없다. 할당에 의해 또는 퇴거된 할당에 의해 점유되지 않은 어드레스 공간들 (핸들 또는 실제 어드레스)은 하드웨어에 의해 더미 페이지로 리다이렉트되거나 억세스 폴트를 발생시킨다. 이는 억세스가 가정되지 않은 메모리에 대한 억세스를 컨텍스트가 가질 필요가 없기 때문에 커널 모드 메모리의 보안성을 유지할 것이다.
코프로세서 컨텍스트 단위 가상 어드레스 공간들의 장점들 중 몇몇은 다음과 같다. 각각의 할당은 할당 시간에 코프로세서 가시 어드레스(또는 핸들)를 얻는다. 명령 버퍼는 존재하지 않는다. DMA 버퍼들은 사용자 모드 드라이버에 직접 보여지며 사용자 모드 드라이버에 의해 채워진다. DMA 버퍼들은 사용하는 할당의 어드레스들 (또는 핸들들)을 직접 참조한다. 페이징을 위해 사용되는 자원 리스트들은 사용자 모드 드라이버에 의해 구축될 수 있다.
도 3에 도시된 바와 같이 본 발명의 다양한 실시예들에 대한 모델 및 대응하는 설명을 상기한다. 이 모델은 인터럽트가능 하드웨어 및/또는 코프로세서 컨텍스트 단위 가상 어드레스 공간들을 사용하여 보다 향상될 수 있다. 이 점에서, 다음의 섹션들은 본 발명의 부가적인 진보에 의해 보다 향상되는 것을 제외하고는 도 3과 유사한 개념을 기술하고 있다.
면 할당 및 할당해제
진보된 모델에서, 커널 모드 내의 비디오 메모리 매니저 "VidMm"과 같은 보조 메모리 매니저는 코프로세서 컨텍스트들을 위한 가상 어드레스 공간을 제공할 수 있으며, 다양한 코프로세서 컨텍스트들 사이에서 물리적인 메모리를 관리할 수 있어 이들은 공정한 메모리의 공유를 얻을 수 있다. 기본 모델의 할당 기법에 대한 향상의 다양한 실시예들이 도 9에 도시되어 있다. 도 9는 본 기술 분야에서 인식되는 개념들에 대응하기 때문에 본 기술분야에 숙련된 자에게 친숙할 전문용어를 사용하여 본 발명의 실시예를 나타내고 있다. 예를 들어, "VidMm"은 비디오 메모리 매니저이고, "Thunk interface"는 썽크 인터페이스이다. 그러나, 이러한 전문용어는 본 발명을 보다 명확하게 설명하기 위해 사용되지만, 이는 본 발명을 제한하려는 표현을 의도한 것은 아니다. 따라서, "VidMm"은 임의의 보조 메모리를 위한 메모리 매니저일 수 있으며, "Thunk interface"는 임의의 적절한 인터페이스 등일 수 있다.
도 9와 관련하여, 진보된 모델은 DMA 버퍼들이 어플리케이션의 어드레스 공간으로 직접 매핑되도록 하는데, 선택적으로 사용자 모드 드라이버에 의해 직접 억세스가능하게 한다. 사용자 모드 드라이버는 억세스할 필요가 있는 각각의 메모리 자원의 영구적인 가상 어드레스 또는 핸들을 사용하여 DMA 버퍼로 직접 렌더링 프리미티브들(rendering primitives)을 일괄처리한다.(그래서 패칭이 요구되지 않음) 또한, 사용자 모드 드라이버는 DMA 버퍼가 사용중인 메모리 자원들의 리스트를 구축하여 보조 메모리 매니저가 DMA 버퍼가 스케줄링되기 전에 그것을 보조 메모리에 제공할 수 있다. 악의적인 어플리케이션이 자원 리스트를 변경한다면, 올바른 자원 세트가 적절하게 페이지 인되지 않을 것이다. 이는 유효한 메모리를 참조하지 않고 있는 어드레스 공간의 범위가 더미 메모리 페이지를 참조하거나 하드웨어가 고장나서 특정 코프로세서 컨텍스트의 실행을 중단시키도록 요구될 수 있기 때문에 메모리 보호 모델을 필수적으로 중단시키지 않음을 알아야 한다. 어느 경우에도, 손상된 자원 리스트는 다른 컨텍스트의 메모리를 억세스할 수 있는 코프로세서 컨텍스트를 발생시킬 필요가 없다.
진보된 모델에서, 사용자 모드 드라이버는 DMA 버퍼를 스케줄러에 제시하는 커널 모드 드라이버에 DMA 버퍼를 제시한다. 자원 리스트 내의 자원들을 페이징하는 메모리 매니저를 요청한 후에, 스케줄러는 DMA 버퍼를 하드웨어에 전달한다.
진보된 모델의 스케줄링
진보된 모델의 스케줄링은 기본 모델의 스케줄링과 매우 유사하다. 여전히 DMA 버퍼가 코프로세서에 제시되기 전에 DMA 버퍼를 준비하는 워커 쓰레드가 존재한다. 그러나, 진보된 모델의 워커 쓰레드에 의해 이루어질 수 있는 작업은 오로지 페이징 동작만으로 제한될 필요가 있다.
기본 모델에서의 스케줄링과 진보된 모델에서의 스케줄링의 실시예들에 대한 도 10 및 도 11을 참조한다. 다음에서 명확하게 되는 바와 같이, 진보된 모델은 2개의 스케줄링 옵션을 갖는다. 디맨드 폴팅없이 스케줄링할 때, 프리퍼레이션 페이스(preparation phase)가 구현될 수 있다. 그러나, 진보된 모델이 디맨드 폴팅을 사용할 때, 프리퍼레이션 페이스는 필요하지 않다.
또한, 도 12a, 도 12b 및 도 12c는 진보된 스케줄링 모델을 구현할 수 있는 의사 코드를 설명하는 플로우차트를 제공한다.
진보된 모델의 페이징
진보된 모델의 페이징은 기본 모델의 페이징과 다르다. 진보된 모델에서, 페이징되는 할당의 어드레스는 이미 알려져 있으며, 메모리 매니저는 간단히 유효하게 할 필요가 있다. 자원 리스트의 할당을 유효하게 하기 위해, 메모리 매니저는 비어있는 물리적인 보조 메모리의 범위를 찾고 드라이버에 페이지 테이블을 매핑할 것을 요청하거나 그 범위를 핸들링할 필요가 있다. 필요하다면, 물리적인 메모리의 범위는 연속적인 세트의 페이지들이 존재하도록 요구될 수 있다.
할당을 유효하게 하는데 이용가능한 물리적인 비디오 메모리가 충분하지 않다면, 본 명세서에서는 VidMm으로 지칭되는 보조 메모리 매니저는 퇴거를 위해 몇몇의 현재 유효한 할당을 마킹할 수 있다. 할당이 퇴거될 때, 그 컨텐트는 시스템 메모리에 전송되고 (이미 시스템 메모리에 존재하였다고 가정), 다음에 그 가상 어드레스 또는 핸들은 무효하게 된다.
가상 어드레스 공간
본 기술분야에 공지되어 있거나 가상 어드레스 공간을 제공하기 위한 장차 개발될 임의의 기술은 본 발명과 관련하여 사용될 수 있다. 이러한 어드레스 공간이 사용될 수 있는 방법들을 설명하기 위해, 공통 가상 어드레스 공간 기술들을 사용한 2개의 예들이 본 명세서에서 제공된다. 코프로세서를 위한 가상 어드레스 공간을 생성하는 여러 방법들이 존재하며, 본 기술분야에 숙련된 자는 본 명세서에서 제공된 예들로부터 추론할 수 있을 것이라는 것이 이해되어야 한다. 이 점에서, 가변 길이 플랫 페이지 테이블 및 멀티레벨 페이지 테이블을 사용한 가상 어드레스 공간이 본 명세서에 기술되어 있다.
가변 길이 플랫 페이지 테이블. 가변 길이 플랫 페이지 테이블과 관련한 본 발명의 사용이 도 13에 도시되어 있다. 이러한 방법에서, 코프로세서의 어드레스 공간은 플랫 페이지 테이블의 사용을 통해 가상화된다. 가상 어드레스 공간은 미리 정의된 메모리 량, 예를 들어, 4KB의 페이지들로 분할될 수 있다. 가상 어드레스 공간의 각각의 페이지에 대해, 연관된 물리적인 메모리의 물리적인 어드레스 및 위치(예를 들어, 그래픽 가속 포트(AGP), 주변 기기 상호접속(PCI), 또는 비디오)를 특정하기 위한 예를 들어, 64비트 엔트리들인 식별자들을 포함하는 페이지 테이블이 제공된다. 한 실시예에서, 코프로세서에 의해 지원되는 페이지 크기는 임의적이지 않으며 코프로세서 페이지 테이블이 시스템 메모리 페이지들을 참조하도록 하기 위해 4KB이어야 한다. 더욱이, 본 실시예에서, 코프로세서 페이지 테이블은 동일한 어드레스 공간으로부터 로컬 비디오 메모리 및 시스템 메모리 양자 모두를 어드레싱할 수 있어야 한다. 코프로세서는 단일 면에 속하는 모든 페이지들이 단일 형태의 메모리로 매핑되는 것이 필요할 수 있다. 예를 들어, 코프로세서는 특정한 렌더 타겟에 속하는 모든 페이지들은 로컬 비디오 메모리로 매핑되는 것을 필요로 할 수 있다. 그러나, 다양한 물리적인 메모리 타입들(AGP, 로컬 비디오 등)에 대한 면들로 매핑하는 페이지 테이블 엔트리들은 페이지 테이블에서 공존할 수 있다.
PCI 및 AGP 어댑터들을 위해, 각각의 페이지 테이블 엔트리의 예시적인 실시예는 32 비트를 포함할 수 있어, 전체 4GB 물리적인 어드레스 공간이 코프로세서에 의해 보여지게 된다. PCI-익스프레스 타입 어댑터를 사용한 실시예를 위해, 코프로세서는 64비트 어드레싱 주기를 지원할 수 있다. 각각의 페이지 테이블 엔트리는 테라바이트의 메모리를 각각 어드레싱하도록 40 이상의 비트를 포함할 수 있다. 마더보드 상의 물리적인 어드레스 라인의 40비트 이상 사용을 가능하게 하는 64비트 시스템을 구현하는 실시예는 대응하는 비디오 어댑터가 전체 어드레스 공간을 어드레싱할 수 없다면 성능 불이익을 겪을 수 있다. 따라서, 전체 64비트를 지원하는 것이 권고된다.
플랫 페이지 테이블 방법은 페이지 디렉토리가 존재하지 않는 것이고, 단지 거대한 페이지 테이블인 것을 제외하고는 INTEL 8086(x86)계열 CPU들 상에서 현재 이용가능한 가상 메카니즘과 유사하다.
유효 할당과 연관되지 않은 가상 어드레스들은 악의적인 DMA 버퍼가 허용되지 않은 코프로세서가 메모리를 억세스하는 것을 방지하도록 더미 페이지로 리다이렉트될 수 있다. 하드웨어는 엔트리가 유효한지를 특정하는 각각의 페이지 테이블 엔트리들에 유효 비트를 구현할 수 있다.
페이지 테이블은 연관된 코프로세서 컨텍스트가 코프로세서 상에서 현재 실행중이지 않을 때 재배치가능할 수 있다. 컨텍스트가 실행되지 않을 때, VidMm은 페이지 테이블을 시스템으로 퇴거시킬 수 있다. 컨텍스트가 다시 실행할 준비가 되어 있을 때, 페이지 테이블은 비디오 메모리로 다지 제공될 수 있지만, 잠재적으로 다른 위치이다. 드라이버는 저장된 코프로세서 컨텍스트 내의 페이지 테이블의 위치를 갱신할 수 있다.
본 실시예에서, 모든 메모리 억세스는 코프로세서 가상 어드레스를 통해 발생할 수 있다. 그러나, 본 발명이 이러한 억세스를 필요로 한다는 것을 암시하는 것은 아니다. 임의의 엘리먼트들이 다른 방법들로 억세스될 수 있으며, 다른 방법들로 억세스되면 향상된 기능을 제공할 수 있다. 가상 어드레스 기법을 제외한 항목들의 몇몇 예는 다음과 같다.
1) 페이지 테이블 그 자체가 물리적인 어드레스를 통해 참조될 수 있다.
2) 음극선관(CRT)이 연속적인 메모리 범위에 대한 물리적인 어드레스로 재프로그래밍될 수 있다.
3) 가상 프린트 엔진(VPE)은 물리적인 어드레스에 직접 DMA를 수행할 수 있다.
4)물리적인 어드레스로부터 오버레이가 직접 판독될 수 있다.
5) 코프로세서 컨텍스트가 물리적인 어드레스를 통해 참조될 수 있다.
6) 주 링 버퍼가 물리적인 어드레스를 통해 참조될 수 있다.
컨텍스트 스위치 동안에 코프로세서는 재저장된 컨텍스트에 의한 사용시 가상 어드레스를 재번역할 수 있음을 알아야 한다. 이는 코프로세서가 어드레스들이 컨텍스트 스위치 전과 동일한 물리적인 페이지를 참조하는 가정을 잠재적으로 틀리게 하는 대신에 메모리 자원들이 적절한 위치에 배치되는 것을 보장할 것이다. 또한, 본 발명의 다양한 실시예들과 관련하여, 단일 페이지 테이블 내 또는 다수의 페이지 테이블에 걸친 다수의 엔트리들이 동일한 물리적인 페이지를 참조하도록 하는데 이점이 있을 것임을 알아야 한다.
다양한 실시예들에서, 코프로세서는 페이지 테이블의 현재 크기를 제공하는 제한 레지스터를 구현할 수 있다. 페이지 테이블의 말단을 지난 임의의 메모리 참조는 코프로세서에 의해 무효한 억세스로 고려되어 다루어질 수 있다. 페이지 테이블은 2의 거듭제곱으로 확장가능할 수 있으며, 한 실시예에서는. 적어도 2GB의 어드레스 공간(2MB의 페이지 테이블)을 지원할 수 있다.
코프로세서 컨텍스트와 연관된 가상 어드레스 공간이 프레그먼트화되면, API, 예를 들어, MICROSOFT Direct3D Runtime은 어드레스 공간의 크기 및 연관된 페이지 테이블을 감소시키도록 가비지 수집(garbage collection)을 수행할 수 있다. 높은 가상 어드레스들의 할당이 삭제되어 낮은 어드세스들로 재할당될 것이다.
본 발명과 관련하여 가변 길이 플랫 페이지 테이블을 사용하여 가상 어드레스 공간을 구현하는 장단점은 본 기술분야에 숙련된 자에게 명백할 것이다. 요약하면, 플랫 페이지 테이블을 사용하는 한 장점은 물리적인 메모리에 대한 단지 한 레벨의 인다이렉션(indirection)이 존재하는 것이다. 다른 장점은 불연속적인 세트의 페이지들로 페이징이 해결될 수 있다는 것이다. 그러나, 단점이 존재한다. 예를 들어, 전체 페이지 테이블은 코프로세서가 실행될 때 일반적으로 메모리 내에 존재할 필요가 없을 것이다. 또한, 페이지 테이블은 다량의 메모리를 소모할 수 있다. 페이지 테이블은 일반적으로 메모리에 연속적인 세트의 메모리를 필요로 하기 때문에 배치하기가 힘들 수 있다.
멀티레벨 페이지 테이블. 멀티레벨 페이지 테이블과 관련한 본 발명의 사용이 도 14에 도시되어 있다. 멀티레벨 페이지 테이블은 일반적으로 가변 길이 플랫 페이지 테이블과 유사할 수 있지만, 멀티레벨 페이지 테이블에서, 가상 어드레스의 인덱스 부는 다수의 테이블로 분해된다. 예를 들어, 다양한 실시예들은 32비트 어드레스 공간을 사용할 수 있다. 이러한 상황에서, 하드웨어는 2 레벨 인다이렉션을 가지도록 요구될 수 있다. 인다이렉션의 제1 레벨은 페이지 디렉토리로서 지칭되며 제2 레벨은 페이지 테이블로서 지칭된다. 코프로세서가 특정한 컨텍스트를 실행할 때, 자원 리스트 내의 할당에 의해 요구되는 그 컨텍스트 및 페이지 테이블을 위한 페이지 디렉토리만이 메모리 내에 존재할 필요가 있다.
본 발명과 관련하여 다수의 레벨 페이지 테이블이 페이징하는 것을 제공하는 장점들 중 하나는 불연속적인 세트의 페이지들로 해결될 수 있다는 것이 인식될 것이다. 또한, 할당은 시스템 및 로컬 비디오 메모리, 단지 페이지 디렉토리로부터 페이지들을 혼합할 수 있으며, 사용중인 페이지 테이블은 메모리에 존재할 필요가 있고, 페이지 디렉토리 및 페이지 테이블은 단지 각각 하나의 페이지를 필요로 한다. (다수의 연속 페이지 할당이 요구되지 않는다) 그러나, 이러한 장점들에도 불구하고, 메모리에 대한 억세스가 2개의 인다이렉션을 필요로 하는 단점이 남아 있다.
면 레벨 폴팅
프리-코프로세서 컨텍스트 가상 어드레스 공간의 추가로, 특히 메모리 압박이 거의 존재하지 않을 때, 진보된 스케줄링 모델은 무리없이 동작하며 일반적으로 훨씬 많은 CPU 부하를 필요로 하지는 않는다. 대부분의 시간에, DMA 버퍼가 스케줄러에 지시될 수 있을 때, 그것이 참조하는 자원들은 메모리 내에 이미 존재하며 따라서 DMA 버퍼는 페이징 쓰레드에 의한 임의의 페이징을 필요로 하지는 않는다. 그러나, 스케줄링의 관점에서, 모델은 시간 유지의 정확도를 증가시킴으로써 더 향상될 수 있다.
본 발명을 구현할 때 발생하는 한 문제점은 얼마나 길게 특정한 DMA 버퍼가 실행할 수 있는지를 아는 것이 불가능할 수 있다는 것이다. 이는 준비하는 다음의 DMA 버퍼에 대한 스케줄러에 의한 잠재적인 좋지 않은 선택을 야기할 수 있다. 다른 컨텍스트가 현재의 컨텍스트와 동일한 또는 보다 높은 우선순위에 있거나, 그 우선순위의 다른 컨텍스트가 비어있다면, 스케줄러는 현재의 컨텍스트로부터 다음의 DMA 버퍼를 선택할 수 있다. 그렇지 않으면, 스케줄러는 현재의 컨텍스트와 동일하거나 높은 우선순위의 다음 컨텍스트로부터 다음의 DMA 버퍼를 선택할 수 있다. 그러나, 이 선택은 정확성이 보장되지는 않는다. 다음의 가장 높은 우선순위 컨텍스트로부터 DMA 버퍼를 선택할 때, 스케줄러는 현재의 컨텍스트에 대한 DMA 버퍼가 하나의 분량보다 길게 실행될 것이라는 것을 가정할 수 있다. 이 경우가 존재하지 않는다면, 스케줄러는 너무 즉각적이지 않게 그 하드웨어 컨텍스트로부터 멀리 스위칭할 수 있다. 현재의 DMA 버퍼가 한 분량보다 적게 실행되는 경우에, 스케줄러는 현재의 컨텍스트로부터 다음의 DMA 버퍼를 선택해야 한다. (이는 코프로세서의 효율적인 사용을 최대화하기 때문임)
메모리 압박이 아주 적거나 거의 없을 때, 일반적으로 다음의 DMA 버퍼에 대한 잠재적인 양 후보들은 이미 메모리 내에 존재하는 그들의 모든 자원들을 가질 수 있어, 이들 중 어느 누구도 페이징을 필요로 하지 않기 쉽다. 이 시나리오에서, 스케줄러는 제1 DMA 버퍼의 분량이 끝나고, 즉시 변화하여, 코프로세서에 올바른 DMA 버퍼를 제공할 때 실수할 수 있다.
그러나, 메모리 압박하에서, 모델은 덜 안정적일 수 있다. 다음의 DMA 버퍼의 "사이징(sizing)"은 부드러운 동작을 보장하는 유리한 단계가 될 수 있다. 메모리 압박하에서, 이미 기술된 시나리오에서, 다음의 DMA 버퍼에 대한 2개의 잠재적인 후보들 중 하나는 몇몇의 페이징을 필요로 하여 프리퍼레이션 쓰레드로 전송되었다. 이 경우에, 일반적으로 스케줄러가 마지막 순간에 "변심"하여 2개의 DMA 버퍼를 스왑(swap)하지 않도록 권고하지 않는다. 그러나, 이러한 변화가 이루어질 수 있으며, 이러한 실시는 본 발명의 기술에서 벗어나 있지 않다. 예를 들어, DMA 버퍼의 준비가 완료되어 다른 잠재적인 DMA 버퍼 후보가 페이징을 필요로 하지 않는 시나리오에서, DMA 버퍼는 스왑핑(swapping)될 수 있다. 이는 보조 메모리 매니저에 의해 공유가능한 할당에 대한 몇몇의 특수한 지원을 수반할 수 있다.
상술한 에러를 유지하는 잠재적인 시간은 그 자체로 매우 나쁘지는 않지만 후속 분량 동안에 손실되는 프로세싱 타임에 컨텍스트를 제공함으로써 동작될 수 있다. 또한, 대부분의 경우에, DMA 버퍼는 다수의 코프로세서 분량에 대한 실행에 충분한 명령을 포함하여, 각각의 컨텍스트는 그 전체 분량을 얻을 수 있다. 그러나, 메모리 압박하에서, 보조 메모리 매니저는 보다 작은 버퍼들로 (상술한 바와 같이)DMA 버퍼들을 분할하여, 각각의 컨텍스트의 동작 세트를 감소시키도록 강제될 수 있다. 이러한 DMA 버퍼들의 분할은 DMA 버퍼들의 크기를 감소시키고 대응하여 상술한 분량 문제점을 증가시킨다.
메모리 압박하에서 발생할 수 있는 다른 문제점은 DMA 버퍼에 의해 실제로 사용되는 것보다 잠재적으로 많은 메모리 페이지 인으로 인해 인공적으로 추가 압박으로 발생시킬 수 있다는 점이다. 페이지 인되는 모든 추가 메모리는 다음 분량 이전에 잠재적으로 퇴거되어 다시 페이지 인될 필요가 있을 것이다. 이는 페이징 동작이 이미 높은 때 페이징 동작을 향상시키도록 유도할 수 있다. 기본 및 진보 모델에서, 보조 메모리 매니저는 적절한 퇴거 정책을 선택함으로써 증가된 페이징 문제점을 어드레싱할 수 있다. 예를 들어, 약한 메모리 압박하에서는, 각각의 컨텍스트는 작업 설정 시 공평한 양의 메모리를 갖도록 될 수 있다. 다른 컨텍스트들로부터의 메모리 퇴거 이전에, 보조 메모리 매니저는 먼저 현재의 컨텍스트로부터의 메모리 퇴거를 시도하여, 이용가능한 작업 설정이 되도록 DMA 버퍼를 분할할 수 있다. 일단 특정한 컨텍스트의 DMA 버퍼가 최소 크기로 분할되면, 보조 메모리 매니저는 다른 컨텍스트로부터 메모리를 제외하고는 선택의 여지가 없을 수 있다.
이러한 이슈들을 해결하는 한가지 양호한 시도는 코프로세서에 의해 요구되는 메모리의 디맨드 폴팅을 허용하는 것이다. 이 방법은 코프로세서에 의해 요구되는 메모리의 서브셋만이 메모리에 존재하는 것이 보장될 수 있다.
진보된 모델을 위해 제안되는 폴팅의 레벨은 면 단위이다. 그러나, 본 발명과 관련한 사용을 위해 임의의 레벨의 폴팅이 적절할 수 있다는 것이 이해되어야 한다. 또한, 페이지 테이블 하드웨어의 경우에, 하드웨어는 할당의 제1 페이지 상태만을 참조하여 할당이 유효한지를 판정하는데 이는 보조 메모리 매니저가 한번에 메모리로 전체 할당을 제공할 수 있기 때문이다.
다양한 실시예들에서, 하드웨어는 다음 중 어느 하나일 때 페이지 폴트를 발생시킬 수 있다.
1) 컨텍스트 스위치가 무효 링 버퍼 또는 DMA 버퍼를 참조하는 컨텍스트를 발생시킴.
2) 프리미티브가 유도되고 요구되는 메모리 자원들의 몇몇이 존재하지 않음 (예를 들어, 버텍스 세이더 코드, 버텍스 버퍼, 텍스쳐).
제2 상황에서, 하드웨어는 각각의 트라이앵글을 렌더링하기 전에 그 현재의 메모리 자원들을 리샘플링(resampling)하도록 요구받을 수 있음을 알아야 한다. 이는 코프로세서가 실행될 때를 포함하여 임의의 시간에 보조 메모리 매니저가 가상 어드레스 또는 핸들을 무효화하는 것을 가능하게 한다. 또한, 하드웨어는 현재 사용중인 모든 메모리 자원들의 질의를 허용할 수 있다. 보조 메모리 매니저는 특정한 할당이 하드웨어에 의한 사용에서 이루어지는 때를 판정하는 정보를 사용할 수 있다. 보조 메모리 매니저는 할당이 그 가상 어드레스 또는 무효화된 핸들을 가진 후에, 코프로세서에 의해 현재 사용중인 자원들의 리스트를 사라지게 하면, 코프로세서가 그 할당을 억세스할 수 없기 때문에 그 할당을 퇴거시키는 것이 안전하다는 것을 가정할 수 있다. 이와 같이 수행되는 시도는 페이지 폴트를 발생시킨다.
본 발명과 관련한 면 레벨 폴팅의 사용에 대한 추가 설명이 면 레벨 폴팅 모델의 다음의 보다 상세한 설명에 의해 제공된다. 다음의 모델은 몇몇의 실시예들의 예이며, 본 발명의 잠재적인 사용 또는 본 명세서에서 제공된 스케줄링 모델의 컨텍스트 이외의 다른 어플리케이션들과 관련한 면 레벨 폴팅의 개념에 대한 제한으로서 구성된 것은 아니다.
첫째, 메모리 자원들을 위한 할당 기법은 본 명세서의 코프로세서 컨텍스트 단위 가상 어드레스 공간부에 기술된 바와 동일할 수 있다. 그 부분을 상세히 참조한다.
둘째, DMA 버퍼 및 자원 리스트에 대한 렌더링 명령 기법은 또한 본 명세서의 코프로세서 컨텍스트 단위 가상 어드레스 공간 부분에 설명된 바와 동일하다. 이 모델에서, 자원 리스트는 그래픽 하드웨어가 명 레벨 폴팅을 지원해도 여전히 필요하다. 보조 메모리 매니저(본 명세서에서, "VidMm")는 메모리 할당에 대한 사용 정보를 획득하기 위해 자원 리스트를 사용한다. 사용자 정보는 VidMm이 메모리에 공간이 필요할 때 퇴거 후보를 판정하도록 한다.
면 레벨 폴팅의 추가로, 자원 리스트에 관한 보안 문제는 존재하지 않으며, 따라서 사용자 모드가 구축될 수 있다. 악의적인 어플리케이션이 자원 리스트에 무효한 데이터를 넣는다면, 발생할 수 있는 최악의 경우는 악의적인 어플리케이션의 수행이 어려워지는 것이다. VidMm은 퇴거 후보들에 대한 불합리한 선택을 가능하게 하여, 어플리케이션에 대한 추가 페이징 동작을 야기한다.
면 디맨드 폴팅을 갖는 스케줄링 모델은 면 레벨 폴팅을 채용하지 않은 모델들과 여러 면에서 다를 수 있다. 일반적으로, 준비된 리스트 내의 프로세스들은 코프로세서에 직접 제시될 수 있어, 프리퍼레이션 페이스는 요구되지 않는다. 스케줄러는 페이지 폴트가 해결되는 것을 필요로 하는 컨텍스트들을 위해 전용 리스트와 페이징 쓰레드를 유지할 수 있다. 페이징 동작을 위해 사용되는 VidMm-특정 코프로세서 컨텍스트가 존재한다. 최종적으로, 컨텍스트들에 제시된 DMA 버퍼들은 단일 작업 항목을 형성하도록 연결된다.
이러한 모델에서, 프리퍼레이션 페이스는 제거될 수 있다. 스케줄러는 한 컨텍스트로부터 다른 것으로 직접 코프로세서가 스위칭하도록 요청할 수 있으며, 이는 모든 컨텍스트가 임의의 시간에 실행을 위해 준비가 되어 있다는 것이 가정될 수 있다. 스위칭되는 컨텍스트가 메모리에 제공된 그 메모리 자원들 모두를 갖지 않는다면, 하드웨어가 폴트될 수 있어, 컨텍스트는 리스트에 추가되어 (도 15를 참조하면, 인페이지 리스트) 페이징 쓰레드가 폴트를 해결할 때 동작을 개시할 수 있다.
본 모델과 관련하여 스케줄러에 의해 유지되는 예시적인 프로세스의 리스트가 도 15에 도시되어 있다. 도 15를 참조하면, 폴트가 발생할 때, 폴트를 야기하는 컨텍스트는 인페이지 리스트에 추가될 수 있다. 페이징 쓰레드는 다음에 폴트를 해결할 수 있다. 이 페이징 쓰레드는 먼저 해결을 위해 폴트된 가장 높은 우선순위의 컨텍스트를 선택할 수 있다. 주기적인 우선순위 상승은 낮은 우선순위 컨텍스트들이 그들의 폴트를 해결하기에 충분히 높은 우선순위를 얻을 수 있게 보장하도록 채용될 수 있다. 인페이지 워커 쓰레드에 의해 오류가 해결하면서, 스케줄러는 코프로세서 상에 실행을 위해 준비된 보다 많은 컨텍스트들을 스케줄링할 수 있다. 코프로세서가 작업하는 동안, 인페이지 워커 쓰레드는 어드레스들로부터의 할당에 매핑 또는 언매핑하도록 드라이버를 호출함으로써 비디오 메모리를 조작할 수 있다.
코프로세서에 의해 현재 사용되는 할당이 무효화되는 것이 가능하다. 코프로세서가 이러한 할당을 억세스하려는 다음 번에 폴트가 발생한다. 그러나, 코프로세서는 임의의 시간에 즉시 폴트할 수 없으므로, (예를 들어, 몇몇의 코프로세서는 단지 트라이앵글들 사이의 현재 할당 상태를 리샘플링만 할 수 있음), 코프로세서가 몇 번 동안 무효화된 후의 할당을 사용할 필요가 있을 가능성이 있다.
이를 방지하기 위해, VidMm은 그 가상 어드레스 또는 핸들이 무효화되어도 할당을 위한 메모리가 다음 컨텍스트 스위치까지 유효하게 유지하는 것을 보장할 수 있다. 이는 VidMm-전용 코프로세서 컨텍스트에서 행해지는 페이징으로 인한 메모리 전송을 가짐으로써 이루어질 수 있다. 메모리 전송은 개별적인 컨텍스트에서 행해지므로, 메모리의 컨텐트가 변화되기 전에 컨텍스트 스위치가 존재할 것이라는 것을 확신할 수 있다. 시스템 메모리를 참조하는 가상 어드레스 또는 핸들에 대해, 퇴거 동안에 메모리 전송이 존재하지는 않는다. 이 경우에, VidMm은 코프로세서 컨텍스트가 VidMm의 전용 컨텍스트를 스위칭할 때까지 시스템 메모리를 속박상태로 유지함으로써 유효 상태로 유지하는 것을 보장할 수 있다.
VidMm-전용 코프로세서 컨텍스트는 시스템 메모리와 비디오 메모리 사이에서 메모리 전송을 수행하는 VidMm에 의해 사용되는 규칙적인 코프로세서 컨텍스트이다. VidMm 컨텍스트는 인페이지 리스트(inpage list) 내에서 가장 높은 우선순위 항목을 취하는 가변 우선순위 컨텍스트이다. 단일 컨텍스트에 직렬화된 모든 페이징 동작을 갖는 것은 VidMm에 대한 동기 모델을 간소화한다.
본 모델에서 다른 흥미있는 차이점은 특정한 컨텍스트에 대해 제시된 모든 DMA 버퍼들이 단일 태스크를 형성하도록 연결될 수 있는 방법이다. 이전의 모델에서는, 각각의 DMA 버퍼가 작업 항목을 형성하였고 각각의 컨텍스트가 그 작업 항목의 리스트를 유지하였다. 스케줄러는 필수적으로 컨텍스트를 스케줄링하는 것은 아니다. 이는 컨텍스트와 연관된 특정한 작업 항목을 (초기화 준비를 위해) 스케줄링할 수도 있다. 작업 항목이 완료될 기회를 갖기 전에, 스케줄러는 다음의 작업 항목을 선택해야 한다. 각각의 작업 항목은 그것이 제시되기 전에 준비되어서, 스케줄러가 다음 작업 항목이 무엇인지를 알아야 하지만 항상 가능한 것은 아니다.
면 레벨 폴팅에 있어서, DMA 버퍼들은 준비를 필요로 하지 않는다. 이 때문에, 스케줄러는 작업 항목의 수집으로서 컨텍스트를 볼 필요가 없다. 대신에, 스케줄러는 실제로 컨텍스트들을 스케줄링하여, 일단 컨텍스트가 코프로세서의 제어권을 얻으면, 코프로세서의 제어권을 유지할 수 있다. 몇몇의 이벤트들이 프로세서의 컨텍스트 제어권을 정지시키도록 허용될 수 있으며, 예를 들면 다음과 같다.
1) 코프로세서가 현재 큐잉된 모든 명령들을 완료
2) 코프로세서가 무효한 메모리 억세스에 의해 발생된 페이지 폴트 발생
3) 스케줄러가 스위치에 다른 컨텍스트를 요청
4) 코프로세서가 DMA 스트림에서 무효한 명령에 따르는 무효한 동작 인터럽트를 발생
도 16은 상술한 바에 따른 본 발명의 다양한 실시예들을 도시한 도면을 제공한다. 도 16을 참조하면, 동일한 하드웨어 환경에서 제1 컨텍스트의 삽입으로부터 제2 컨텍스트의 삽입으로의 진행을 양측이 나타내고 있다. 좌측 상에서, 스케줄러는 특정한 DMA 버퍼를 코프로세서 컨텍스트 #1의 링에 삽입할 것을 커널 드라이버에 요청한다. 이 링은 드라이버에 의해 변경되고 코프로세서의 테일은 새로운 위치를 참조하도록 갱신된다. 코프로세서 컨텍스트 #1 내의 DMA 버퍼의 삽입은 코프로세서 컨텍스트 #1 특정 락의 보호 하에서 발생한다. 따라서, 다른 쓰레드들은 DMA 버퍼들을 다른 코프로세서 컨텍스트들의 링으로 삽입할 수 있다.
우측 상에서, 스케줄러는 특정한 DMA 버퍼를 코프로세서 컨텍스트 #2의 링에 삽입하도록 커널 모드 드라이버에 요청한다. 그러나, 이 링은 이미 가득 차서, 동일한 공간이 링 내에 빌 때까지 쓰레드 B가 차단될 것이다. 쓰레드 B가 대기중이라는 사실은 쓰레드 A가 그 자신의 링 내에 새로운 DMA 버퍼를 삽입하는 것을 차단하지 않는다는 것임을 알아야 한다.
이러한 모델에서, 각각의 컨텍스트는 실행할 DMA 버퍼들의 부분들에 대한 리다이렉션들을 포함할 수 있는 그 자신의 DMA 링을 각각 구비한다. 제시 시간에, 스케줄러는 제시된 DMA 버퍼를 컨텍스트의 링에 추가하려고 시도할 수 있다. 링이 이미 가득차 있다면, 스케줄러는 다른 제시를 위해 링 내에 충분한 공간이 있을 때까지 대기할 수 있다. 이러한 대기는 단지 제시되는 특정한 컨텍스트에 대한 추가 제시만을 방지할 것임을 알아야 한다. 이는 다른 컨텍스트들에 대한 제시를 방지하지는 않을 것이다. 즉, 다수의 쓰레드들은 작업 항목들을 병렬로 그 자신의 컨텍스트들을 추가할 수 있다.
새로운 DMA 버퍼가 실행 컨텍스트의 큐에 추가될 수 있으므로, 코프로세서는 컨텍스트가 비어 있다는 것을 보고하는 인터럽트를 생성하기 전에 큐의 테일을 리샘플링할 수 있다. 물론, 코프로세서가 그 큐를 샘플링한 직후에 DMA 버퍼가 큐에 추가되는 것이 가능하다. 그러나, 인터럽트를 생성하기 바로 전에 큐의 테일을 샘플링하는 것은 이러한 발생의 가능성을 감소시키고 스케줄링의 정확성을 증가시킨다. 스케줄러는 컨텍스트가 비어있는 것으로 통보받았을 때, 실제 경우가 존재하는지를 드라이버가 알도록 질의할 것이다. 프로세싱되었던 현재 큐잉된 명령인지를 판정하기 위해 드라이버가 저장된 코프로세서 컨텍스트를 억세스하는 것이 가능해야 한다. 도 17은 이러한 모델을 기술하는 의사 코드 알고리즘을 제공한다.
후술되는 바와 같이, 제한된 대 특권 DMA 버퍼들의 개념은 DMA 버퍼들이 시스템 보안성을 손상시키지 않으면서 직접 구축될 수 있게 허용하면서, 커널 모드 드라이버가 특권 명령들을 포함하는 DMA 버퍼들을 구축하는 것을 허용하도록 도출된다.
이러한 모델에 의해 표현되는 다양한 실시예들은 본 명세서의 후반부에 기술될 제한된 대 특권 메모리의 개념과 함께 사용될 수 있다. 이미 제공됨 메모리 가상화 모델에서, 제한된 DMA 버퍼 대 특권 DMA 버퍼에 의해 억세스될 수 있는 메모리 사이의 구별이 이루어지지 않았기 때문에 본 모델에서 문제점이 발생할 수 있음을 알아야 한다. 모든 가상 메모리는 억세스 가능하다. 이는 페이지 테이블 또는 링 버퍼와 같은 몇몇의 메모리 자원들이 코프로세서 가상 어드레스 공간을 통해 적절하게 보여지지 않을 수 있음을 의미하며, 이는 악의적인 어플리케이션이 페이지 테이블 또는 링 버퍼에 기입하도록 허용되기 때문이다 이 때문에, 하드웨어는 몇몇 형태의 자원들에 대한 물리적인 어드레싱과 다른 형태의 자원들에 대한 가상 어드레싱을 지원하도록 설계될 수 있다.
상기 문제점에 대한 상이한 시도가 특권 메모리의 개념에 추가된다. 다양한 실시예들에서, 특권 메모리는 단지 특권 DMA 버퍼로부터 억세스될 수 있으며, 코프로세서는 제한 DMA 버퍼가 특권 메모리 위치를 억세스하려고 시도한다면 페이지 폴트를 발생시킬 수 있다. 한편, 특권 DMA 버퍼는 특권 메모리와 비특권 메모리 모두를 억세스할 수 있다. 특권 메모리를 지원하기 위해, 하드웨어는 메모리가 특권적인지를 핸들 단위 기준(per-handle basis)(핸들 기반 가상화의 경우) 또는 페이지 단위 기준(per-page basis)(페이지 테이블 기반 가상화의 경우)으로 특정하는 메카니즘을 구비해야 한다.
특권 메모리를 지원하기 위해, 페이지 테이블로 면 레벨 폴팅을 지원하는 코프로세서가 단지 메모리 자원의 베이스 어드레스로 더 이상 폴팅하지 않을 수 있음을 알아야 한다. 코프로세서는 현재의 자원에 의해 커버되는 모든 페이지 테이블 엔트리들를 참조하여 이들 모두가 올바른 보호 비트 셋을 가지고 있는지를 확실히 해야 한다. 메모리 자원의 첫 페이지만을 조사하는 것은 잠재적으로 제한 DMA 버퍼 내에서 특정된 제한 메모리 베이스 어드레스에 따르는 특권 메모리에 대한 악의적인 어플리케이션 억세스를 허용할 수 있다.
런 리스트
이미 제공된 디맨드 폴팅 모델(demand faulting model)은 다수의 이벤트를 시그널링하는 인터럽트의 사용을 심하게 할 수 있다. 페이지 폴트와 같은 이들 이벤트 중 몇몇은 메모리 압박 하에서 높은 빈도로 발생할 수 있다. 인터럽트가 히팅되는 시간과 코프로세서가 주어지는 시간 사이에 CPU에 의해 새로운 태스크가 제공되며, 코프로세서는 스타베이션될 수 있다. 인터럽트 레이턴시(interrupt latency)를 숨기고 코프로세서 비지를 유지하기 위해, 런 리스트의 개념을 도입한다.
런 리스트는 CPU 개재없이 코프로세서에 의해 실행될 수 있는 코프로세서 컨텍스트들의 간단한 리스트이다. 컨텍스트가 주어진 순서 또는 본 발명을 실시하기 위해 편리한 것으로 입증된 임의의 다른 순서로 실행될 수 있다. 코프로세서는 본 발명과 관련하여 구현될 수 있는 임의의 매우 다양한 이유들로 인해 런 리스트 상에서 한 텍스트로부터 다음으로 스위칭할 수 있으며, 그 예를 들면 다음과 같다.
1) 현재의 컨텍스트는 비어 있음, 즉 수행할 어떠한 것도 남아있지 않음
2) 현재의 컨텍스트가 페이지 폴트를 발생
3) 현재의 컨텍스트가 일반 보호 폴트를 발생(코프로세서에 의해 지원되는 경우)
4) 코프로세서가 새로운 런 리스트로의 스위칭을 요청받음
다양한 실시예들에서, 코프로세서가 실행 리스트 내의 한 항목으로부터 다음으로 스위칭할 때, CPU를 인터럽트시키지만, 스톨(stall)하지 않으며 리스트 내의 다음 항목으로 컨텍스트 스위칭하여 그 것을 실행할 수 있다. 런 리스트의 헤드는 스케줄러가 먼저 실행하려고 시도할 수 있는 컨텍스트일 수 있으며, 런 리스트의 다른 엘리먼트들은 인터럽트 레이턴시 동안에 코프로세서를 비지로 유지하는 부분이 존재할 수 있다. 리스트의 헤드로부터 멀리 코프로세서가 스위칭한 인터럽트 시그널링을 CPU가 수신한 즉시, CPU는 새로운 런 리스트를 구축할 수 있으며 그것을 코프로세서에 전송할 수 있다.
코프로세서가 리스트의 헤드로부터 멀리 스위칭할 때, 런 리스트 내의 다음 컨텍스트 실행을 시작할 수 있으며, 발생된 인터럽트는 CPU에 그 방법을 행한다. CPU가 생성할 수 있는 새로운 런 리스트의 헤드는 코프로세서가 막 스위칭한 컨텍스트와 다를 수 있다. 코프로세서가 다시 스위칭할 필요가 있을 경우에 컨텍스트 상의 보다 유용한 작업을 수행할 시간을 가질 수 없다.
그러나, 마지막 런 리스트가 구축되었으므로 컨텍스트 우선순위가 변화될 필요가 없기 때문에 CPU에 의해 구축된 새로운 런 리스트의 헤드 컨텍스트는 이전의 런 리스트의 제2 엘리먼트와 동일한 컨텍스트일 수 있다. 이 경우에, 코프로세서는 미리 올바른 컨텍스트의 프로세싱을 시작할 것이다.
런 리스트의 개념을 나타내는 도면이 도 18에 제공되어 있다. 런 리스트가 본 발명의 다양한 실시예들에 포함될 때, 스케줄러의 실행 컨텍스트는 현재의 런 리스트로 대체될 수 있다. 제2 런 리스트, 소위 계류중 런 리스트가 런 리스트 스위칭의 동기를 간소화하도록 도입된다. 현재의 런 리스트는 하드웨어가 현재 실행되는 것으로 스케줄러가 가정할 수 있는 컨텍스트들의 리스트이지만, 계류중 런 리스트는 스케줄러가 하드웨어를 한 런 리스트로부터 다른 것으로 변화시키기를 원할 때 사용되는 과도적인 런 리스트이다. 스케줄러가 새로운 런 리스트를 변경하기를 원할 때, 계류중 런 리스트를 구축하고 코프로세서에 그것을 스위칭할 것을 요청한다. 일단 코프로세서가 새로운 런 리스트의 실행을 시작한 (인터럽트를 통한) 코프로세서로부터의 확인을 스케줄러가 수신하면, 계류중 런 리스트는 새로운 현재의 런 리스트가 되고, 계류중 런 리스트는 비어있게 될 수 있다.
계류중 런 리스트가 비어 있을 때, 하드웨어는 현재의 런 리스트로 컨텍스트를 실행하거나 유휴 상태에 있을 수 있다. 계류중 런 리스트가 비어 있지 않을 때, 스케줄러는 천이가 발생한 코프로세서로부터의 확인을 수신할 때까지 하드웨어가 현재 어느 런 리스트를 실행하는지를 알 수 없다.
일정한 이벤트들은 스케줄러가 런 리스트를 재우선순위화하도록 요구할 수 있다. 예를 들어, 페이지 폴트는 실행을 위해 높은 우선순위 코프로세서 컨텍스트를 준비 상태로 하여 해결된다. 이러한 이벤트의 동기를 간소화하기 위해, 스케줄러에 의해 후속될 수 있는 일반적인 규칙은 이전의 이벤트에 의해 제시된 이미 계류중인 런 리스트가 존재하지 않을 때만 새로운 런 리스트(계류중 런 리스트)를 제시하는 것이다. 하나의 계류중 리스트를 다른 것으로 대체하려고 시도하는 것은 동기가 어려울 수 있는데, 이는 리스트가 코프로세서에 이미 제공되어, 천이가 임의의 시간에 발생할 수 있으며, 스케줄러가 그 사실 후에만 통보되기 때문이다.
후자의 경우에, 런 리스트의 재우선순위는 컨텍스트 핸들러로 위임될 수 있다. 장차 몇몇의 포인트에서, 핸들러는 다음에 계류중 리스트로부터 실행 리스트로의 천이를 시그널링하도록 호출될 수 있으며, 그 때에 핸들러는 우선순위들이 변경될 경우 하드웨어에 하드웨어 전송하기 위해 새로운 런 리스트를 생성한다.
런 리스트 스위칭 동기. 한 런 리스트 모델에서, 그래픽 하드웨어는 컨텍스트를 스위칭할 때 인터럽트를 생성할 수 있다. 인터럽트 전달 및 프로세싱이 즉각적이지 않으므로, 다수의 인터럽트들이 CPU가 실제로 인터럽트를 얻기 전에 생성될 수 있는 것이 가능하다. 동기가 적절하게 수행되지 않으면, 스케줄러는 혼동할 수 있으며 스케줄링 판정이 틀릴 수 있다.
스케줄러가 구별하는 2개의 중요한 이벤트들은 첫째, 코프로세서가 런 리스트의 헤드로부터 멀리 스위칭할 때이고, 둘째, 코프로세서가 계류중 런 리스트를 변경할 때이다. 이 이벤트들 사이의 구별은 각각의 컨텍스트 스위치에서 간단한 인터럽트로부터의 정보만으로는 어려울 수 있다. 이러한 점을 더 설명하기 위해, 다음의 예를 고려한다. 코프로세서는 컨텍스트들 1-3-5-2로 구성된 런 리스트 A를 현재 실행중이며, 스케줄러는 컨텍스트들 4-1-3-2로 구성된 런 리스트 B를 변경시키기를 원한다. 다음의 2개의 시나리오가 발생할 수 있다.
시나리오 #1
코프로세서는 현재 런 리스트 A (1-3-5-2)를 실행한다.
명령들은 컨텍스트 4에 관해 제시되는데, 유휴 상태였으며 컨텍스트 1보다 높은 우선순위이다. 런 리스트 B (4-1-3-2)가 생성되어 스케줄러는 런 리스트 B를 코프로세서에 제시한다.
컨텍스트 #1은 코프로세서가 런 리스트 B로부터 컨텍스트 #4로 천이할 때까지 실행된다.
코프로세서는 천이를 시그널링하는 인터럽트를 생성한다.
코프로세서는 컨텍스트 #4로부터 #1로 천이하여, CPU가 인터럽트되기 전에 #3이다.
CPU가 인터럽트되고, 컨텍스트 스위치 핸들러가 호출된다.
드라이버는 현재의 코프로세서 컨텍스트를 샘플링하고, 이는 #3이다.
시나리오 #2
코프로세서는 현재 런 리스트 A (1-3-5-2)를 실행한다.
명령들은 컨텍스트 4에 관해 제시되는데, 유휴 상태였으며 컨텍스트 1보다 높은 우선순위를 갖는다. 스케줄러는 런 리스트 B를 코프로세서에 제시한다.
스케줄러가 런 리스트 B를 구축하는 비지상태 동안에, 코프로세서는 컨텍스트 #3으로 천이하였다.
코프로세서는 컨텍스트 #3으로의 천이를 시그널링하는 인터럽트를 생성한다.
CPU가 인터럽트되고, 컨텍스트 스위치 핸들러가 호출된다.
드라이버는 현재의 코프로세서 컨텍스트를 샘플링하고, 이는 #3이다.
두 경우에, 컨텍스트 스위치 인터럽트 시간의 현재 실행 컨텍스트는 #3이다. 그러나, 추가 정보 없이, 스케줄러가 2개의 시나리오들을 구별할 수 없음을 알아야 한다. 제1 시나리오에서, 코프로세서는 런 리스트 B의 헤드로부터 멀리 스위칭하였고, 따라서 스케줄러는 런 리스트 C를 생성하고 코프로세서에 그것을 변경할 것을 요청할 필요가 없다. 그러나, 제2 시나리오에서, 제2 런 리스트는 아직 시작하지 않았으며 따라서 스케줄러는 간단히 대기해야 한다.
상기 예는 컨텍스트 스위치 인터럽트만으로는 스케줄링 모델의 런 리스트를 적절하게 지원하기에 충분하지 않을 수 있다. 몇몇의 보다 많은 정보가 시나리오들을 구별하는데 필요하다. 다음의 섹션들은 이러한 문제점들을 해결하는데 유용할 수 있는 하드웨어 지원과 함께 이러한 문제점들이 해결될 수 있는 몇 가지 방법들을 열거한다.
2-엘리먼트 런 리스트. 이 동기 시도는 몇몇의 추가 특징을 지원하는 코프로세서를 필요로 한다. 2개의 엘리먼트 런 리스트의 구현과 관련하여 지원될 수 있는 특징들은 다음과 같다.
1) 2개의 엘리먼트들의 런 리스트
2) 각각의 컨텍스트 스위치에서 인터럽트를 생성하는 능력(컨텍스트 X로부터 X로의 페이크 컨텍스트 스위치(fake context switch) 포함)
3) VidMm이 임의의 시간에 현재 실행중인 코프로세서 컨텍스트를 질의하는 방법
4) 나가는 코프로세서 컨텍스트를 인터럽트 전에 메모리에 저장
5) 스케줄러가 컨텍스트 스위치들 이면의 요인들을 판정하도록 컨텍스트가 CPU에 의해 판독가능한 방법으로 코프로세서 컨텍스트를 저장
하드웨어가 상기 기능들을 지원하는데 사용될 수 있는 동안, 스케줄러가 규칙적인 컨텍스트 스위치와 런 리스트 스위치를 구별하도록 하는데 특수 하드웨어가 필요하지는 않음을 알아야 한다. 대신에, 스케줄러는 런 리스트를 구성할 때 한 세트의 간단한 규칙들을 항상 존중함으로써 2개의 이벤트들을 스케줄러가 구별하도록 할 수 있다. 특정한 규칙들은 본 발명의 다양한 실시예들에 따라 변할 수 있지만, 이러한 기능을 제공하는 예시적인 규칙들은 첫째 현재 실행 런 리스트의 제1 컨텍스트가 새로운 계류중 런 리스트에 나타날 수 없다는 것이고, 둘째 현재의 런 리스트의 제2 컨텍스트가 새로운 계류중 런 리스트의 헤드가 아니라면, 이는 전혀 새로운 계류중 런 리스트가 아니어야 한다는 것이다. 개의 예시적인 규칙들을 따를 때 한 컨텍스트로부터 다른 것으로의 천이 동안에 스케줄러가 작성할 수 있는 가정의 테이블이 다음에 제공되어 있다. 다음의 테이블에서, 런 리스트 A는 컨텍스트 1-2로 구성되고, 제2 런 리스트 B는 컨텍스트 2-3으로 구성되며, 제3 런 리스트 C는 컨텍스트 3-4로 구성된다.
A로부터 B로의 천이
CPU가 인터럽트될 때 현재의 컨텍스트 # 의미 / 동작
1 결함, 인터럽트 무시이 결함은 런 리스트로서 X에서 1로의 천이를 틀리게 인터럽트하는 런 리스트 (X,1) - (1*, Y)의 이전의 스위치에 의해 발생되었다. 실제 천이는 X에서 1로, 다음에 1에서 1*로이다. 현재의 인터럽트는 1에서 1*로의 천이를 위한 것이며 무시될 수 있다. (코프로세서는 이러한 인터럽트 생성을 요구하여 1-X에서 1-Y로의 천이가 스케줄러에 의해 검출될 수 있다.)
2 발생되는 런 리스트 스위치이는 항상 사실은 아니며 이전의 결함에 도달할 수 있다.현재의 천이가 실제 1*-2*라면, CPU는 천이 2*-2** 또는 2*-3**에 대해 다시 인터럽트될 것이다. 계류중 런 리스트 (B)는 현재의 런 리스트가 되고, 계류중 리스트는 비어진다. 스케줄러는 컨텍스트 1*로부터 멀리 컨텍스트 스위치를 핸들링한다. (예 : 페이지 폴트)
3 런 리스트 스위치 발생, 제2 리스트의 헤드가 항상 완료런 리스트 B가 종료한다. 계류중 런 리스트 (B)는 현재의 런 리스트가 된다. 새로운 계류중 런 리스트가 스케줄러에 의해 구축되어 코프로세서로 전송된다. 스케줄러는 컨텍스트 1*과 2*로부터 멀리 컨텍스트 스위치를 핸들링할 필요가 있다. (예 : 페이지 폴트)
A로부터 C로의 천이
CPU가 인터럽트될 때 현재의 컨텍스트 # 의미 / 동작
1 결함, 인터럽트 무시이 결함은 런 리스트로서 X에서 1로의 천이를 틀리게 인터럽트하는 런 리스트 (X,1) - (1*, Y)의 이전의 스위치에 의해 발생되었다. 실제 천이는 X에서 1로, 다음에 1에서 1*로이다. 현재의 인터럽트는 1에서 1*로의 천이를 위한 것이며 무시될 수 있다. (코프로세서는 이러한 인터럽트 생성을 요구하여 1-X에서 1-Y로의 천이가 스케줄러에 의해 검출될 수 있다.)
2 현재의 런 리스트의 컨텍스트 스위치코프로세서는 컨텍스트 2*로 스위칭한다. 스케줄러는 1*로부터 멀리 컨텍스트 스위치를 핸들링할 필요가 있지만 (예 ; 페이지 폴트),그렇지 않으면 런 리스트에 관해 실행할 것이 없다.
3 발생되는 런 리스트 스위치계류중 런 리스트 (C)는 현재의 런 리스트가 되며, 계류중 런 리스트는 비어진다. 스케줄러는 컨텍스트 1*로부터 멀리 컨텍스트 스위치를 핸들링한다. (예 : 페이지 폴트) 컨텍스트 2*가 실행된 적이 있는지는 알려지지 않으며, 리스케줄링될 것이다.
4 런 리스트 스위치 발생, 제2 리스트의 헤드가 항상 완료런 리스트 C가 종료한다. 계류중 런 리스트 (C)는 현재의 런 리스트가 된다. (하드웨어는 유휴 상태가 됨) 새로운 계류중 런 리스트가 스케줄러에 의해 구축되어 코프로세서로 전송된다. 컨텍스트 2*가 실행되었던 적이 있는지는 알려지지 않으며, 리스케줄링될 것이다.
런 리스트를 구현하는 방법은 아마도 가장 간단하며 상당한 추가 하드웨어 지원을 필수적으로 요구하지 않을 것이다. 그러나, 상기 테이블 내의 런 리스트는 크기가 제한되지 않으며 (2를 넘는 크기로 확장하는 것은 실용적이지 않음), 몇몇의 중요하지 않은 정보가 컨텍스트 스위치 동안에 상실될 수 있다. 예를 들어, 스케줄러는 A에서 C로의 천이 시에 컨텍스트 #2가 실행되었던 적이 있는지를 항상 알고 있을 수 없다. 실행되었고, 페이지 폴트가 발생하였지만, 다른 컨텍스트 스위치에 의해 숨겨진 인터럽트를 갖는다. 이 경우에 스케줄러가 폴트를 발생시킨 적이 있음을 알고 있지 않으며 그것을 리스케줄링한다.
스케줄링 이벤트의 코프로세서 트레이스. 런 리스트는 하드웨어가 스케줄링 이벤트의 몇몇 히스토리 정보를 스케줄러에 제공할 때 N 크기로 쉽게 확장될 수 있다. 간단한 인터럽트를 사용하는 한가지 문제점은 다수의 인터럽트가 함께 동시 발생될 수 있어, 무엇이 인터럽트를 발생시켰는지를 정확하게 판정하는 것이 불가능할 수 있다는 것이다. 이는 본 발명의 방법과 관련하여 하드웨어 특징, 스케줄러에 의해 판독가능한 컨텍스트 스위치 히스토리를 특정한 시스템 메모리 위치에 기입할 수 있는 하드웨어를 구현함으로써 해결될 수 있다. 본 발명의 이러한 특징을 설명하기 위해, 다음의 시나리오를 고려한다.
1) 스케줄러는 런 리스트 A (1-2-3-4-5)를 스케줄링한다.
2) 일정 시간이 컨텍스트 #1 동안 만료하고, 스케줄러는 새로운 런 리스트 B (2-3-4-5-1)를 전송한다.
3) CPU 상의 만료 프로세싱 동안, 코프로세서는 컨텍스트 #1로 종료하는데, 이는 비어있게 되기 때문이며 따라서 컨텍스트 #2로 천이한다.
4) 코프로세서는 새로운 런 리스트에 대한 CPU로부터의 통보를 수신하고 그것을 천이시킨다. 코프로세서는 이러한 이벤트에 대한 컨텍스트 스위치 인터럽트를 발생시킨다.
5) 새로운 런 리스트의 컨텍스트 #2에서 렌더링 명령들을 프로세싱하는 동안, 코프로세서는 페이지 폴트를 발생시켜 컨텍스트 #3으로 스위칭한다. 코프로세서는 이러한 이벤트에 대한 컨텍스트 스위치 인터럽트를 발생시킨다.
6) 컨텍스트 #3은 페이지 폴트를 멀리 히팅하고 코프로세서는 컨텍스트 #4로 스위칭한다. 코프로세서는 이러한 이벤트에 대한 컨텍스트 스위치 인터럽트를 발생시킨다.
7) CPU는 컨텍스트 스위치를 위해 최종적으로 인터럽트된다. 4개의 컨텍스트 스위치들은 실제로 원래의 인터럽트가 발생되었으므로 발생하였다.
도 19는 상기 시나리오에서의 하드웨어 히스토리 메카니즘의 동작을 도시하고 있다. 이러한 히스토리 메카니즘을 지원하기 위해, 하드웨어는 다음의 태스크들을 수행할 수 있도록 구성될 수 있다. 이 태스크들은 예로서 제공된 것이며 제한적인 것은 아니다.
1) 히스토리 버퍼에 대한 베이스 어드레스 특정. 코프로세서 마다 하나의 히스토리 버퍼가 존재할 수 있다. 양호한 실시예에서, 이는 PCI 또는 AGP 메모리 내의 시스템 메모리 위치일 수 있다. 이는 운영 체제에 의해 4KB 경계로 정렬될 수 있다. PCI 익스프레스 시스템에 대해, 버퍼에 대한 억세스는 양호하게 스누프 싸이클(snoop cycle)로 양호하게 구현될 수 있어 시스템 메모리 버퍼는 보다 효율적인 CPU 판독을 위해 캐쉬가능할 수 있다.
2) 히스토리 버퍼의 크기 특정. 히스토리 버퍼는 런 리스트의 크기의 2배 길이일 수 있다. 이는 현재의 런 리스트와 계류중 런 리스트 모두가 인터럽트가 발생하기 전에 완료되는 최악의 시나리오를 핸들링하기에 충분한 공간의 버퍼인 것을 보장한다.
3) 히스토리 버퍼에 기입된 최종 이벤트 직후의 어드레스일 수 있는 코프로세서 기입 포인터를 특정. VidMm은 코프로세서가 실행될 때를 포함하여 항상 포인터를 질의할 수 있다. 히스토리 버퍼의 데이터는 스케줄러가 항상 논리적인 데이터를 얻는 것을 보장하도록 포인터가 갱신되기 전에 메모리로 적절하게 플러싱될 수 있다.
다양한 실시예들은 히스토리 버퍼를 구성하여 사용자 모드에서 구축된 DMA 버퍼들은 보이지 않을 수 있다. 히스토리 버퍼가 제한된 DMA 버퍼에서 보인다면, 악의적인 어플리케이션이 히스토리 버퍼에 기입할 수 있어, 스케줄러를 중단시키고 시스템을 파괴하는 결과를 가져올 수 있다. 이 때문에, 이러한 실시예들에서 히스토리 버퍼는 물리적인 어드레스를 통하거나 특권 DMA 버퍼에서만 보여지는 가상 어드레스를 통해 하드웨어에 의해 참조될 수 있다. 이러한 실시예에서, 코프로세서는 CPU 간섭없이 히스토리 버퍼의 말단 주위를 감싸도록 요구될 수 있다.
기술된 실시예들에 따른 런 리스트들은 동일한 이유로 인해 동일한 컨텍스트 상에 여러 번 코프로세서가 폴팅할 수 있는 모든 요구를 제거하지 않음을 알아야 한다. 그 이유는 스케줄러는 일반적으로 새로운 런 리스트를 구축하지 않지만 코프로세서는 현재의 실행 리스트를 실행하는 비지 상태이기 때문이다. 스케줄러는 이전의 런 리스트에서 이미 제공된 새로운 런 리스트 내에 몇몇의 컨텍스트를 포함하는 것이 필요할 수 있으므로, 구성되는 런 리스트에 제공되는 시간과 런 리스트가 코프로세서에 제시되는 시간 사이에서 반복되는 컨텍스트의 상태가 변화하는 것이 가능하다.
제한 대 특권 DMA
진보된 스케줄링 모델에서 메모리 보호 도입으로, 코프로세서에 전송되는 DMA 버퍼들은 실행 어플리케이션의 프로세스 내의 사용자 모드 드라이버에 의해 구축될 수 있다. 이러한 DMA 버퍼들은 어플리케이션의 프로세스로 매핑될 수 있고, 사용자 모드 드라이버가 그들에 직접 기입할 수 있으며, 커널 모드 드라이버는 그들을 유효화할 수 없다. DMA 버퍼들은 그들의 가상 어드레스들을 우연히 억세스하는 어플리케이션에 의해 또는 고의의 악의적인 어플리케이션에 의해 마구 쓰여질 수 있다. 드라이버 모델이 보안을 가능하게 하기 위해, 즉, 허용되지 않은 자원들을 어플리케이션이 억세스하지 않도록 하기 위해, 사용자 모드에서 구축된 DMA 버퍼들은 그들이 수행을 허용하는 것이 제한될 수 있다. 특히, 구축된 DMA 버퍼들은 다음과 같은 예시적인 방법들로 기능이 제한될 수 있다.
1) 그들은 가상 어드레스에 대한 참조만을 포함할 수 있고, 물리적인 어드레스(펜스 포함)는 전혀 참조하지 않는다.
2) 그들은 현재의 디스플레이 (예를 들어, CRT, Discretionary Access Control(DAC), Technical Document Management System(TDMS), Television-Out Port(TV-OUT), Internet2 (I2C) 버스)에 영향을 주는 명령들을 포함하도록 허용되지 않을 수 있다.
3) 그들은 일반적으로 어댑터에 영향을 주는 명령들을 포함하지 않을 수 있다. (예를 들어, 위상 동기 루프(PLL))
4) 그들은 제한된 파워 관리 및/또는 컨피그 공간을 가질 수 있다.
5) 그들은 컨텍스트 스위칭을 방지할 명령들을 포함하는 것을 허용하지 않을 수 있다.
사용자 모드에서 구축된 DMA 버퍼 내의 프로그래밍될 수 있는 정확한 세트의 레지스터들은 하드웨어로부터 하드웨어로 변하기 쉬울 것이다. 그러나, 하드웨어에 관계없이, 레지스터들은 일반적인 규칙, 즉 DMA 버퍼가 자원들 및 펜스들에 대한 가상 어드레스 참조들을 사용하여 렌더링 동작이 가능해야 한다는 것을 따를 수 있다. 향상된 보안성을 제공하기 위해, DMA 버퍼들은 어플리케이션이 억세스하지 않아야 하거나 몇몇의 잠재적인 재앙 및 회복불능의 방법으로 하드웨어에 영향을 줄 수 있는 메모리를 어플리케이션이 사용하지 않도록 요구될 수 있다.
사용자 모드에서 구축된 DMA 버퍼들이 일정한 기능을 억세스하지 않도록 방지하기 위해, 여러 시도들이 코프로세서에 구현될 수 있다. 이 시도들은 기능의 특성 및 기능이 어플리케이션의 코프로세서 컨텍스트 스트림에서 큐잉될 필요가 있는지에 따라 변화할 수 있다. 일정한 특권 동작들은 일반적으로 사용자 모드에 구축된 DMA 버퍼들(예를 들어, 어플리케이션 렌더링)과 커널 모드에서 구축된 특권 DMA 버퍼들 (예를 들어, 큐잉된 플립) 모두를 포함하는 코프로세서 컨텍스트 스트림으로 큐잉될 필요가 있다.
큐잉될 필요가 없는 기능. 특권 기능의 대부분은 어플리케이션 코프로세서 컨텍스트 스트림에서 큐잉될 필요가 없다. 다음과 같은 기능들은 큐잉될 필요가 없다.
1) CRT 타이밍 프로그래밍
2) DAC를 위한 룩업 테이블 갱신(DAC LUT를 프로그래밍하는 것은 완전히 특권 기능이 되도록 요구되지 않는데 이는 임의의 어플리케이션이 원한다면 주 화면으로 렌더링할 수 있고, 룩업 테이블(LUT)을 재프로그래밍하는 것은 어플리케이션이 그렇지 않았으면 이미 억세스했을 정보에 대해 사용자 억세스를 허용하지 않음을 알아야 한다).
3) 디스플레이 출력 프로그래밍 (TDMS, TV-OUT, ...)
4) 차일드 장치/모니터와 통신 (I2C, ...)
5) 클럭 프로그래밍 (PLL)
6)코프로세서의 파워 상태 변경
7) 코프로세서를 구성 (컨피그 공간, 바이오스, ..)
기능은 대개 어플리케이션 렌더링 스트림에 완전히 독립적인 시스템 이벤트 (예를 들어, 부트, 해상도 변경, PNP 검출, 파워 관리)에 따를 필요가 있다. 이와 같이, 기능은 특정한 어플리케이션의 코프로세서 컨텍스트에서 큐잉될 필요가 없다. 이러한 기능은 사용자 모드 드라이버로부터의 임의의 간섭없이 특정한 시스템 이벤트가 발생할 때 커널 모드 드라이버 자체에 의해 사용될 수 있다.
이러한 기능을 위해, IHV는 모든 하부 레지스터들을 Memory-Mapped Input-Output(MMIO)를 통해서만 억세스 가능하게 결정할 수 있다. 레지스터들은 일반적으로 커널 공간으로만 매핑되므로, 어플리케이션 또는 사용자 모드 드라이버가 그들을 억세스하는 것이 가능하지 않으며, 따라서 기능은 효과적으로 보호된다.
코프로세서 컨텍스트 단위 특권 레벨을 구현하는 다른 시도가 존재한다. 이러한 시도로서, 몇몇 컨텍스트는 다른 것은 아니지만 그들이 할 수 있는 것으로 제한될 수 있다. 그 시나리오에서 사용자 모드에서 구축된 어플리케이션의 DMA 버퍼는 제한된 컨텍스트로 큐잉된다. 한편, 커널 모드 드라이버는 특권 기능을 제시하도록 특권 컨텍스트를 사용한다.
큐잉될 필요가 있는 기능. 사용자 모드에서 구축된 DMA 버퍼로 삽입될 수 있는 명령들은 제한되지 않으므로, 진보된 모델이 제한된 DMA 버퍼 (이전의 조건을 지키는 DMA 버퍼)와 특권 DMA 버퍼 모두를 코프로세서가 지원하는데 필요하도록 구현될 수 있다. 특권 DMA 버퍼들은 코프로세서 컨텍스트의 렌더링 스트림과 함께 특권 기능의 큐잉을 가능하게 하기 위해 요구된다.
특권 DMA 버퍼는 비특권 DMA 버퍼에서 발견된 임의의 명령들을 포함할 수 있다. 본 발명의 여러 양호한 실시예들은 다음을 적어도 허용하는 특권 DMA 버퍼들을 구현할 수 있다. (후반부에서 보다 상세히 설명됨)
1) 특권 펜스의 삽입
2) 플립 명령의 삽입
3) "컨텍스트 스위치 없음" 영역의 삽입
더욱이, 특권 DMA 버퍼들은 IHV가 원하며 필요하다면 가상 및 물리적인 메모리 모두를 억세스할 수 있는 임의의 하드웨어 레지스터를 프로그래밍할 수 있다. 특권 DMA 버퍼들은 사용자 모드에서 구성되거나 보여질 수 없다. 단지 신뢰성있는 커널 컴포넌트만이 특권 DMA 버퍼를 억세스하고 구축할 수 있다.
다음은 특권 DMA 버퍼들을 구현하는 3가지 가능한 방법들을 제공하며 이는 본 발명이 실시될 수 있는 다양한 방법들을 제한하지 않으면서 특권 DMA 버퍼들의 구현 개념을 설명하려는 의도이다.
1. 커널 모드에서만 구축된 DMA 버퍼
임의의 특수 하드웨어 지원을 필요로 하지 않는 특권 DMA 버퍼를 지원하는 한 방법은 실제 DMA 버퍼가 커널 모드에서 구축된 하드웨어로 전송되는 것을 필요로 한다. 이 시나리오에서, 사용자 모드 드라이버는 DMA 버퍼를 매우 닮은 명령 버퍼를 구축하고 그것을 커널 모드 드라이버에 제시한다. 커널 모드 드라이버는 커널 모드 내에서만 볼 수 있는 DMA 버퍼 내에 이 명령을 유효화하여 카피한다. 유효상태인 동안에, 커널 모드 드라이버는 특권 명령들이 제공되지 않았음을 확인한다. 이는 기본 모델에 의해 요구되는 유효 상태와 유사하지만 메모리가 가상화되어 있으므로 메모리 억세스를 위한 유효화를 필요로 하지 않는다.
2. 특권 명령을 직접 링에 삽입
아마도 특권 DMA 버퍼 채널을 지원하는 가장 쉬운 하드웨어 시도는 코프로세서 컨텍스트 링에 직접 특권 명령들을 삽입하는 것이다. 링 그 자체는 이미 단지 커널 모드로부터만 억세스 가능한 특권 채널에 있다. 이는 도 20의 도면에 도시되어 있다.
3. 인다이렉션을 통한 특권 특정
코프로세서에서 제한 대 특권 DMA 버퍼들을 지원하는 상이한 시도들이 도 21에 도시되어 있다. 이를 참조하면, 시작 및 종료 어드레스들 모두가 DWORD 상에 정렬될 수 있음을 알아야 한다. 어드레스의 미사용 비트들은 플래그들을 특정하기 위해 재사용될 수 있다. 개시 어드레스의 제1 비트는 리다이렉트되는 DMA 버퍼가 특권 DMA 버퍼인 것을 특정할 수 있다. 보안성을 향상시키기 위해, 특권 DMA 버퍼들은 보조 메모리의 물리적인 어드레스를 지칭할 수 있다. 제한된 DMA 버퍼들은 코프로세서 컨텍스트 가상 어드레스 공간 내의 가상 어드레스를 지칭할 수 있다.
이러한 시도에서, 인다이렉션 명령의 한 비트가 링 버퍼로 삽입될 수 있다. 이 비트는 실행되는 DMA 버퍼가 특권 DMA 버퍼인지 여부를 나타낸다. 이는 링 버퍼 그 자체가 물리적인 어드레스를 사용하여 코프로세서에 의해 참조될 수 있고 코프로세서 가상 어드레스 공간에서 보여질 수 없음을 내포한다. 코프로세서 가상 어드레스 공간에서 보여지는 주 링 버퍼는 악의적인 어플리케이션이 주 링 버퍼에 기입하도록 허용하고 특권 레벨에서 명령들을 실행하도록 허용하여, 대부분의 컴퓨팅 환경에서 보안성 위배가 된다. 이 점에서, 특권 DMA 버퍼는 물리적인 어드레스를 통해 참조될 수 있으며 제한 DMA 버퍼와 같은 가상 어드레스를 통해서는 참조될 수 없다.
DMA 제어 명령
임의의 코프로세서의 진행을 트래킹하고 컨텍스트의 DMA 버퍼 스트림 내의 명령들의 플로우를 제어하는 스케줄러 및 보조 메모리 매니저를 위해, 코프로세서는 다음과 같은 그 DMA 스트림에서 후속하는 예시적인 명령들을 지원하도록 구성될 수 있다.
1) 펜스 (제한 및 특권 모두)
2) 트랩
3) 컨텍스트 스위칭 인에이블/디스에이블
펜스. 펜스는 데이터의 단편(예를 들어, 64비트 데이터) 및 DMA 스트림에 삽입될 수 있는 어드레스 모두를 포함하는 명령일 수 있다. 이 명령이 스트림으로부터 코프로세서에 의해 판독될 때, 이는 코프로세서가 특정한 어드레스에서 펜스와 연관된 데이터의 단편을 기입하도록 할 것이다. 코프로세서가 메모리에 펜스의 데이터를 기입할 수 있기 전에, 펜스 명령에 선행하는 프리미티브들(primitives)로부터의 화소들이 회수되어 적절하게 이미 메모리에 기입되었다는 것을 보장해야 한다. 이는 코프로세서가 전체 파이프라인을 스톨(stall)할 필요가 있다는 것을 의미하는 것은 아니라는 것을 알아야 한다. 펜스 명령에 따르는 프리미티브들은 펜스가 회수되기 전에 명령의 마지막 화소를 코프로세서가 기다리는 동안 실행될 수 있다.
상술한 임의의 펜스는 본 발명과 관련하여 사용될 수 있지만, 특히 2가지 형태의 펜스, 즉 규칙적인 펜스와 특권 펜스가 본 명세서에서 더 기술될 것이다.
규칙적인 펜스는 사용자 모드 드라이버에 의해 생성되는 DMA 버퍼에 삽입될 수 있는 펜스이다. DMA 버퍼의 컨텐트는 사용자로부터 오는 것이므로, 신뢰되지 않는다. 따라서, 이러한 DMA 버퍼 내의 펜스들은 코프로세서 컨텍스트의 어드레스 공간 내의 가상 어드레스를 지칭할 수 있으며 물리적인 어드레스를 지칭하지 않는다. 이러한 가상 어드레스에 대한 억세스는 코프로세서에 의해 억세스되는 임의의 다른 가상 어드레스와 동일한 메모리 유효화 메카니즘에 의해 바운드되는 것을 말하지 않으면서 진행한다.
특권 펜스들은 단지 커널 모드에서 생성된 (그리고 보여지는) DMA 버퍼로 삽입될 수 있는 펜스들이다. 이러한 펜스는 시스템의 보안성을 향상시키는 메모리의 물리적인 어드레스를 지칭할 수 있다. 펜스 타겟 어드레스가 코프로세서 컨텍스트의 어드레스 공간에서 보여진다면, 악의적인 어플리케이션은 메모리 위치에서 그래픽 동작을 수행하여, 커널 모드 코드가 수신을 예상하는 컨텐트를 무효로 한다. 이 잠재적인 보안성 문제점에 대한 다른 해결책은 가상 어드레스가 비특권 DMA 버퍼로부터 억세스될 수 있는지를 나타내는 PTE 내에 특권 비트를 가지도록 하는 것이다. 그러나, 상기 첫 번째 시도는 하드웨어 생성보다 간단하게 보인다.
특권 DMA 버퍼는 규칙적인 펜스와 특권 펜스 양자 모두를 포함할 수 있음을 알아야 한다. 그러나, 특권 DMA 버퍼가 규칙적인 펜스를 포함할 때, 삽입되는 펜스가 결코 보여지지 않는 DMA 버퍼를 생성한 커널 컴포넌트로 알려진다.
IHV들은 플러싱될 필요가 있는 내부 버퍼들의 수를 최소화하기 위해 펜스들의 추가 형태들을 지원하는 것을 결정할 수 있다. 펜스들의 다음의 형태들은 이러한 목적을 위해 지원될 수 있는 펜스들의 예이다. (특권 및 비특권 모두가 모든 타입에 대해 지원되어야 한다)
1. 기입 펜스
기입 펜스들은 이미 기술된 펜스의 형태일 수 있으며 단지 요구되는 펜스 형태이다. 기입 펜스는 펜스 명령이 프로세싱되기 전에 모든 메모리가 기입하는 것이 전역적으로 보여질 수 있는 것을 보장한다. (즉, 이들은 캐시로부터 플러싱되고, 메모리 제어기로부터 수신확인이 수신된다.)
2. 판독 펜스
판독 펜스는 기입 펜스와 유사한 펜스의 보다 가벼운 형태이다. 판독 펜스는 펜스가 종료되기 전에 렌더링 동작을 위해 모든 메모리가 판독되지만, 몇몇의 기입은 여전히 미해결로 있는 것을 보장한다. 판독 펜스가 지원되면, 스케줄러는 그들이 비 렌더 타켓 할당의 수명을 제어할 것이다.
3. 파이프 펜스의 상단
파이프 펜스의 상단은 매우 경량의 펜스이다. 파이프 펜스의 상단을 위한 지원은 선택적이다. 파이프 펜스 상단은 단지 DMA 버퍼 내의 펜스 명령 전의 최종 바이트가 코프로세서에 의해 판독되는 것을 보장한다. (아직 프로세싱은 필요하지 않음) 코프로세서는 프로세싱되는 펜스 이후의 파이프 펜스의 상단에 선행하는 DMA 버퍼의 임의의 부분을 재판독할 수 없다. (DMA 버퍼의 컨텐트가 더 이상 유용하지 않기 때문임) 지원한다면, 이러한 펜스 형태는 DMA 버퍼의 수명을 제어하는 스케줄러에 의해 사용될 것이다.
트랩. 트랩은 본 발명의 다양한 실시예들에서 구현될 수 있다. 트랩은 코프로세서에 의해 프로세싱될 때 CPU 인터럽트를 생성할 수 있는 DMA 버퍼 내에 삽입된 명령일 수 있다. 코프로세서가 CPU를 인터럽트할 수 있기 전에, 트랩 명령에 선행하는 프리미티브들로부터의 모든 화소들이 회수되어 메모리에 적절하게 기입되는 것을 보장하는 것이 권고할만하다. (펜스 명령으로부터의 메모리 기입을 포함할 수 있는 동작) 이는 코프로세서가 전체 파이프라인을 스톨할 필요가 있다는 것을 의미하지 않는다는 것을 알아야 한다. 회수되는 트랩 이전에 명령의 마지막 화소를 코프로세서가 기다리는 동안 트랩 명령에 후속하는 프리미티브들이 실행될 수 있다.
트랩 명령은 특권 명령일 필요가 있으며 사용자 모드 드라이버에 의해 직접 구축된 것을 포함하는 임의의 DMA 버퍼에 삽입될 수 있다.
인에이블/디스에이블 컨텍스트 스위칭. 서브 트라이앵글(sub-triangle) 인터럽션을 지원하는 하드웨어를 위해, 컨텍스트 스위칭을 인에이블 및 디스에이블하는 명령이 제공될 수 있다. 컨텍스트 스위칭이 디스에이블되는 동안에, 코프로세서는 일반적으로 현재의 코프로세서 컨텍스트로부터 멀리 스위칭하지 않아야 한다. 코프로세서는 CPU가 새로운 런 리스트를 제공한다면 그 현재의 런 리스트 정보를 갱신하도록 요구될 수 있지만, 코프로세서는 컨텍스트 스위칭이 다시 인에이블될 때까지 그 새로운 런 리스트에 대한 컨텍스트 스위칭을 연기할 수 있다. OS는 컨텍스트 스위칭이 디스에이블될 때 다음의 규칙들이 유지되는 것을 보장할 수 있다.
1) 단지 특권 DMA 버퍼들만이 프로세싱될 것이다.
2) 컨텍스트 스위칭 명령들이 DMA 스트림에 제공되지 않을 것이다.
3) DMA 스트림은 명령을 고갈시키지 않을 것이다.
4) 페이지 폴트가 발생하지 않을 것이다. (페이지 레벨 폴팅이 지원된다면)
다수의 컴퓨터 시스템에서, 컨텍스트 스위칭 디스에이블 및 인에이블은 단지 특권 DMA 버퍼 내에 제공될 수 있는 특권 명령들이다. 이러한 명령들을 대한 사용 시나리오는 인터럽트되는 가능성없이 화면 (즉, 프레젠테이션 블릿) 상에 나타날 동작을 스케줄러가 스케줄링하도록 하는 것이다. 이러한 동작 인터럽트는 현저한 기간 동안 화면상에 보여질 수 있는 인공물을 유도할 수 있다.
코프로세서가 DMA 버퍼 내에 예상하지 않은 에러를 발생시킨다면, 컨텍스트 스위칭이 디스에이블된다해도 DMA 버퍼로부터 멀리 컨텍스트 스위칭할 수 있음을 알아야 한다. 커널 모드 내에 구축된 DMA 버퍼들만이 인터럽트 불가능한 부분들을 포함할 수 있으므로, 예상하지 않은 에러들은 드라이버 버그 또는 하드웨어 버그의 결과일 수 있다. 코프로세서가 시나리오들에서 멀리 컨텍스트 스위칭하지 않는다면, 디스플레이 워치독(display watchdog)은 의미를 파악할 것이며 시스템을 복구하기 위해 코프로세서를 리셋시킬 것이다.
옵션 제어 명령. 스케줄러가 상기 간단한 제어 명령들로 높은 레벨의 동기 프리미티브들을 구축할 수 있지만, 그 결과는 모다 효율적으로 이루어질 수 있다. 많은 컴퓨터 시스템들에서, 코프로세서 컨텍스트는 동기 객체의 소유권을 취할 수 있기 전에 CPU에 의해 인터럽트된다. 높은 빈도로 동기 객체가 취해지고 해제된다면, 이는 문제가 될 수 있다. 보다 효율적인 동기 프리미티브들을 갖기 위해, 스케줄러는 코프로세서로부터 특수 명령을 수신할 수 있다. 특히, 코프로세서는 "대기" 명령 및 "신호" 명령을 적절한 시간에 전송하도록 구성될 수 있다.
대기 명령은 특정 카운터의 값을 조사할 수 있다는 것을 코프로세서에 통보하도록 DMA 스트림에 삽입된다. 카운터가 0이 아니라면, 코프로세서는 카운터를 감소시키고 현재의 코프로세서 컨텍스트 실행을 계속할 수 있다. 카운터가 0이라면, 코프로세서는 대기 명령 전에 현재의 코프로세서 컨텍스트의 명령 포인터를 리셋시키고 런 리스트 내의 다음 컨텍스트로 스위칭할 수 있다. 코프로세서 컨텍스트가 대기 명령을 중단하고 후에 다시 스케줄링될 때, 코프로세서는 대기 조건이 여전히 만족되지 않은 것이 가능하므로 대기 명령을 재실행할 수 있다.
대기 명령은 단지 하나의 파라미터를 가질 필요가 있다. 가상 어드레스는 비교/감소되는 메모리 위치를 특정한다. 카운터는 적어도 32비트일 수 있고 임의의 유효 가상 어드레스일 수 있다. 양호한 실시예에서, 대기 명령은 비-인터럽트가능할 수 있다. 즉, 새로운 런 리스트가 코프로세서에 제공된다면, 대기 명령 전 또는 그 후에 새로운 런 리스트로 스위칭할 수 있다. 대기 명령들은 제한 DMA 버퍼와 특권 DMA 버퍼 모두에 삽입될 수 있다.
신호 명령은 코프로세서가 카운터의 값을 갱신할 수 있다는 것을 통지하도록 DMA 스트림에 삽입될 수 있다. 다음에, 코프로세서는 카운터 값을 1만큼 증가시킬 수 있다. 코프로세서는 가산 동안에 잠재적인 오버플로우를 무시할 수 있다. 다르게는, 코프로세서는 소프트웨어 버그 트래킹을 돕도록 오버플로우를 스트림 내의 에러로서 보고할 수 있다.
신호 명령은 단지 하나의 파라미터, 갱신되어야 하는 카운터의 가상 어드레스를 가질 필요가 있다. 카운터 크기는 대기 명령의 카운터 크기와 매칭될 수 있으며, 양호한 실시예에서는, 적어도 32비트이다. 신호 명령들은 제한 DMA 버퍼와 특권 DMA 버퍼 모두에 삽입될 수 있다.
플립
파이프라인 내의 버블(bubble)들 없이 이어서 실행하는 전체 화면 어플리케이션을 가능하게 하기 위해, 코프로세서는 플립(즉, 디스플레이의 베이스 어드레스의 변화)을 큐잉하는 명령을 제공할 수 있다. 디스플레이 면은 일반적으로 물리적인 메모리로부터 연속적으로 할당되고 가상 어드레스가 아닌 물리적인 어드레스를 사용하여 CRTC에 의해 참조된다. 그러므로, 플립 명령은 표시될 새로운 물리적인 어드레스로 CRTC를 프로그래밍하는데 사용될 수 있다. 이는 물리적인 어드레스이며 가상 어드레스가 아니므로, 로그 어플리케이션(rogue application)은 다른 어플리케이션 또는 사용자에 속하는 (비밀을 포함할 수 있는) 보조 메모리의 한 부분을 디스플레이하는 CRTC를 잠재적으로 프로그래밍할 수 있다. 이러한 이유로 인해, 플립 명령은 목적지가 유효화되면 커널 모드 드라이버에 의해서만 DMA 스트림으로 삽입되는 특권 명령이 존재하는 것을 보장함으로써 대부분의 컴퓨터 시스템들의 보안성을 보호하도록 구현될 수 있다.
플립 기능과 관련하여 사용되는 다양한 본 발명의 양호한 실시예들에서, 즉시 플립, 및 디스플레이 리프레시와 동기된 플립인, 적어도 2가지 형태의 플립들이 지원될 수 있다. 코프로세서가 즉시 플립을 프로세싱할 때, 보여질 수 있어도 디스플레이의 베이스 어드레스를 즉시 갱신할 수 있다. 코프로세서가 동기 플립을 프로세싱할 때, 새로운 베이스 어드레스를 래치할 수 있지만, 다음의 수직 동기 기간까지 그 갱신을 연기한다. 하나 이상의 동기 플립이 수직 동기 기간들 사이에서 코프로세서에 의해 프로세싱되면, 코프로세서는 단지 가장 최근의 것을 래치하고 이전의 것은 무시할 수 있다.
동기 플립을 프로세싱할 때, 코프로세서가 그래픽 파이프라인을 스톨하지 않을 수 있도록 다양한 실시예들이 구성될 수 있다. OS는 현재 보여지는 면에 대해 유도되는 링 버퍼 내의 임의의 렌더링 명령들을 큐잉하지 않는 것을 보장할 것이다. 다음에서 더 설명될 "최적화 플립"의 상황에서와 같이 요구없이 다른 실시예들이 구성될 수 있다는 것을 알아야 한다.
어느 면이 현재 보여지는지를 판정하기 위해, 드라이버는 먼저 특정한 큐잉된 플립이 발생되고 이벤트의 스케줄러를 통보, 즉 디스플레이 베이스 어드레스가 변화된 후에 스케줄러를 통보할 때를 판정할 수 있다. 즉시 플립을 위해, DMA 스트림으로부터 플립 명령을 판독하는 것은 갱신되는 디스플레이 면과 동일한 이벤트로 고려될 수 있기 때문에 플립이 발생될 때를 결정하는 것은 쉽다. 펜스 및 인터럽트가 특정한 플립이 판독된 것을 스케줄러에 통보하는 플립 명령에 후속하는 DMA 스트림에 삽입될 수 있다.
동기 플립의 경우에, 어느 면이 현재 보여지는지의 판정은 보다 어렵다. 코프로세서는 먼저 DMA 스트림으로부터 플립 명령을 판독하며 후에 다음의 수직동기 인터럽트에서 디스플레이 면을 갱신할 것이다. 그 시간 동안에 코프로세서를 스톨할 필요성을 제거하기 위해, 디스플레이 면 변화가 효과적일 때를 스케줄러에 통보하도록 메카니즘이 제공될 수 있다.
본 발명과 관련하여 사용하기 위해 상기 통보를 위한 메카니즘을 설계하는 많은 방법들이 존재한다. 한 간단한 시도가 도 22에 도시되어 있다. 도 22는 현재의 디스플레이 면에 대한 코프로세서를 질의하는 방법을 제공한다. 도시된 실시예에서, 이러한 기능은 MMIO 레지스터에 의해 제공될 수 있다. 도 22의 시스템은 , 레지스터가 최신의 "래치된 디스플레이 면"이 아닌 실제 면을 판독할 때 보다 우수한 신뢰도를 유도하는 설계이다. 최신의 래치된 디스플레이 면을 질의하는 것은 코프로세서가 화면상에 손상을 가져올 수 있는 다른 큐잉된 플립을 프로세싱하면서 레이스 조건(race condition)을 발생시킨다. 플립 명령이 임의의 적절한 기술을 사용하여 생성될 수 있다. 본 발명과의 호환을 위한 일반적인 요구사항은 구현된 해결책이 플립이 효과적일 때가지 수신확인되지 않을 것을 보장해야 하는 것이다.
큐잉 플립. 최대 성능을 제공하기 위해, 진보된 스케줄링 모델은 모니터를 소유하는 어플리케이션의 렌더링 스트림 내에 플립 동작들을 큐잉하도록 변경될 수 있다. n-버퍼링 수행 시, 스케줄러는 n-1개까지의 플립들이 DMA 스트림에 큐잉되도록 하며 n번째 플립이 삽입될 때 차단할 수 있다.
이는 코프로세서가 현재의 프레임 렌더링을 종료하고 그 플립을 프로세싱/수신 확인하는 동안 이중 버퍼링 시 스케줄러가 어플리케이션이 한 플립으로 큐잉되도록 할 수 있고 다음의 프레임에 대한 DMA 버퍼 준비를 계속하도록 할 수 있다는 것을 의미한다. 또한, 이는 어플리케이션이 그 시간까지 다음의 프레임에 대한 DMA 버퍼의 준비와 함께 완료되고 제2 플립을 제시한다면, 제1 플립이 코프로세서에 의해 수신 확인될 때까지 차단될 수 있다.
즉시 플립이 스케줄러에 의해 사용될 때, 상술한 바와 같이 플립들을 큐잉하는 메카니즘들이 동작한다. 그러나, 동기 플립을 사용할 때, 스케줄러는 플립 n-1을 지나서 큐잉되는 DMA 버퍼들에 특히 주의할 수 있다. 실제로, 그 플립을 지난 DMA 버퍼는 일반적으로 현재 보여지는 면에 대한 렌더링을 수행할 것이다. 대부분의 시스템에서, DMA 버퍼들은 현재 큐잉된 플립의 수가 다시 n-2 또는 그 아래로 떨어질 때까지 프로세싱되지 않을 것이 권고된다.
이러한 문제점을 해결하는 가장 간단한 시도는 단지 n-2개의 플립들이 n-1 대신에 큐잉되도록 하는 것이다. 그러나, 이러한 해결책은 또한 이중 버퍼링의 경우에 임의의 플립들을 큐잉하지 않아서, 대응하는 플립이 프로세싱될 때까지 각각의 프레임이 완료된 후에도 어플리케이션을 차단할 필요가 있다는 것을 의미한다.
이러한 셋팅의 양호한 시도가 도 23에 도시되어 있다. 도시된 바와 같이, n-1 플립의 큐잉이 허용된다. 플립 n-1 이후에 큐잉된 DMA 버퍼가 실행되는 것을 방지하기 위해, 스케줄러는 그 코프로세서 컨텍스트에 대한 가상 링 버퍼 내에 DMA 버퍼들을 누적할 수 있다. 스케줄러는 큐잉된 플립들의 수가 n-2로 다운되어 코프로세서 컨텍스트의 실제 링에 제시될 때까지 대기할 수 있다.
다수의 어플리케이션들이 한 번 실행될 때, 코프로세서는 도 23에 도시된 바와 같이 스톨하지 않아야 할 것이다. 코프로세서가 일반적으로 특정한 코프로세서 컨텍스트로부터의 DMA 버퍼 프로세싱을 중단하는 동안, 스케줄러는 코프로세서를 비지상태로 효과적으로 유지하면서 실행하는 다른 코프로세서 컨텍스트를 스케줄링할 수 있다. 그러나, 단일 어플리케이션이 실행중일 때, 예를 들어, 전체 화면 게임을 플레이 중일 때, 코프로세서는 그 간격을 스톨할 수 있다. 다음 섹션은 지원된다면 스톨링 시간(stalling time)을 감소시키도록 스케줄러에 의해 사용될 수 있는 메카니즘을 기술한다.
최적 플립. 전체 화면 어플리케이션들을 위한 최적화를 시도하기 위해서는, 코프로세서가 최소로 스톨하는 시간을 감소시켜야 한다. 도 23을 참조하면, 코프로세서가 적어도 2가지 이유, 첫째 프레임이 완료되지만 시스템이 플립에 대한 수직동기를 기다리기 때문인 것과, 둘째 플립이 완료되지만 시스템이 CPU에 통보하는 인터럽트를 기다리기 때문인 것에 대해 스톨할 수 있다.
첫 번째 이유로 인한 스톨링(stalling)을 감소시키기 위해, 보다 많은 버퍼들이 플립핑 체인(flipping chain)에 추가될 수 있다. 예를 들어, 이중 버퍼를 삼중 버퍼로 진행하는 것은 이러한 스톨링을 현저히 감소시킬 것이다. 이는 드라이버의 제어 하에서 항상 그렇게 수행되는 것은 아니지만, 불합리한 메모리 소모를 발생시킬 수 있다.
두 번째 이유로 인한 스톨링을 감소시키기 위해, 스톨에 대한 요구를 완전히 제거하는 메카니즘을 코프로세서에 추가하는 것이 가능하다. 코프로세서는 이전에 큐잉된 플립이 프로세싱되었을 때까지 코프로세서를 스톨하는 대기중 플립(wait-on-flip) 명령을 제공할 수 있다. 이러한 명령이 지원될 때, 스케줄러는 플립을 큐잉하기 위해 전체 화면 어플리케이션에 대해 사용할 수 있으며, CPU는 각각의 플립 후에 DMA 스트림을 재시작하지 않아야 한다.
높은 레벨 동기 객체
이미 정의된 제어 명령들을 사용하여, 스케줄러는 중요한 섹션 및 뮤텍스(mutex)와 같은 높은 레벨 동기 객체를 구축할 수 있다. 스케줄러는 대기 조건이 만족되면 CPU에 의해 명시적으로 다시 스케줄링될 때까지 DMA 버퍼의 섹션을 실행으로부터 보호함으로써 동기 프리미티브를 구현할 수 있다. 객체에 대한 대기는 스케줄러에 의해 펜스로서 구현될 수 있다. 펜스를 논리적으로 따르는 DMA 버퍼들은 스케줄러에 의해 큐잉될 수 있지만 대기 조건이 만족될 때까지 코프로세서 컨텍스트의 링으로 제시되지는 않는다. 일단 객체를 기다리면, 코프로세서 컨텍스트는 다음에 시그널링될 때까지 특정한 객체에 대한 대기 리스트로 스케줄러에의해 이동될 수 있다. 객체는 코프로세서 컨텍스트 DMA 스트림 내의 인터럽트 명령이 뒤따르는 펜스를 삽입함으로써 시그널링될 수 있다. 이러한 인터럽트를 수신할 때, 스케줄러는 어느 객체가 시그널링되는지를 식별할 수 있으며, 다음에 임의의 대기 코프로세서 컨텍스트들이 대기 큐에 다시 제공되는지를 판정한다. 대기 큐 내에 다시 코프로세서 컨텍스트를 제공할 때, 스케줄러는 링으로부터 다시 유지된 DMA 버퍼들을 삽입한다.
예를 들어, 어플리케이션이 생산자와 소비자 사이에 공유되는 면을 갖는 본 발명의 실시예를 고려하여, 어플리케이션은 렌더링 동안에 소비자가 항상 유효한 컨텐트를 사용하도록 자원들에 대한 억세스를 동기할 필요가 있다. 이러한 시나리오를 동기시키는 하나의 잠재적인 방법이 도 24에 도시되어 있다.
도 24를 참조하면, 스케줄러 측에서, 예를 들어, 임의의 조합 또는 다른 동작들과 결합하여 구현될 수 있는 다음의 커널 청크를 통해 동기가 구현될 수 있다.
1) CreateSynchronizationObject: 동기 객체를 위한 커널 트래킹 구조를 생성한다. 후속 대기/해제/삭제 호출에서 사용될 수 있는 사용자 모드로 객체에 대한 핸들을 복귀시킨다.
2) DeleteSynchronizationObject: 이전에 생성된 객체를 파괴한다.
3) WaitOnSingleObject/WaitOnMultipleObject: 대기중 동기 이벤트를 현재의 코프로세서 컨텍스트의 DMA 스트림으로 삽입한다. 대기중인 객체를 참조로 이벤트를 스케줄러 이벤트 히스토리로 삽입한다.
4) ReleaseObject/SignalObject: 신호 동기 이벤트를 현재의 코프로세서 컨텍스트의 DMA 스트림 (펜스/인터럽트)으로 삽입한다. 이 이벤트를 해제 또는 시그널링되는 객체를 참조로 스케줄러 이벤트 히스토리로 삽입한다.
뮤텍스에 대한 도 24의 설명을 적용하여, 코프로세서가 DMA 스트림 내의 동기 이벤트를 프로세싱하면, 스케줄러는 임의의 조합 또는 다른 동작들과의 조합으로 구현될 수 있는 다음의 동작들을 수행할 수 있다.
1) On a wait: 뮤텍스의 상태를 체크. 현재 뮤텍스를 취하지 않았으면, 뮤텍스를 취하고 스케줄러의 대기 큐로 다시 코프로세서 쓰레드를 제공한다. 뮤텍스를 이미 취했으면, 뮤텍스를 위한 대기 큐에 코프로세서 쓰레드를 제공한다.
2) On a signal: 몇몇의 다른 코프로세서 쓰레드들이 뮤텍스를 기다리는지를 체크한다. 몇몇의 다른 쓰레드들이 기다리면, 리스트에서 첫 번째 쓰레드를 취하고 다시 스케줄러의 대기 리스트에 그것을 제공한다. 대기중인 쓰레드가 없으면, 비차지 상태(non-taken state)에서 다시 뮤텍스를 제공한다.
이러한 메카니즘을 사용하여, 스케줄러가 구축될 수 있다. 예를 들어, 스케줄러에 의해 구축될 수 있는 동기 프리미티브들의 다음의 형태를 고려한다.
뮤텍스: 한 번에 단지 하나의 코프로세서가 공유된 자원에 대해 억세스할 수 있다.
세마포어(Semaphore): 특정한 수의 코프로세서 쓰레드들이 동시에 공유 자원들에 대한 억세스를 가질 수 있다.
통보 이벤트: 다수의 코프로세서 쓰레드가 다른 코프로세서 쓰레드로부터 신호를 대기할 수 있다.
몇몇의 시나리오에서, 어플리케이션은 코프로세서가 렌더링 명령 프로세싱을 완료했을 때 통보를 요청하도록 구성될 수 있다. 이를 지원하기 위해, 스케줄러는 제시하는 DMA 버퍼에 대한 통보를 드라이버가 요청하도록 할 수 있다. 다음에 코프로세서가 제시된 DMA 버퍼로 완료되면 시그널링될 수 있는 제시 시간에 드라이버가 CPU 동기 이벤트를 특정할 수 있다. 스케줄러는 주어진 코프로세서 컨텍스트의 링 내에 주어진 DMA 버퍼를 삽입할 수 있으며 다음에 사용자 모드 코프로세서 이벤트 통보를 링(인터럽트가 뒤따르는 펜스)에 추가한다. 코프로세서 이벤트가 코프로세서에 의해 프로세싱될 때, 스케줄러는 연관된 CPU 동기 이벤트들 시그널링할 수 있다.
스케줄러 이벤트 히스토리 버퍼
스케줄러는 여러 목적을 위해 상술한 동기 메카니즘을 사용할 수 있다. 인터럽트들은 코프로세서를 스톨하지 않으므로, CPU는 통보의 서브셋만을 필요로 하며, 따라서 몇몇의 통보가 함께 도달될 수 있다. DMA 버퍼의 각각의 통보에 대해 적절하게 응답하기 위해, 스케줄러는 이벤트를 프로세싱하도록 요구되는 임의의 파라미터들과 함께 삽입된 이벤트의 히스토리를 스케줄러가 유지할 수 있다.
이벤트 히스토리 버퍼는 스케줄러 프로세싱을 필요로 하는 각각의 이벤트를 트래킹하고 그 컨텍스트의 DMA 스트림으로 삽입되는 이벤트 정보의 코프로세서 컨텍스트 단위 어레이를 간소화할 수 있다. 스케줄러 펜스들은 이벤트를 동기시키도록 스케줄러에 의한 펜스 사용에 유의한다. 코프로세서 컨텍스트마다 하나의 펜스가 존재할 수 있으며, 보안성을 유지하기 위해, 펜스는 특권 명령을 통해서만 갱신될 수 있다. 임의의 경우에, 이러한 이벤트는 인터럽트 명령이 뒤따르는 펜스 명령으로서 DMA 스트림으로 삽입될 수 있다.
각각의 펜스 인터럽트 시에, 스케줄러는 먼저 현재의 펜스를 결정하고, 다음에 어느 이벤트가 발생하였는지를 판정하도록 이벤트 히스토리 버퍼로 진행한다. 이러한 판정은 연관된 펜스를 기초로 이루어진다. 스케줄러는 펜스 인터럽트를 프로세싱하도록 진행될 수 있다.
임의의 수의 이벤트들이 지원될 수 있다. 다음의 테이블은 현재 지원되는 몇몇의 이벤트들을 기술하고 있지만, 잠재적으로 지원되는 이벤트들의 수 또는 형태를 제한하려는 의도는 아니다.
이벤트 타입 기술 및 파라미터
DMA 버퍼의 말단 이 이벤트는 DMA 버퍼의 말단에 삽입된다. 이 이벤트가 스케줄러에 의해 프로세싱될 때, 연관된 DMA 버퍼는 그 프로세싱을 위해 DMA 버퍼 풀로 다시 제공된다.파라미터: 풀로 해제될 필요가 있는 DMA 버퍼에 대한 핸들
동기 객체 대기 이 이벤트는 코프로세서 쓰레드가 이벤트의 상태를 체크하고 잠재적으로 대기할 필요가 있을 때 삽입된다. 스케줄러가 이 이벤트를 프로세싱할 때, 대기 조건이 이미 만족되었는지를 체크하고 그렇다면 막 중지된 코프로세서 쓰레드를 다시 스케줄링한다. 대기 조건이 만족된다면, 코프로세서 쓰레드가 대기 상태에서 제공되고 동기 객체의 대기 큐에 추가된다.파라미터: 대기중인 객체에 대한 핸들
동기 객체 시그널링 이 이벤트는 코프로세서 쓰레드가 통보를 시그널링하거나 동기 객체를 해제할 때 삽입된다. 스케줄러가 이 이벤트를 프로세싱할 때, 객체의 상태를 변화시키고 잠재적으로 이벤트를 대기하는 몇몇의 코프로세서 쓰레드를 깨운다.파라미터: 해제되는 객체에 대한 핸들
사용자 모드 이벤트 통보 이 이벤트는 사용자 모드 드라이버가 렌더링 완료의 통보를 요청할 때 삽입된다. 스케줄러가 이 이벤트를 프로세싱할 때, 연관된 이벤트를 시그널링한다.파리미터: 시그널에 대한 이벤트
프로그래밍 가능한 PCI 애퍼쳐
오늘날의 코프로세서는 PCI 스펙에 의해 허용되는 제약조건에 매우 근접한 PCI 애퍼쳐를 드러내고 있다. 차세대 코프로세서는 애퍼쳐를 통해 노출될 수 있는 것보다 많은 보조 메모리를 보드 상에 가질 것이다. 그러므로, 장래에, 모든 모조 메모리가 동시에 PCI 애퍼쳐를 통해 보일 수 있을 것으로 가정할 수 없다.
이러한 제한이 작용할 수 있는 여러 방법들이 존재한다. 코프로세서 컨텍스트 단위 가상 어드레스 공간을 지원하는 진보된 스케줄링 모델은 4KB 단위로 보조 메모리 어디서나 리다이렉트될 수 있는 PCI 애퍼쳐를 사용하는 것이다. 이는 도 26에 도시되어 있다.
도 26에 도시된 바와 같이, PCI 애퍼쳐 페이지 테이블은 코프로세서 페이지 테이블에 독립적일 수 있다. 코프로세서가 그 자신을 컨텍스트로부터 컨텍스트로 스위칭하는 동안 PCI 애퍼쳐의 일부의 실행 및 억세스를 프로세싱하는 다수의 CPU가 존재할 수 있다. PCI 애퍼쳐를 위한 페이지 테이블은 모든 코프로세서 컨텍스트들 사이에서 공유되는 자원이며 보조 메모리로부터 할당된다. 드라이버는 보조 메모리 매니저 VidMm이 실행중인 어플리케이션 사이의 PCI 애퍼쳐 어드레스 공간을 관리하도록 하는 Map/Unmap DDI를 제공할 수 있다. PCI 애퍼쳐를 위한 페이지 테이블은 물리적인 어드레스를 사용하여 코프로세서에 의해 지칭될 수 있다.
PCI 애퍼쳐는 단지 어드레스 공간을 로컬 보조 메모리로 리다이렉트시키도록 구성될 수 있음을 알아야 한다. VidMm이 항상 시스템 메모리를 직접 매핑할 수 없으며, 그 애퍼쳐를 통할 수 없기 때문에 어드레스 공간을 시스템 메모리로 리다이렉트시킬 필요가 없다.
페이지 레벨 폴팅
이미 기술된 면 레벨 폴팅이 대부분의 경우에 일반적으로 잘 동작할 수 있지만, 향상될 수 있는 시나리오들이 존재한다. 예를 들어, 면 레벨 폴팅을 사용하여, 매우 큰 데이터 세트를 사용한 임의의 어플리케이션들은 한번에 메모리에 전체 데이터 세트를 얻을 수 없고, 따라서 적절하게 기능할 수 없다. 이에 대한 해결책은 진보된 모델로 페이지 레벨 폴팅 메카니즘을 구현하는 것이다.
페이지 레벨 폴팅으로, 이미 기술된 것과 유사한 모델이 동작한다. 주요 차이는 페이지 폴팅이 VidMm에 보고되고 핸들링되는 방법이다. 면 레벨 폴팅은 (한 자원을 페이징하는 것은 다른 요구되는 것을 퇴거시키는 것을 의미하는 무한 루프를 제거하기 위해) 순방향으로 진행하도록 필요한 자원의 엔트리 리스트를 코프로세서가 특정할 필요가 있지만, 페이지 레벨 폴팅은 코프로세서가 가상 어드레스의 리스트를 노출시킬 필요가 없다. 페이지 레벨 폴팅을 위해, 코프로세서는 단지 폴팅된 가상 어드레스만을 보고만을 필요로 한다. VidMm은 어드레스가 그 일부인 할당을 찾아서 단지 특정한 페이지가 상주될 필요가 있는지 또는 몇몇의 프리 페치이 요구되는지를 결정한다. 다수의 페이지가 단일 화소에 의해 요구될 때, 그 단일 화소에 대해 다수의 폴트들이 발생되는 것이 가능하다. 또한, 다른 페이지가 제공될 때 그 화소에 의해 요구되는 페이지가 퇴거되는 것이 가능하다. 그러나, 어플리케이션의 동작 세트가 화소에 의해 요구되는 페이지의 최대 수보다 충분히 크기만 하면, 페이지 폴트를 통한 루핑의 가능성은 매우 작다.
최종적으로, 본 명세서에 기술된 다양한 기술들은 하드웨어, 소프트웨어, 또는 이들의 적절한 조합으로 구현될 수 있다. 따라서, 본 발명의 방법 및 장치, 또는 그 특징 또는 일부는 플로피 디스켓, CD-ROM, 하드 드라이브, 또는 임의의 다른 기계 판독가능 저장 매체와 같은 유형의 매체에서 프로그램 코드(즉, 명령)의 형태를 취할 수 있으며, 프로그램 코드가 로딩되어 컴퓨터와 같은 기계에 의해 실행될 때, 그 기계는 본 발명을 실시하는 장치가 된다. 프로그래밍 가능한 컴퓨터 상에서 프로그램 코드가 실행되는 경우에, 그 컴퓨팅 장치는 일반적으로 프로세서, 프로세서에 의해 판독가능한 (휘발성 및 불휘발성 메모리 및/또는 스토리지 엘리먼트) 저장 매체, 적어도 하나의 입력 장치, 적어도 하나의 출력장치를 포함한다. 데이터 프로세싱 API, 재사용 제어 등을 통해 본 발명의 사용자 인터페이스 기술을 구현 또는 사용할 수 있는 하나 이상의 프로그램이 컴퓨터 시스템과 통신하도록 높은 레벨의 순차적 도는 객체 지향 프로그래밍 언어로 양호하게 구현될 수 있다. 그러나, 프로그램(들)은 원한다면 어셈블리 언어 또는 기계어로 구현될 수 있다. 임의의 경우에, 언어는 하드웨어 구현과 함께 컴파일 또는 번역되거나 조합될 수 있다.
예시적인 실시예들은 단독형 컴퓨터 시스템의 컨텍스트에서 본 발명을 사용하는 것을 지칭하였지만, 본 발명은 이로써 제한되는 것은 아니라, 네트워크 또는 분산 컴퓨팅 환경과 같은 임의의 컴퓨팅 환경으로 구현될 수 있다. 또한, 본 발명은 복수의 프로세싱 칩 또는 장치로 구현될 수 있으며, 스토리지는 복수의 장치들에 걸쳐 유사하게 결과를 발생시킬 수 있다. 이러한 장치들은 개인용 컴퓨터, 네트워크 서버, 핸드핼드 장치, 수퍼컴퓨터, 또는 자동차 및 비행기와 같이 다른 시스템에 통합된 컴퓨터를 포함할 수 있다. 그러므로, 본 발명은 임의의 단일 실시예로 제한되지 않으며, 첨부된 특허청구범위에 따라 그 사상과 범위가 구성되어야 한다.
본 발명에 따르면, 코프로세서 태스크들 및 코프로세서 자원들의 다른 사용을 효율적으로 스케줄링하기 위한 시스템 및 방법이 제공된다.
도 1은 코프로세서를 위해 프로세싱을 스케줄링하는 종래 기술의 시도에 대한 개념도.
도 2는 본 발명에 따른 코프로세서 스케줄링 향상을 도시한 예시도.
도 3은 도 2에 개념적으로 도시된 스케줄링 향상을 제공하는데 포함된 연산 컴포넌트들의 상세도.
도 4a 및 도 4b는 도 3의 단계들을 기능 시퀀스로 결합하도록 다양한 비제한 가능 방법들을 증명하는 의사코드 알고리즘(pseudocode algorithms)을 도시한 도면.
도 5는 본 발명에 따른 직접 메모리 억세스(DMA : Direct Memory Access) 버퍼에 사용된 메모리 자원들에 대한 타임라인(timeline)을 정의한 제공된 정보를 어떻게 스케줄러가 사용할 수 있는지를 도시한 도면.
도 6은 본 발명에 따른 프리퍼레이션 워커 쓰레드(preparation worker thread)와 보조 메모리 매니저 사이의 동력을 나타내는 알고리즘을 도시한 도면.
도 7은 본 발명에 따른 페이징 버퍼를 준비하는 워커 쓰레드를 나타내는 페이징 버퍼의 준비 및 페이징 버퍼에 대한 CPU 프로세싱의 핸들링을 도시한 예시도.
도 8은 본 발명에 따른 페이징 버퍼 내의 펜스(fence)의 핸들링을 포함하는 워커 쓰레드를 시작할 수 있는 이벤트들의 체인을 나타내는 알고리즘을 도시한 도면.
도 9는 코프로세서 컨텍스트들을 위한 가상 어드레스 공간을 제공할 수 있으며, 공정한 메모리 공유를 이룰 수 있도록 다양한 코프로세서 컨텍스트들 사이의 물리적인 메모리를 관리할 수 있는 커널 모드(kernel mode)의 보조 메모리 매니저 "VidMm"을 도시한 도면.
도 10은 본 발명에 따른 기본 스케줄링 모델을 도시한 도면.
도 11은 본 발명에 따른 진보된 스케줄링 모델을 도시한 도면.
도 12a 및 도 12b는 진보된 스케줄링 모델을 구현할 수 있는 동작의 시퀀스의 예시도.
도 13은 가변 길이 플랫 페이트 테이블(flat pate table)과 관련한 본 발명의 사용을 도시한 도면.
도 14는 멀티 레벨 페이지 테이블과 관련한 본 발명의 사용을 도시한 도면.
도 15는 면 수준 폴팅(surface-level faulting)을 지원하는 진보된 스케줄링 모델과 관련한 스케줄러에 의해 유지되는 예시적인 프로세스들을 도시한 도면.
도 16은 면 수준 폴팅이 본 발명과 관련하여 구현될 때 동시에 처리될 수 있는 각각 그 자신의 DMA를 갖는 다수의 컨텍스트들을 도시한 도면.
도 17a, 도 17b 및 도 17c는 유용함을 설명할 수 있는 다양한 부가 특징들을 포함하는 도 16의 컴포넌트들과 관련하여 본 발명의 동작을 기술한 의사코드 알고리즘(pseudocode algorithm)을 도시한 도면.
도 18은 본 발명에 따른 런 리스트(run list)의 사용을 개념적으로 나타내는 도면.
도 19는 본 발명과 관련한 사용을 위해 스케줄러에 의해 판독가능한 특정 시스템 메모리 위치에 컨텍스트 스위치 히스토리(context switch history)를 기입할 수 있는 하드웨어의 동작을 도시한 도면.
도 20은 특권 명령(privileged commands)을 직접 코프로세서 컨텍스트 링에 삽입함으로써 특권 DMA 채널들을 지원하는 하드웨어적 시도를 도시한 도면.
도 21은 간접 명령 내에 한 비트가 링 버퍼로 삽입되는 코프로세서 내의 특권 DMA 버퍼들에 대한 제한을 지원하는 시도를 도시한 도면.
도 22는 현재의 디스플레이 면에 대해 코프로세서에 질의하는 방법을 도시한 도면.
도 23은 본 발명과 관련하여 이미디어트 플립(immediate flips)이 사용될 때 플립들에 질의하는 양호한 방법을 도시한 도면.
도 24는 렌더링 동안에 2개 이상의 프로세서가 유효 컨텐트(valid content)를 사용할 수 있는 것을 보장하도록 자원들에 대한 억세스를 동기시키기 위한 예시적인 기술을 도시한 도면.
도 25는 이벤트 히스토리 버퍼의 다양한 실시예들을 도시한 도면.
도 26은 보조 메모리 어디서나 리다이렉트될 수 있는 PCI 애퍼쳐(aperture)를 사용한 코프로세서 컨텍스트 단위(per-coprocessor context) 가상 어드레스 공간들을 지원하는 양호한 방법을 도시한 도면.

Claims (37)

  1. 코프로세서에 의한 처리를 위한 태스크들을 스케줄링하기 위한 방법으로서,
    상기 태스크의 처리를 시작하기 전에,
    상기 코프로세서에 의해 액세스가능한 메모리 공간 내의, 상기 태스크와 관련된 메모리 리소스를 코프로세서 판독가능 메모리로 페이징함으로써 코프로세서에서 처리하기 위한 태스크를 준비하는 단계와,
    상기 메모리 리소스를 샘플링하여 필요한 메모리 리소스가 상기 코프로세서 판독가능 메모리 내의 소정의 위치에 있는지를 판정하는 단계와,
    필요한 메모리 리소스가 상기 코프로세서 판독가능한 메모리 내의 소정의 위치에 있는지를 기록하는 단계 - 상기 기록하는 단계는 상기 태스크와 관련된 인디케이터(indicator) 메모리 리소스를 생성함 -와,
    상기 태스크의 처리 시작 시에 상기 인디케이터 메모리 리소스를 처리하는 단계 - 필요한 메모리 리소스가 상기 코프로세서 판독가능 메모리 내의 소정의 위치에 있지 않다고 상기 인디케이터 메모리 리소스가 나타내면, 제1 페이지 폴트(fault)가 발생하고, 상기 코프로세서는 상기 태스크의 처리를 시작하는 것을 중단하고 상기 코프로세서가 처리를 중단한 태스크들을 포함하는 리스트가 보유됨 -와,
    무효한 링 버퍼 또는 무효한 DMA 버퍼를 참조하는 태스크로의 컨텍스트 스위치(context switch)가 일어나면 제2 페이지 폴트를 발생시키는 단계
    를 포함하는 코프로세서에 의한 처리를 위한 태스크들을 스케줄링하기 위한 방법.
  2. 제1항에 있어서,
    상기 코프로세서는 GPU(Graphics Processing Unit)인, 코프로세서에 의한 처리를 위한 태스크들을 스케줄링하기 위한 방법.
  3. 제1항에 있어서,
    상기 태스크는 DMA 버퍼에 의해 대표되는, 코프로세서에 의한 처리를 위한 태스크들을 스케줄링하기 위한 방법.
  4. 제1항에 있어서,
    상기 리스트를 이용하여, 필요한 메모리 리소스를 차후에 코프로세서 판독가능한 메모리 내의 소정의 위치로 가져오는 단계를 더 포함하는, 코프로세서에 의한 처리를 위한 태스크들을 스케줄링하기 위한 방법.
  5. 제4항에 있어서,
    상기 차후는 상기 리스트 상의 태스크의 우선 순위에 기초하여 결정되는, 코프로세서에 의한 처리를 위한 태스크들을 스케줄링하기 위한 방법.
  6. 제5항에 있어서,
    결국에는 모든 태스크가 처리될 수 있는 것을 보장하기 위하여 상기 리스트 상의 하나 이상의 태스크의 우선 순위를 증가시키는 주기적 우선 순위 부스트(periodic priority boost)를 더 포함하는, 코프로세서에 의한 처리를 위한 태스크들을 스케줄링하기 위한 방법.
  7. 코프로세서에 의한 처리를 위한 태스크들을 스케줄링하기 위한 방법으로서,
    상기 태스크의 처리를 시작하기 전에
    GPU(Graphics Processing Unit)에 의해 액세스가능한 메모리 공간 내의, 상기 태스크와 관련된 메모리 리소스를 GPU 판독가능 메모리 내에 페이징함으로써 GPU에서 처리하기 위한 태스크를 준비하는 단계와,
    상기 메모리 리소스를 샘플링하여 필요한 메모리 리소스가 상기 GPU 판독가능 메모리 내의 소정의 위치에 있는지를 판정하는 단계와,
    필요한 메모리 리소스가 상기 GPU 판독가능한 메모리 내의 소정의 위치에 있는지를 기록하는 단계 - 상기 기록하는 단계는 상기 태스크와 관련된 인디케이터 메모리 리소스를 생성함 -와,
    상기 태스크 처리를 시작하기 전에 상기 인디케이터 메모리 리소스를 처리하는 단계 - 필요한 메모리 리소스가 상기 GPU 판독가능 메모리 내의 소정의 위치에 있지 않다고 상기 인디케이터 메모리 리소스가 나타내면, 제1 페이지 폴트가 발생하고, 상기 코프로세서는 상기 태스크의 처리의 시작을 중단하고, 상기 코프로세서가 처리를 중단한 태스크들을 포함하는 리스트가 보유됨 - 와,
    무효한 링 버퍼 또는 무효한 DMA 버퍼를 참조하는 태스크로의 컨텍스트 스위치(context switch)가 일어나면 제2 페이지 폴트를 발생시키는 단계
    를 포함하는, 코프로세서에 의한 처리를 위한 태스크들을 스케줄링하기 위한 방법.
  8. 제7항에 있어서,
    상기 태스크는 DMA 버퍼에 의해 대표되는, 코프로세서에 의한 처리를 위한 태스크들을 스케줄링하기 위한 방법.
  9. 제7항에 있어서,
    차후는 상기 리스트 상의 태스크의 우선 순위에 기초하여 결정되는, 코프로세서에 의한 처리를 위한 태스크들을 스케줄링하기 위한 방법.
  10. 제9항에 있어서,
    결국에는 모든 태스크가 처리될 수 있는 것을 보장하기 위하여 상기 리스트 상의 하나 이상의 태스크의 우선 순위를 증가시키는 주기적 우선 순위 부스트를 더 포함하는, 코프로세서에 의한 처리를 위한 태스크들을 스케줄링하기 위한 방법.
  11. 삭제
  12. 삭제
  13. 삭제
  14. 삭제
  15. 삭제
  16. 삭제
  17. 삭제
  18. 삭제
  19. 삭제
  20. 삭제
  21. 삭제
  22. 삭제
  23. 삭제
  24. 삭제
  25. 삭제
  26. 삭제
  27. 삭제
  28. 삭제
  29. 삭제
  30. 삭제
  31. 삭제
  32. 삭제
  33. 삭제
  34. 삭제
  35. 삭제
  36. 삭제
  37. 삭제
KR1020040010768A 2003-02-18 2004-02-18 코프로세서 내의 연산을 스트림라인하는 방법 KR101130361B1 (ko)

Priority Applications (1)

Application Number Priority Date Filing Date Title
KR1020040010768A KR101130361B1 (ko) 2003-02-18 2004-02-18 코프로세서 내의 연산을 스트림라인하는 방법

Applications Claiming Priority (6)

Application Number Priority Date Filing Date Title
US60/448,400 2003-02-18
US60/448,402 2003-02-18
US60/448,399 2003-02-18
US60/474,513 2003-05-29
US10/763,778 2004-01-22
KR1020040010768A KR101130361B1 (ko) 2003-02-18 2004-02-18 코프로세서 내의 연산을 스트림라인하는 방법

Publications (2)

Publication Number Publication Date
KR20040074628A KR20040074628A (ko) 2004-08-25
KR101130361B1 true KR101130361B1 (ko) 2012-09-18

Family

ID=37361287

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020040010768A KR101130361B1 (ko) 2003-02-18 2004-02-18 코프로세서 내의 연산을 스트림라인하는 방법

Country Status (1)

Country Link
KR (1) KR101130361B1 (ko)

Families Citing this family (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR101014028B1 (ko) * 2008-11-26 2011-02-14 한양대학교 산학협력단 고속 블록 입출력을 위한 적응성 문맥전환 방법 및 장치
US7930519B2 (en) * 2008-12-17 2011-04-19 Advanced Micro Devices, Inc. Processor with coprocessor interfacing functional unit for forwarding result from coprocessor to retirement unit
GB2573316B (en) * 2018-05-02 2021-01-27 Advanced Risc Mach Ltd Data processing systems

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6023738A (en) 1998-03-30 2000-02-08 Nvidia Corporation Method and apparatus for accelerating the transfer of graphical images
US6065071A (en) 1998-03-26 2000-05-16 Nvidia Corporation Method and apparatus for trapping unimplemented operations in input/output devices
WO2002009083A2 (en) 2000-07-20 2002-01-31 International Business Machines Corporation Method and apparatus for graphics context switching
US6437788B1 (en) 1999-07-16 2002-08-20 International Business Machines Corporation Synchronizing graphics texture management in a computer system using threads

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6065071A (en) 1998-03-26 2000-05-16 Nvidia Corporation Method and apparatus for trapping unimplemented operations in input/output devices
US6023738A (en) 1998-03-30 2000-02-08 Nvidia Corporation Method and apparatus for accelerating the transfer of graphical images
US6437788B1 (en) 1999-07-16 2002-08-20 International Business Machines Corporation Synchronizing graphics texture management in a computer system using threads
WO2002009083A2 (en) 2000-07-20 2002-01-31 International Business Machines Corporation Method and apparatus for graphics context switching

Also Published As

Publication number Publication date
KR20040074628A (ko) 2004-08-25

Similar Documents

Publication Publication Date Title
JP5335743B2 (ja) タスクのスケジューリングを支援する装置
US7421694B2 (en) Systems and methods for enhancing performance of a coprocessor
US8578129B2 (en) Infrastructure support for accelerated processing device memory paging without operating system integration
JP5170782B2 (ja) ヘテロジニアス処理ユニットのための集中デバイス仮想化レイヤ
US7000072B1 (en) Cache memory allocation method
US7383412B1 (en) On-demand memory synchronization for peripheral systems with multiple parallel processors
US6055650A (en) Processor configured to detect program phase changes and to adapt thereto
US10824467B2 (en) Data processing system with protected mode of operation for processing protected content
KR100988395B1 (ko) 태스크 스케줄링 방법, 태스크 스케줄링 지원 장치, 코프로세싱 스케줄러에 관련하여 사용하기 위한 코프로세서, 및 컴퓨터 판독가능 저장 매체
US11741019B2 (en) Memory pools in a memory model for a unified computing system
US8416253B2 (en) Apparatus, method, and recording medium for detecting update of image information
KR101693662B1 (ko) 하드웨어 컨텍스트 복구 흐름 동안에 프로그램가능한 소프트웨어 컨텍스트 상태 실행을 지원하기 위한 방법 및 장치
KR101130361B1 (ko) 코프로세서 내의 연산을 스트림라인하는 방법
Groote et al. Computer Organization
US20080127048A1 (en) Method And System Of Accessing Display Window Memory

Legal Events

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

Payment date: 20150217

Year of fee payment: 4

FPAY Annual fee payment

Payment date: 20160218

Year of fee payment: 5

FPAY Annual fee payment

Payment date: 20170220

Year of fee payment: 6

FPAY Annual fee payment

Payment date: 20180219

Year of fee payment: 7

FPAY Annual fee payment

Payment date: 20200218

Year of fee payment: 9