Linux Kernel (Ядро линукса) (часть 2)


Блоки

В то время как сектор является базовой единицей пересылки данных для аппаратных устройств, блок представляет собой базовую единицу для VFS и, следовательно, для файловых систем. Например, когда ядро обращается к содержимому файла, оно вначале должно прочитать с диска блок, содержащий индексный дескриптор файла Этот блок на диске соответствует одному или нескольким смежным секторам, которые воспринимаются виртуальной файловой системой как одна единица данных.

В Linux размер блока должен быть степенью двойки, и он не должен превышать размер страничного кадра. Более того, он должен быть кратным размеру сектора, потому что каждый блок должен содержать целое количество секторов. Следовательно, в архитектуре 80 х 86 разрешены размеры блоков 512, 1024, 2048 и 4096 байтов.

Размер блока не является специфичным для блочного устройства. При создании дисковой файловой системы администратор может выбрать подходящий размер блока. Так, несколько разделов на одном диске могут использовать блоки разных размеров. Кроме того, каждая операция чтения или записи, выполненная напрямую над файлом блочного устройства, обращается непосредственно к устройству, в обход дисковой файловой системы. Ядро выполняет ее, используя блоки максимального размера (4096 байтов).

Каждому блоку нужен собственный буфер. Это область оперативной памяти, в которой ядро сохраняет содержимое блока. Когда ядро считывает блок с диска, оно заполняет соответствующий буфер блока данными, полученными от аппаратного устройства. Аналогичным образом, когда ядро записывает блок на диск, оно обновляет содержимое группы смежных байтов в аппаратном устройстве значениями, полученными из буферами блока. Размер буфера блока всегда равен размеру самого блока.

У каждого буфера есть дескриптор головы буфера”, имеющий тип buffer head. Этот дескриптор содержит всю информацию, необходимую ядру, чтобы знать, как обращаться с данным буфером. Таким образом, перед работой с каждым буфером ядро проверяет его голову”. Подробное описание всех полей буфера приведено в главе 15. Здесь же мы рассмотрим лишь несколько полей: bjpage, b_data, bjolocknr И b_bdev.

Поле b page содержит адрес дескриптора страницы для страничного кадра, в котором хранится буфер блока. Если страничный кадр находится в верхней памяти, поле b data содержит смещение буфера блока внутри страницы. В противном случае оно содержит начальный линейный адрес самого буфера блока. В поле bjolocknr хранится номер логического блока (то есть индекс блока в разделе диска). Наконец, поле b_bdev идентифицирует блочное устройство, использующее голову буфера

Предыдущая страница | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | Следующая страница




Возможно, Вас также заинтересует:

ОС Knoppix - это Linux без про...

ВведениеЕсли вы цените свое время, умеете считать деньги и знаете стоимость информации, то эта книга...

Linux Kernel (Ядро линукса) (ч...

Спин-блокировкаСпин-блокировка необходима в многопроцессорной системе, потому что могут возникнуть...

Linux Kernel (Ядро линукса) (ч...

Копирование при записи В системах Unix первых поколений создание процесса было реализовано довольно...

Linux Kernel (Ядро линукса) (ч...

Буферы блоков и головы буферовУ каждого буфера есть дескриптор голова буфера, имеющий тип buffer...