직장에는 DOS 소프트웨어로 제어되는 내장 장치가 있습니다. 나의 임무는 차세대 하드웨어에서 DOS 대체 운영 체제로 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
사용자 공간에서 하드웨어에 접근하는 것은 확실히 가능합니다. 특히 하드웨어 레지스터가 메모리 매핑된 경우. 예를 들어,우이오.