프로그램이 장치 드라이버와 정확히 어떻게 대화합니까?


12

그래서 프로그래머가 컴퓨터의 장치와 정확히 대화하는 방식에 혼란 스럽습니다. 지금은 큰 아이디어를 말하는 것이 아닙니다. 다른 프로그램에서 기능을 사용할 수 있도록 하드웨어 위에 장치 드라이버가 있다는 것을 알고 있습니다.

그러나 일반적으로 누가 운전자와 정확하게 대화합니까? 프로그래머가 응용 프로그램을 작성하여 드라이버에서 함수를 호출해야합니까? 또는 프로그래머가 운영 체제를 통해 함수를 호출 한 다음 드라이버 호출을 처리합니까?



1
둘 다 약간이며 OS 및 장치 유형에 따라 다릅니다.
whatsisname

답변:


12

운영 체제가 관련된 경우 프로그램은 최소한 직접적으로 장치 드라이버와 통신하지 않습니다. 프로그램은 자신에게 알려지지 않은 추상화에 대해 이야기하고 결국 결국 하나 이상의 추상화 계층을 통해 장치 드라이버와 대화하게됩니다.

현대 운영 체제의 복잡성을 건너 뛰고 45 년 전에 개발 된 마이크로 컴퓨터 운영 체제 인 CP / M을 예로 사용하겠습니다 . CP / M은 3 개의 레이어가있는 레이어 케이크입니다.

프로그램. 최상위 계층은 계산 및 I / O를 수행하여 유용한 기능 (워드 처리, Space Invader 재생)을 수행 하는 프로그램 입니다. 어떤 시점에서 프로그램은 사용자가 볼 수 있도록 문자 'A'를 표시하려고한다고 가정 해 봅시다. CP / M은 콘솔 이라고하는 추상화를 제공하며 , 여기서 프로그램과 상호 작용하는 사용자가 찾아야합니다. 문자를 보내는 일반적인 방법은 몇 가지 조립 지침이 있습니다.

LD C,2   ; Load 2 into register C
LD E,65  ; Load the ASCII code for 'A' into register E
CALL 5   ; Call CP/M's routine for getting things done

(당신이 그들에 익숙하지 않은 경우, 레지스터는 프로세서에 살고 변수로 생각 될 수있다.) 우리는 어떤 마법 번호를 얻을 것이다 25분에 대해 모두. 여기서의 모든 테이크 아웃은 콘솔이 있고 콘솔에 쓸 수있는 방법이 있다는 것입니다. 그 이상의 것을 알거나 신경 쓰지 않습니다. 이는 CP / M이 I / O에 사용하는 두 가지 추상화 중 첫 번째입니다.

BDOS . 5프로그램이 호출 한 주소 는 다음 계층의 기본 디스크 운영 체제 또는 BDOS 의 진입 점입니다 . BDOS는 식당 메뉴에서 번호로 주문하는 것과 같이 번호가 매겨진 기능의 전체 래프트를 제공 합니다. C함수 번호 ( 2콘솔 출력의 경우)가있는 E레지스터와 전송할 문자가있는 레지스터를 로드하여 콘솔 출력을 원한다고 알려줍니다 . 콘솔 출력은 매우 간단한 작업이며 BDOS는 다음 계층을 호출하는 것 외에는 실제로 많은 작업을 수행 할 필요가 없습니다.

BIOS. BIOS 또는 기본 입 / 출력 시스템 은 모든 하드웨어 별 코드가있는 계층입니다. 현대 시스템에서 이는 일련의 장치 드라이버로 간주됩니다. BDOS와 마찬가지로 BIOS는 BDOS가 비즈니스를 수행하는 데 사용하는 매우 원시적 인 표준 작업 집합을 요구합니다 . 이러한 작업 중 하나를CONOUT프로그램이 요청한 문자를 하드웨어가 무엇이든간에 두 개의 레이어를 작성하도록 요청합니다. (PC와 달리 상황은 균질하지 않았습니다. 모든 사람의 시스템은 다른 방식으로 작업을 수행했습니다.) 콘솔 출력은 BDOS에 대한 간단한 통과이지만 디스크에 파일을 작성하는 것과 같이 더 복잡한 작업을 수행하려면 많은 것이 필요할 수 있습니다. BIOS는 미디어를 조작하기 위해 호출합니다. 다시 말하지만, BIOS에는 표준 추상 인터페이스가 있기 때문에 BDOS는 항상 원하는 것을 얻는 방법을 알고 있으며 BIOS가 어떻게 하는지를 신경 쓰지 않습니다.

왜 하나가 아닌 두 개의 추상화 (프로그램 -BDOS 및 BDOS-BIOS)가 있는지 궁금 할 것입니다. 대답은 CP / M과 BDOS가 컴퓨터 제조업체에 바이너리 형태로 제공 될 수 있다는 것입니다. 하드웨어 용 장치 드라이버를 사용하여 사용자 지정 BIOS를 작성하고이 두 가지를 함께 묶어 시스템의 OS로 제공합니다. BDOS는 한 조직에서 유지 관리하고 사용자 프로그램에 항상 알려진 양이므로 매우 다양한 (시간 동안) 다양한 하드웨어에서 동일한 응용 프로그램을 실행할 수 있기 때문에 이는 큰 문제였습니다. 그렇기 때문에 운영 체제가 존재하며 하드웨어를 직접 뒤틀는 프로그램작성 하지는 않습니다 .

여기서 설명한 모든 내용은 최신 운영 체제에도 적용됩니다. 예를 들어 유닉스는 모든 것을 파일로 추상화합니다. 이 프로그램을 시스템 호출의 동일한 세트 (제공 open(), write(), close()그것은 디스크 드라이브 또는 직렬 포트인지 의사 소통 등). 일련의 결정과 추상화는 훨씬 더 복잡하지만 결국에는 작업을 수행하기 위해 최하위 계층에서 어떤 장치 드라이버 코드를 실행해야하는지 결정하는 결과가 나옵니다.


전 정말 CP / M 코드를보고하지 않은 (그것의 작은 내 시간 전에 ... 난 중고 CP / M 컴퓨터를했지만 그들을 위해 코드를 작성하지 않음),하지만 난 오히려의 사용에 의해 놀라게있어 call 5여기. 하지 않을까요 rst 8(가 목적지 주소에서 메모리의 3 바이트를 희생하지만 것이이 호출 할 때마다 다른 이름으로 저장 ...) 훨씬 더 효과적?
Jules

@Jules : CP / M은 8080을 위해 개발되었으며, 인터럽트 장치는 RST데이터 버스에 단일 바이트 명령 (보통 )을 넣을 수있는 인터럽트 모드가 하나뿐입니다 . 확실하게 말할 수는 없지만 모든 장치의 요구 사항과 DDT (브레이크 포인트를 발생시키는 데 사용됨) 및 BDOS에 들어가기 위해 하나를 사용하는 데 필요한 슬롯이 충분하지 않은 것 같습니다 .
Blrfl

아 그렇습니다. 내 8 비트 개발 경험은 단 하나의 인터럽트 소스 만있는 머신으로 제한되어 있으므로 걱정할 필요가 없습니다 ... :)
Jules

빠른 질문,이 프로세스는 Windows OS 및 Windows 커널과 더 관련이 있습니까? 아니면 그것에 대해 새로운 질문을해야합니까?
Jason

@Jason : Wikipedia에는 아키텍처를 설명 하고 답변을 제공 하는 페이지가 있습니다. 1993 년 이래 Microsoft가 생산 한 모든 것이이 아키텍처를 사용합니다. 케이크에 더 많은 레이어가있는 것과 거의 동일합니다.
Blrfl

0

여러 가지 가능성이 있습니다.

  • 일반적으로 사용되는 장치의 경우 OS에는 종종 드라이버가 구현하고 사용자 언어의 표준 라이브러리에 맞는 API가 포함됩니다. 일반적인 예 : 파일 시스템, 프린터, 네트워크, MIDI 기기.
  • 보다 이국적인 장치의 경우 장치 제조업체에서 드라이버를 제공해야하며 때로는 인기있는 언어에 대한 언어 바인딩도 포함됩니다. 최소한 C 바인딩이 있으며 거의 ​​모든 언어가 C 라이브러리를 호출하는 방법이 있습니다.
  • 이 두 경우 사이에 간단한 장치는 직렬 포트와 같은 범용 연결을 사용할 수 있으며 제조업체는 일반 직렬 포트 드라이버를 통해 사용할 수있는 프로토콜 만 게시합니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.