Драйвер блочного устройства

Тема в разделе "WASM.UNIX", создана пользователем chetr, 4 дек 2006.

  1. chetr

    chetr New Member

    Публикаций:
    0
    Регистрация:
    16 мар 2006
    Сообщения:
    13
    Устройство flash диск на PCI плате, нужно обеспечить разбиение его на разделы. Исходников просмотрел много. Понял, что для работы таких утилит как mount, mkfs, и для разбиения его на разделы, достаточно реализовать чтение запись и IOCTL, помимо всего остального типа open release cleanup. Но проблема заключается в следующем:
    -когда записываю в устройство какой-нибудь файл с помощью обычного cat f3 > /dev/flashdisc, а потом читаю таким же образом, то вижу, что не весь файл читается (или не весь пишется...отследить не могу). В прочитанном файле видны дыры т.е. например первые 512байт соответствуют тексту исходного файла, потом какая-нибудь дыра объёмом кратным 256 байт, потом опять нормальный текст. Если заменить низкоуровневые функции чтения записи на простое memcpy, то никаких дыр нет. Под ДОСом похожий драйвер работает, и там такие же (абсолютно одинаковые) низкоуровневые функции чтения записи... Вот и ищу причину... Может кто-нибудь имеет опыт написания драйверов блочных устройств?
     
  2. int_0dh

    int_0dh New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    21
    Адрес:
    Russia
    мне кажется, что исходник ваших функций чтения/записи/probe а так же название флеша заметно бы оживили дискуссию
     
  3. chetr

    chetr New Member

    Публикаций:
    0
    Регистрация:
    16 мар 2006
    Сообщения:
    13
    Код (Text):
    1. static int fd_make_request(request_queue_t * q, int rw, struct buffer_head *sbh)
    2. {
    3.     unsigned int minor;
    4.     unsigned long offset, len;
    5.  
    6.     minor = MINOR(sbh->b_rdev);
    7.  
    8.     if (minor >= NUM_FDISKS)
    9.         goto fail;
    10.  
    11.     offset = sbh->b_rsector << 9;
    12.     len = sbh->b_size;
    13.  
    14.     if ((offset + len) > 0x400000)
    15.         goto fail;
    16.  
    17.     if (rw==READA)
    18.         rw=READ;
    19.     if ((rw != READ) && (rw != WRITE)) {
    20.         printk(KERN_INFO "FLASHDISK: bad command: %d\n", rw);
    21.         goto fail;
    22.     }
    23.  
    24.     if (fd_blkdev_IO(rw, sbh, minor))
    25.         goto fail;
    26.  
    27.     sbh->b_end_io(sbh,1);
    28.     return 0;
    29.  fail:
    30.     buffer_IO_error(sbh);
    31.     return 0;
    32. }
    33. //=========================================
    34. static int fd_blkdev_IO(int rw, struct buffer_head * sbh, int minor)
    35. {
    36.     int offset, size;
    37.     char * pt;
    38.     uc KS;
    39.  
    40.     offset = sbh->b_rsector << 9;
    41.     if(minor==1) offset += (32 << 9);
    42.     size = sbh->b_size;
    43.  
    44.     pt = bh_kmap(sbh);
    45.  
    46.     do {
    47.         if (rw == READ) {
    48.         //memcpy(pt, h+offset, 512);   
    49.         PageRead((offset>>9), pt, &KS); //читаем по секторам
    50.         } else {
    51.             KS = CalcSectorKS(pt); //контрольная сумма
    52.             //memcpy(h+offset, pt, 512);
    53.             PageProg((offset>>9), pt, KS); //пишем по секторам
    54.         }
    55.         offset += FLASH_SEC_SIZE;
    56.         pt += FLASH_SEC_SIZE;
    57.         size -= FLASH_SEC_SIZE;
    58.  
    59.     } while (size>0);
    60.  
    61.     bh_kunmap(sbh);
    62.  
    63.     return 0;
    64. }
    65. PageRead-чтение
    66. PageProg-запись (в ДОСе работают!!! там только обращение к портам через inb() outb() )
    всё писалось по аналогии с RAM диском...
     
  4. int_0dh

    int_0dh New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    21
    Адрес:
    Russia
    размер сектора флешки и величина константы FLASH_SEC_SIZE точно 512 байт?
    как она инитится?
     
  5. chetr

    chetr New Member

    Публикаций:
    0
    Регистрация:
    16 мар 2006
    Сообщения:
    13
    флешка сама 4МБ, чтение запись организована по секторам т.е. по 512б +1б контрольная сумма. Не смущает что чтение и запись работает под ДОСом?
     
  6. int_0dh

    int_0dh New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    21
    Адрес:
    Russia
    смущает. попробуйте инвалидейтить кеш-линейки с буфера данных перед чтением флешки и сбрасывать их после записи
     
  7. chetr

    chetr New Member

    Публикаций:
    0
    Регистрация:
    16 мар 2006
    Сообщения:
    13
    Я в этом деле новичок, что такое кэш-линейки?
     
  8. chetr

    chetr New Member

    Публикаций:
    0
    Регистрация:
    16 мар 2006
    Сообщения:
    13
    Так, с чтением/записью разобрался!!! Оказалось, что там флешка не успевала обрабатывать запросы inb(), outb(). Заменил на inb_p(), outb_p() и заработало =) Теперь вопрос следующий: какие методы достаточно реализовать чтобы можно было флешку делить на разделы? посмотрел, как реализовано в hd.c, может его и брать за основу???
     
  9. chetr

    chetr New Member

    Публикаций:
    0
    Регистрация:
    16 мар 2006
    Сообщения:
    13
    Люди, такой не скромный вопрос!!! Как в драйвере сделать, чтобы вызываемое его приложение отвалилось с ошибкой??? Ну например, если установлен флаг защиты от записи, я хочу чтобы простая "cat" завершилась с ошибкой....????
     
  10. int_0dh

    int_0dh New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    21
    Адрес:
    Russia
    дык проверьте флаг и верните EIO или что-нибудь в этом духе.
     
  11. chetr

    chetr New Member

    Публикаций:
    0
    Регистрация:
    16 мар 2006
    Сообщения:
    13
    Пробовал, но приложение типа fdisk /dev/myflash после редактирования таблицы разделов, и выхода с сохранением уходит в бесконечный цикл...как сделать чтобы она завершалась с ошибкой и выходила???
     
  12. chetr

    chetr New Member

    Публикаций:
    0
    Регистрация:
    16 мар 2006
    Сообщения:
    13
    В общем в другом месте поставил проверку, вроде пашет и не пишет =) , но как добиться, чтобы само приложение выдало ошибку???А то получается, что пользователь не увидит, что записи не было...
     
  13. chetr

    chetr New Member

    Публикаций:
    0
    Регистрация:
    16 мар 2006
    Сообщения:
    13
    Всё разобрался, надо было в методе open реализовать проверку file->f_flags и file->f_mode на наличие обращения на запись. Если нельзя писать, то вернуть EROFS (read only FS)
     
  14. chetr

    chetr New Member

    Публикаций:
    0
    Регистрация:
    16 мар 2006
    Сообщения:
    13
    Обнаружил следующую багу: после разбиения флешки на 2 раздела и создания на втором разделе(!!!) файловой системы, убиваются оба раздела!!! Т.е. после этих действий вызываю fdisk, а там разделов нет!!! Подскажите в чём может быть проблема и куда смотреть???
     
  15. chetr

    chetr New Member

    Публикаций:
    0
    Регистрация:
    16 мар 2006
    Сообщения:
    13
    Вопрос другой. Как mkfs определяет адрес начала раздела, чтобы писать туда boot сектор, и как номер minor с этим связан???