2014-04-24 16 views
7

더미 블록 장치 (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의 경우 closesbd_opensbd_close (구현 한 것)이라고합니다.

retval = ioctl(fd, HDIO_GETGEO, &geoinfo); 

그것은 sbd_getgeo를 호출하지만 난 그게 sbd_ioctl를 호출 할 것이라고 생각 : 그리고 나는 시도했다. 여기

내 질문은 다음과 같습니다

  1. 내가 드라이버를 구현하는 장치를 만들었습니다. 해당 장치에서 작업을 수행하면 드라이버 응용 프로그램이 호출됩니다. 하지만 몇 가지 내 드라이버 기능과 몇 가지 기본 드라이버 기능을 어떻게 사용합니까?
  2. ioctl(fd, HDIO_GETGEO, ..).ioctl 호출을 호출하지 않았지만 .getgeo을 호출했습니다. 이것이 어떻게 가능한지?

답변

6

ioctl 파견은 드라이버의 특정 루틴으로 호출하지 않고, 직접 ioctl의 일부를 처리 할 blkdev_ioctl 기능에 의해 처리됩니다. HDIO_GETGEO를 들어

, 그것은 직접 운전 getgeo 함수를 호출 (커널 3.13.6에서 2.6.32 이후 많은 변경 나타나지 않습니다) : BLKBSZGET를 들어, 그것은, block_size(bdev))를 호출

[...] 
/* 
* We need to set the startsect first, the driver may 
* want to override it. 
*/ 
memset(&geo, 0, sizeof(geo)); 
geo.start = get_start_sect(bdev); 
ret = disk->fops->getgeo(bdev, &geo); /* <- here */ 
[...] 

하는 단순히 bdev->bd_block_size을 반환합니다.

block/ioctl.cblkdev_ioctl이 표시 될 수 있습니다. 다른 ioctls에서 어떤 일이 발생하는지 알아야 할 경우.

+0

'blkdev_ioctl'에 의해 처리되는 첫 번째'ioctl'을 의미합니다. 따라서 'blkdev_ioctl'에 의해 처리되고 나머지는 내 드라이버 함수에 의해 처리되는'ioctl' 연산은 직접적으로 거의 없습니까? – SGG

+0

네, 바로 그 것입니다. – Mat

+0

'blkdev_ioctl'의 정의를 보았습니다. 정말 좋고 분명합니다. 이제'ioctl'이'blkdev_ioctl'을 어떻게 호출하는지보고 싶습니다. 원본 파일을보고 싶습니다. 내가 얻은 파일은? – SGG