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


Сегменты

Мы знаем, что каждая дисковая операция ввода/вывода состоит из пересылки содержимого одного или нескольких смежных секторов в некоторые ячейки оперативной памяти (или из них). Почти во всех случаях пересылка данных выполняется непосредственно контроллером диска с использованием механизма DMA. Драйвер блочного устройства просто инициирует пересылку данных, отправляя контроллеру диска необходимые команды. По окончании пересылки контроллер возбуждает прерывание, чтобы уведомить драйвер.

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

Старые контроллеры дисков поддерживают только простые” DMA- операции: в каждой такой операции данные пересылаются в физически непрерывные участки оперативной памяти (или из них). Зато современные контроллеры могут поддерживать так называемые пересылки вразброс с использованием DMA. В каждой такой операции данные можно пересылать с участием нескольких не смежных областей памяти.

При каждой пересылке вразброс драйвер блочного устройства должен отправить контроллеру диска:
- номер первого сектора и общее количество пересылаемых секторов;
- список дескрипторов областей памяти, каждый из которых состоит из адреса и длины.

Контроллер диска сам выполняет всю пересылку данных. Например, при операции чтения он получает данные из смежных секторов диска и "разбрасывает” их по различным областям памяти.

Чтобы воспользоваться DMA-пересылками вразброс, драйверы блочных устройств должны обрабатывать данные, организованные в единицы, называемые сегментами. Сегмент — это просто страница памяти или ее часть, которая содержит данные из нескольких смежных секторов диска. Так в операции вразброс могут участвовать сразу несколько сегментов.

Обратите внимание, что драйверу блочного устройства ничего не нужно знать о блоках, их размерах и буферах. Даже если сегмент виден на более высоком уровне как страница, состоящая из нескольких буферов блоков, драйверу все равно.

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

Другая операция слияния возможна в архитектурах, которые выполняют отображение между адресами шины и физическими адресами при помощи специальной электронной схемы на шине (IO-MMU, Область памяти, получающаяся в результате такого объединения, называется аппаратным сегментом. Поскольку мы уделяем основное внимание архитектуре 80x86, не поддерживающей динамическое отображение между адресами шины и физическими адресами, далее в этой главе мы будем предполагать, что аппаратные сегменты всегда совпадают с физическими.

Предыдущая страница | 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...