2013-03-26 3 views
1

내 자신의 파일 설명자를 구현하는 방법은 무엇입니까? 일부 하드웨어를 제어하는 ​​커널 모듈이 있고이 하드웨어와 통신 할 수있는 기능을 read() 및 write()를 통해 사용자 공간에 노출하고 싶다고 말하고 싶습니다. IOCTL 또는 netlink 또는 다른 userspace-kernelspace 메소드를 사용하고 싶지는 않습니다. 커널을 다시 컴파일해야할까요, 아니면 그냥 커널 모듈을 작성해서 할 수 있습니까?파일 설명 자 구현

필자는 파일 디스크립터를 생성하려면 커널 파일에 구조체 파일 (open(), eventfd(), timerfd(), socket()에 해당하는 항목을 생성하도록 커널 공간에 알리는 메커니즘이 필요하다는 것을 알고 있습니다)). IOCTL을 통해 (커널을 다시 컴파일 할 필요가 없도록) IOCTL을 구현할 수는 있지만, 전에 LD_PRELOAD를 사용하여 패치를 적용한 방법은 read() 및 write()를 해킹하는 방법입니까? 커널을 다시 컴파일하고 싶지는 마십시오!

답변

0

귀하의 모든 질문을 이해할 수 있는지 잘 모르겠습니다. 그럼에도 불구하고 :

  • 당신은 분명히 이것을 커널 모듈로 가질 수 있습니다.
  • 아마도 캐릭터 장치 (질문의 두 번째 부분)를 만들고 싶을 것입니다.
  • char 장치의 경우 필요한 시스템 호출을 구현할 수 있습니다. readwrite 만 갖고 싶다면 아무런 문제가 없습니다.

book의 3 장 (및 기타)을 살펴보십시오.

0

konrad.kruczynski가 맞습니다!

하드웨어와 통신하기위한 사용자 공간 메커니즘으로 문자 장치를 사용하고/dev/hardware_type_A와 같은/dev 파일 시스템에 장치를 만듭니다.

는 & &는 모든 코드가 좋은 다음 있다면, 커널 이름은/dev/hardware_type_A와 /는/dev의 문자 장치를 만들 것이다, 커널에서 모듈을로드 컴파일합니다.

다른 장치 또는 파일을 하드웨어와 함께 사용하는 것처럼 읽기, 쓰기, 열기, 닫기 호출을 사용할 수 있습니다.

정말로 ioctl을 통해 제어하고 싶지 않다면 쓰기를 사용하여 데이터를 보내는 새 프로토콜이 필요하며 드라이버가 사용자의 프로그램 대신 하드웨어를 제어하고 해당 데이터의 압축을 풀어야합니다.

+0

@ konrad.kruczynski & John. 답변 해 주셔서 감사합니다. 현재 character device/ioctl은 userspace와 kernelspace 사이의 통신을 구현 한 방법입니다. ioctl을 사용하여 데이터 구조에 대한 포인터를 KS로 전달하고 커널 측 모듈이 해당 구조체에서 데이터를 추출합니다. 하지만 것은 select()를 사용할 수있는 사용자 공간에 엔티티가 필요합니다. 커널 측면에서 이벤트가 발생하면 미국에 신호를 보내는 방법이 필요합니다. 나는 미국에 신호를 보내는 다른 방법이 있지만 미국이 select()를 사용하여 기다릴 수있는 방법이 있는지 알고있다. 문자 장치로 select()를 사용할 수 있습니까? – lithiumhead

+0

폴 apis를 사용하는 커널이 실제로 가능합니다. linux/poll.h를 보라. 요청이 사용자 공간에서 왔을 때 waitqueue에 추가하고 드라이버의 데이터가 있다면 깨운다. 커널 소스의 drivers/char/폴더에서 wake_up_interruptible을 검색하십시오. 이것은 결국 기다리는 중 CPU 사용량을 줄임으로써 드라이버를 향상시킵니다 ... – John

관련 문제