Хрестоматия по программированию на Си в Unix



Системные вызовы и взаимодействие с UNIX. Хрестоматия по программированию на Си в Unix - стр. 7


if((ip->i_mode & IFMT) == IFCHR) (*cdevsw[major(dev)].d_close)(minor(dev),fp->f_flag); else if((ip->i_mode & IFMT) == IFBLK) (*bdevsw[major(dev)].d_close)(minor(dev),fp->f_flag);

u_ofile[fd] = NULL; // и удалить ненужные структуры из ядра. }

Теперь рассмотрим функцию преобразования логических блоков файла в номера физических блоков в файловой системе. Для этого преобразования в I-узле файла содержится таблица адресов блоков. Она устроена довольно сложно - ее начало находится в узле, а продолжение - в нескольких блоках в самой файловой системе (устройство это можно увидеть в примере "Фрагментированность файловой системы" в приложении). Мы для простоты будем предполагать, что это просто линейный массив i_addr[], в котором n-ому логическому блоку файла отвечает bno-тый физический блок файловой системы:

bno = ip->i_addr[n];

Если файл является интерфейсом устройства, то этот файл не хранит информации в логической файловой системе. Поэтому у устройств нет таблицы адресов блоков. Вместо этого, поле i_addr[0] используется для хранения кода устройства, к которому приводит этот специальный файл. Это поле носит название i_rdev, т.е. как бы сделано

#define i_rdev i_addr[0]

(на самом деле используется union). Устройства бывают байто-ориентированные, обмен с которыми производится по одному байту (как с терминалом или с коммуникационным портом); и блочно-ориентированные, обмен с которыми возможен только большими порциями блоками (пример - диск). То, что файл является устройством, помечено в поле тип

файла

ip->i_mode & IFMT

одним из значений: IFCHR - байтовое; или IFBLK - блочное. Алгоритм вычисления номера блока:

ushort u_pboff; // смещение от начала блока ushort u_pbsize; // сколько байт надо использовать // ushort - это unsigned short, смотри <sys/types.h>

// daddr_t - это long (disk address)

daddr_t bmap(struct inode *ip, off_t offset, unsigned count){ int sz, rem;




Содержание  Назад  Вперед