사용자 공간에서 하드웨어에 직접 접근할 수 있나요?

사용자 공간에서 하드웨어에 직접 접근할 수 있나요?

직장에는 DOS 소프트웨어로 제어되는 내장 장치가 있습니다. 나는 차세대 하드웨어에서 DOS용 대체 OS로서 Linux의 사용을 평가하는 책임을 맡았습니다. 내 연구에 따르면 DOS는 원할 경우 잠재적으로 위험한 일을 수행할 수 있는 완전히 다른 유형의 운영 체제일 뿐이라는 결론에 도달했습니다. 제가 이해한 바에 따르면 하드웨어에 직접 액세스하려면 사용자 정의 드라이버를 작성해야 합니다. 상사의 호기심을 충족시키기 위해 내가 알아야 할 사항은 다음과 같습니다.사용자 공간에서 직접 하드웨어에 액세스하는 것이 가능합니까???

내 생각은 '아니다'이지만, 나보다 훨씬 더 많은 지식을 갖고 있는 분들의 의견을 묻고 싶습니다.

답변1

예, 하지만 거의 유용하지 않습니다. 32비트 x86 시스템에서는 시스템 ioperm(2)호출을 사용하여 현재 프로세스가 포트 I/O를 직접 수행할 수 있도록 설정할 수 있습니다. 나는 이것이 64비트 시스템에서는 작동하지 않는다고 생각합니다. 당신은 또한 lseek/read/write조합을 할 수 /dev/port있으며 이것도 마찬가지로 이식성이 좋지 않다고 생각합니다. 보다http://tldp.org/HOWTO/IO-Port-Programming-2.html자세한 내용은 이 두 접근 방식 모두 물론 장치 드라이버를 작성하는 것보다 훨씬 느리고 유연성이 떨어집니다( /dev/port가장 느림). 물론 이러한 사용자 공간 메커니즘 중 어느 것도 인터럽트나 이와 유사한 것을 처리할 수 없습니다. 성능이 문제라면 결국 장치 드라이버를 작성하게 될 것입니다.

답변2

당신의 추측이 정확합니다. 커널은 하드웨어 요청을 보낼 수 있는 유일한 소프트웨어입니다. 이는 Linux에만 적용되는 것이 아닙니다. DOS보다 최신 운영 체제에서는 하드웨어에 직접 액세스할 수 없습니다. 왜냐하면 여러분도 의심하는 것처럼 하드웨어는 상당히 위험하기 때문입니다.

그러나 자신만의 드라이버를 작성하는 데에는 문제가 없으며 많은 문서가 제공됩니다. 예를 들어,xatlantis의 이 튜토리얼최근의 (중요한 것입니다!) 좋은 소스인 것 같습니다.

답변3

사용자 공간에서 하드웨어에 접근하는 것은 확실히 가능합니다. 특히 하드웨어 레지스터가 메모리 매핑된 경우. 예를 들어,UIO.

관련 정보