Мне вот еще что не понятно.
В примере с символьным драйвером обращение к устройству сводится к вызову функций чтения/записи которые прописаны в структуре fosp, соответсвенно когда обращаюсь к устройству через read/write и т.п. то передаю указатель на буфер обмена.
В драйвере блочного устройства я не пойму как передается указатель на буфер обмена. В примере, осуществляется такое объявление функции запроса
Код
...
static XStatus(*req_fnc) (XSysAce * InstancePtr, u32 StartSector,
int NumSectors, u8 * BufferPtr);
...
static void xsysace_do_request(request_queue_t * q)
{
if (req_active)
return;
for (;;) {
INIT_REQUEST;
switch (CURRENT->cmd) {
case READ:
req_str = "reading";
req_fnc = XSysAce_SectorRead;
break;
case WRITE:
req_str = "writing";
req_fnc = XSysAce_SectorWrite;
break;
default:
printk(KERN_CRIT "%s: unknown request %d.\n",
DEVICE_NAME, CURRENT->cmd);
end_request(0);
continue;
}
req_active = 1;
wake_up(&req_wait);
return;
}
}
Т.е., например вызывается XSysAce_SectorRead, которая заполняет BufferPtr относящийся к структуре InstancePtr, но вот как этот BufferPtr передается приложению пользователя