![사용자 공간에서 하드웨어에 직접 접근할 수 있나요?](https://rvso.com/image/23938/%EC%82%AC%EC%9A%A9%EC%9E%90%20%EA%B3%B5%EA%B0%84%EC%97%90%EC%84%9C%20%ED%95%98%EB%93%9C%EC%9B%A8%EC%96%B4%EC%97%90%20%EC%A7%81%EC%A0%91%20%EC%A0%91%EA%B7%BC%ED%95%A0%20%EC%88%98%20%EC%9E%88%EB%82%98%EC%9A%94%3F.png)
직장에는 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.