2009-04-22 3 views
3

PCI 구성 공간의 레지스터에 액세스해야 할 경우 DWORD를 구성 공간으로 읽고 쓰는 데 필요한 내장 BIOS 기능을 사용하기 만하면됩니까?PCI 구성 공간에서 레지스터에 액세스하는 올바른 방법

예를 들어, B0 : D31 : F1에있는 IDE 컨트롤러를 사용하려는 경우 해당 BDF를 BIOS 기능의 매개 변수로 사용하여 구성 레지스터를 읽고 쓰려면 어떻게합니까? 따라서 공급 업체 ID를 얻으려면 주어진 BDF에서 첫 번째 DWORD를 읽어야합니다.

아니면 기본 버전입니까?

편집 : PCI의 BIOS 사양에

, 내가 읽기 위해 BIOS 기능의 정의를 찾고 및 구성 공간에 단어를 쓰고있다. 필자가 생각하기에는 구성 공간 내의 다양한 오프셋에서 레지스터에 쓸 수 있습니다. 제 질문은이 레벨에서이 레지스터에 액세스하는 올바른 방법일까요?

+0

대상 OS는 무엇입니까? – Michael

+0

대상 OS는 학교 프로젝트입니다. 한 학기 동안 매우 간단한 OS가 개발되었습니다. 내 프로젝트는 간단한 디스크 드라이버를 개발하는 것입니다. –

답변

2

PCI 사양을 읽은 후 주어진 인터럽트 벡터 (1Ah)를 통해 PCI BIOS 기능을 호출하기 만하면됩니다. 그러나 이것은 PCI 구성에 의해 복잡해지기 때문에 먼저 이루어져야합니다.

PCI 구성 공간은 액세스를 위해 명시 적 주소를 사용하는 것 같지 않지만 BIOS 함수 호출을 나타냅니다.

EDIT : 실제로 BIOS는 내가 아는 것보다 훨씬 많은 것을 알고 있습니다. IDE 컨트롤러의 장치와 공급 업체 ID를 찾을 때까지 PCI 버스를 나열해야했습니다. 필요한 어셈블리는 입/출력 포트 래퍼뿐이었습니다.


pci_dev_t dev = { 0xffffffff, 0xffffffff, 0xffffffff }; 

for (bus = 0; bus < 0xffff; ++bus) { 
    for (slot = 0; slot < 0xffff; ++slot) { 
    for (func = 0; func < 0xff; ++func) { 
     uint16_t dev_id = _pci_read_config_data(bus, slot, func, 0x00, PCI_READ_CONFIG_WORD); 
     uint16_t vend_id = _pci_read_config_data(bus, slot, func, 0x02, PCI_READ_CONFIG_WORD); 

     if ((vendor == vend_id) && (device == dev_id)) { 
     dev.bus  = bus; 
     dev.device = slot; 
     dev.function = func; 

     return dev; 
     } 
    } 
    } 
} 
+0

코드/호출의 예를 제공 할 수 있습니까? –

+0

@IanVaughan 어쩌면 원래 질문이 그렇게 좋지 않았을 수도 있지만 게시 된 코드는 내가 필요한 것일 수도 있습니다. 나는 그저 쉬웠다 고 생각하기 전에 여러 개의 루프를 돌았습니다. –

관련 문제