Ядро Linux - Где в ядре физически записаны блоки данных в определенные разделы диска? - PullRequest
6 голосов
/ 12 апреля 2010

Я модифицирую ядро ​​Linux и пытаюсь найти, где в ядре исходные блоки данных физически записываются на разделы диска, такие как ubd0. Где это происходит в исходном коде ядра? Фактический физический вызов записи? Я не могу найти это. Спасибо! * * 1001

Редактировать: конечной целью является список номеров блоков, которые были записаны в несколько разных разделов. Поскольку данные физически записываются в список, записанные номера блоков возвращаются и сохраняются.

Ответы [ 3 ]

1 голос
/ 12 апреля 2010

Это зависит от конкретного драйвера и типа устройства. Для устройства SCSI команды SCSI идут в драйвер устройства. Они генерируются на уровне SCSI и отправляются на устройство драйвером устройства, а затем на устройство.

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

Для редактирования взгляните на blktrace: http://linux.die.net/man/8/blktrace

Хорошо, еще один ответ; вам понравится этот лучше. Это происходит в generic_make_request. Комментарии довольно наглядны: http://lxr.linux.no/#linux+v2.6.32/block/blk-core.c#L1380

Биоструктура в этой функции, видимая здесь: http://lxr.linux.no/#linux+v2.6.32/include/linux/bio.h#L58

показывает bio_vec, который является списком материалов, отправляемых на устройство.

q-> make_request_fn (q, bio); фактический вызов указателя функции на само устройство.

http://lxr.linux.no/#linux+v2.6.32/include/linux/types.h#L126

Показывает, как индексы используются для записи в раздел. Вы должны заметить, что это не только используется для записи.

0 голосов
/ 12 апреля 2010

Если вы действительно хотите изобрести это колесо с нуля, я бы подключился к функциям очереди запросов. Например, чтобы записать запрос при его поступлении в очередь, вы можете поместить код в submit_bio().

Я не уверен в том, что лучше всего подходить к выходу из очереди. Возможно elv_next_request() на старых ядрах или blk_start_request() на новых.

0 голосов
/ 12 апреля 2010

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

Edit:

Посмотрите в IO планировщик код.

...