Объект address_space
Самой важной структурой в кэше страниц является объект address space, структура, встроенная в индексный дескриптор, владеющий страницей.
В кэше несколько страниц могут относиться к одному владельцу, следовательно, ОНИ могут быть связаны С ОДНИМ объектом address_space. Этот объект также устанавливает связь между страницами определенного владельца и набором методов для этих страниц.
Каждый дескриптор страницы имеет два поля, mapping и index, которые связывают страницу с кэшем Первое поле указывает на объект address space индексного дескриптора, владеющего страницей. Второе содержит смещение в "адресном пространстве” владельца, измеренное в единицах, равных размеру страницы (иными словами, это позиция данных страницы внутри дискового образа владельца). Эти два поля используются при поиске страницы в кэше.
Удивительно, но кэш страниц вполне может содержать несколько копий одних и тех же дисковых данных. Например, к одному 4-килобайтовому блоку данных из обычного файла можно обратиться следующими способами:
- прочитать файл. В таком случае данные включаются в страницу, которой владеет индексный дескриптор этого файла;
- прочитать блок из файла устройства (раздела диска), на котором хранится обычный файл. В таком случае данные включаются в страницу, которой владеет главный индексный дескриптор файла блочного устройства.
Таким образом, одни и те же дисковые данные оказываются на двух разных страницах, на которые указывают два разных объекта address space.
Поля объекта address space Если владельцем страницы в кэше является файл, объект address space встраивается в поле i data индексного дескриптора в виртуальной файловой системе. Поле i mapping этого индексного дескриптора всегда указывает на объект address space владельца страниц, содержащих данные этого индексного дескриптора. Поле host объекта address space указывает на индексный дескриптор, в который он встроен.
Таким образом, если страница принадлежит файлу, содержащемуся в файловой системе Ext3, владельцем страницы является индексный дескриптор это
го файла, а соответствующий объект address space хранится в поле i data индексного дескриптора в виртуальной файловой системе. Поле i mapping индексного дескриптора указывает на его же поле i data, а поле host объекта address space указывает все на тот же индексный дескриптор.
Впрочем, иногда все обстоит гораздо сложнее. Если страница содержит данные, прочитанные из файла блочного устройства (данные, полученные от блочного устройства напрямую), ТО объект address space встроен в главный” индексный дескриптор файла в специальной файловой системе bdev, ассоциированной с блочным устройством (на этот индексный дескриптор ссылается поле bdinode дескриптора блочного устройства. Таким образом, поле i mapping индексного дескриптора файла блочного устройства указывает на объект address space, встроенный в главный индексный дескриптор; соответственно, поле host объекта address space указывает на главный индексный дескриптор. Следовательно, все страницы, содержащие данные, прочитанные из блочного устройства, имеют один объект address space, даже если обращение к ним происходило через различные файлы блочного устройства.
ПОЛЯ i_mmap, i_mmap_writable, i_mmap_nonlinear И i_mmap_lock имеют отношение к отображению в память и обратному отображению. Поле backing dev info указывает на дескриптор backing dev info, ассоциированный с блочным устройством, на котором хранятся данные владельца. структура backing dev info обычно встраивается в дескриптор очереди запросов блочного устройства.
Поле private iist является головой списка общего назначения, которым файловая система может пользоваться для своих целей. Например, файловая система Ext2 собирает в нем грязные” буферы косвенных” блоков, ассоциированных с индексным дескриптором Когда операция сброса на диск принудительно записывает на диск индексный дескриптор, ядро сбрасывает также и все буферы из этого списка. Кроме того, файловая система Ext2 сохраняет в поле assoc mapping указатель на объект address space блочного устройства, содержащего косвенные” блоки, И использует спин-блокировку assoc_mapping->private_lock ДЛЯ Защиты списков косвенных” блоков в мультипроцессорных системах.
Самым важным полем объекта address space является a ops, которое указывает на таблицу типа address space operations. Таблица содержит методы, определяющие, как нужно обрабатывать страницы, принадлежащие данному владельцу. Самыми важными ЯВЛЯЮТСЯ методы readpage, writepage, prepare write И commit write. Мы обсудим их в главе 16. В большинстве случаев методы связывают индексные дескрипторы, владеющие страницами, с драйверами нижнего уровня, которые обращаются к физическим устройствам. Например, функция, реализующая метод readpage для индексного дескриптора обычного файла, знает, как определить позиции блоков, соответствующих каждой странице файла, на физическом блочном устройстве. Впрочем, нет необходимости более подробно обсуждать методы объекта address space в этой главе.
Предыдущая страница | 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 | Следующая страница