AHCI

Drive subsystem, filesystem drivers
  • Для AHCI пришлось делать в драйвере свой собственный кэш с поиском по хеш-таблице, потому что fat32 читает с диска по одному сектору, а это очень медленно.
    Тесты: кэш 4 Мб
    256 элементов по 16КБ - 7.4 с
    128 х 32КБ - 6.3 с
    64 х 128КБ - 5.8 с

    кэш 8 МБ
    512 х 16Кб - 7.3 с
    256 х 32КБ - 6.4 с
    128 х 64 КБ - 5.8 с

    кэш 2МБ
    128 х 32КБ - 6.3 с
  • Копировал 100500 файлов из /sd в /tmp и где-то что-то пошло не так. В системе были /bd.
    В логе, кстати, видно место, когда произошла проблема с копированием файла. Потом я пытался убить безуспешно поток (видно в логах), т.к. после изменений CleverMouse поток умрёт только после полного окончания работы с ФС.
    Attachments
    BOARDLOG.TXT (69.81 KiB)
    Downloaded 335 times
    Из хаоса в космос
  • Leency
    Ты про
    Error: CopyFile->ReadFile
    /bd1/4/Testing files/Big_folder_1/1 (1345).txt
    Error #6 - End of file, EOF
    или
    K : Process - forced terminate PID: 00000029 [EOLITE]
    K : Page fault
    K : EAX : 0C49A5C8 EBX : 00C30010 ECX : 00270003
    K : EDX : 00FFFFFF ESI : 00021730 EDI : 0001025C
    K : EBP : 0009FFCC EIP : 00019247 ESP : 0009FFC0
    K : Flags : 00011202 CS : 0000001B (application)
    Я не могу пока отключить /bd после загрузки AHCI, но тот, кто использует два разных механизма для доступа к одному устройству - ССЗБ.
  • Первое. ОК, в следующий раз буду отключать.
    Из хаоса в космос
  • Serge wrote:Для AHCI пришлось делать в драйвере свой собственный кэш с поиском по хеш-таблице,
    Было бы замечательно прикрутить и к IDE режиму. Я в свое время не осилил к сожалению, хоть и планы были.
    Serge wrote:потому что fat32 читает с диска по одному сектору, а это очень медленно.
    Для DMA есть предварительный кэш на 16 секторов, которые считываются одним запросом.
    Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
  • Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
  • Для справки, дисковый кеш ahci
    Spoiler:

    Code: Select all

    #define BLOCK_SIZE    64
    #define BLOCK_SHIFT    6
    #define CACHE_SIZE    64
    #define SECTOR_SIZE  512
    
    size_t  _stdcall ahci_adjust_cache_size(void* userdata, size_t suggested_size)
    {
        printf("LRU cache %dx%dKB size %d\n",CACHE_SIZE,BLOCK_SIZE/2, CACHE_SIZE*BLOCK_SIZE*SECTOR_SIZE);
        return 0; //suggested_size;
    }
    
    typedef struct
    {
        struct list_head lru_list;
        struct list_head key_list;
        int64_t start;
        char   *mem;
        void   *r;
    }dcache_t;
    
    dcache_t dcache[CACHE_SIZE];
    
    struct list_head key_hash[CACHE_SIZE];
    
    struct list_head dcache_lru;
    
    int init_dcache()
    {
        int i;
        char *mem;
    
        mem = KernelAlloc(CACHE_SIZE*BLOCK_SIZE*SECTOR_SIZE);
    
        if(mem == NULL)
            return -ENOMEM;
    
        for(i = 0; i < CACHE_SIZE; i++)
            INIT_LIST_HEAD(&key_hash[i]);
    
        INIT_LIST_HEAD(&dcache_lru);
    
        for(i = 0; i < CACHE_SIZE; i++)
        {
            INIT_LIST_HEAD(&dcache[i].key_list);
    
            dcache[i].mem = mem + i * BLOCK_SIZE * SECTOR_SIZE;
            list_add_tail(&dcache[i].lru_list, &dcache_lru);
        }
    
        return 0;
    };
    
    
    int _stdcall dcache_disk_read(void* userdata, void* buffer, int64_t startsector, int* numsectors)
    {
        int i, key;
        int64_t sector;
        int     offset;
        dcache_t *cache, *tmp_cache;
    
    //    return ahci_disk_read(userdata, buffer, startsector, *numsectors);
    
        for(i = 0; i < *numsectors; i++)
        {
            sector = (startsector + i) & ~((u64)BLOCK_SIZE - 1);
            offset = (startsector + i) & (BLOCK_SIZE - 1);
    
            key = (sector >> BLOCK_SHIFT) & (CACHE_SIZE - 1);
    
            cache = NULL;
    
            list_for_each_entry(tmp_cache, &key_hash[key], key_list)
            {
                if(tmp_cache->start == sector)
                {
                    cache = tmp_cache;
                    list_del(&cache->lru_list);
                    break;
                }
            };
    
            if(cache == NULL)
            {
                cache = container_of(dcache_lru.next, dcache_t, lru_list);
                list_del(&cache->key_list);
                list_del(&cache->lru_list);
    
                ahci_disk_read(userdata, cache->mem, sector, BLOCK_SIZE);
                cache->start = sector;
                list_add_tail(&cache->key_list, &key_hash[key]);
            }
    
            list_add_tail(&cache->lru_list, &dcache_lru);
    
            memcpy((char*)buffer + i * SECTOR_SIZE, cache->mem + offset *SECTOR_SIZE, SECTOR_SIZE);
        };
    
        return 0;
    };
    
  • Начиная с ядра r3742, разделы ntfs и ext2 с драйвером тоже должны работать.
    Dell Vostro: таки да, чтение работает.
    Сделаем мир лучше!
  • Отличная новость !
  • Проверил воспроизведение видео, работает, но скорости чтения файловой системы недостаточно.
  • Лог на моём ноутбуке.
    Attachments
    BOARDLOG.TXT (3.01 KiB)
    Downloaded 323 times
  • Диски не видны. Ноутбук Aspire 4740G
    Attachments
    BOARDLOG.TXT (6.32 KiB)
    не знаю нужен или нет
    Downloaded 327 times
    PCIDEV.TXT (2.32 KiB)
    Downloaded 314 times
    Из хаоса в космос
  • popovpa
    А как всё в реальности подключено ?

    Leency
    А драйвер вообще запускался ? Я никаких следов этого не обнаружил.
  • ftp://ftp.kolibrios.org/users/Serge/new/ahci_rc06.7z
    Отключены режимы энергосбережения. Прощайте, батарейки.
    Mario_r4
    Интересует вредный Dell Inspiron N7010
  • Who is online

    Users browsing this forum: Yandex [Bot] and 1 guest