더미 블록 장치 (sbd0
)를 생성하는 블록 드라이버 프로그램을 작성했습니다. I 드라이버 프로그램을 컴파일커널이 드라이버 코드 대신 기본 블록 드라이버를 사용하는 이유는 무엇입니까?
static struct block_device_operations sbd_ops = {
.owner = THIS_MODULE,
.open = sbd_open,
.release = sbd_close,
.ioctl = sbd_ioctl,
.getgeo = sbd_getgeo,
.locked_ioctl = sbd_locked_ioctl,
.compat_ioctl = sbd_compat_ioctl,
.direct_access = sbd_direct_access,
.media_changed = sbd_media_changed,
.revalidate_disk = sbd_revalidate_disk
};
(2.6.32 커널 소스 include/linux/blkdev.h
참조) : I는 해당 블록 장치에 대한 모든 장치 동작을 등록했다. 모듈을 삽입하고 /dev/sbd0
을 만들었습니다. 이제 드라이버 코드를 테스트하고 싶습니다. 그래서 나는 아래와 같이 신청서를 썼다.
fd = open("/dev/sbd0", O_RDONLY);
retval = ioctl(fd, BLKBSZGET, &blksz); //trying to get logical block size
출력은 : 나는 궁금 4096
: 나는 BLKBSZGET
에 대한 IOCTL을 구현하지 않았다. 그것은 내 sbd_ioctl
을 호출하지 않았고 대신 기본 드라이버를 사용하여 결과를 알려주었습니다. open
의 경우 close
은 sbd_open
및 sbd_close
(구현 한 것)이라고합니다.
retval = ioctl(fd, HDIO_GETGEO, &geoinfo);
그것은
sbd_getgeo
를 호출하지만 난 그게
sbd_ioctl
를 호출 할 것이라고 생각 : 그리고 나는 시도했다. 여기
내 질문은 다음과 같습니다
- 내가 드라이버를 구현하는 장치를 만들었습니다. 해당 장치에서 작업을 수행하면 드라이버 응용 프로그램이 호출됩니다. 하지만 몇 가지 내 드라이버 기능과 몇 가지 기본 드라이버 기능을 어떻게 사용합니까?
ioctl(fd, HDIO_GETGEO, ..)
은.ioctl
호출을 호출하지 않았지만.getgeo
을 호출했습니다. 이것이 어떻게 가능한지?
'blkdev_ioctl'에 의해 처리되는 첫 번째'ioctl'을 의미합니다. 따라서 'blkdev_ioctl'에 의해 처리되고 나머지는 내 드라이버 함수에 의해 처리되는'ioctl' 연산은 직접적으로 거의 없습니까? – SGG
네, 바로 그 것입니다. – Mat
'blkdev_ioctl'의 정의를 보았습니다. 정말 좋고 분명합니다. 이제'ioctl'이'blkdev_ioctl'을 어떻게 호출하는지보고 싶습니다. 원본 파일을보고 싶습니다. 내가 얻은 파일은? – SGG