Я изменяю ядро Linux и пытаюсь найти, где в исходных блоках данных ядра физически записаны в разделы диска, такие как ubd0. Где это происходит в источнике ядра? Фактический физический вызов записи? Я не могу найти это.Спасибо!
Править: Конечная цель является списком номеров блока, которые были записаны в несколько различных разделов. Поскольку данные физически записаны в список, записанные номера блока возвращаются и сохраняются.
Если вы действительно хотите изобрести именно это колесо с нуля, я бы воспользовался функциями очереди запросов. Например, чтобы записать запрос, когда он попадает в очередь, вы можете поместить код в submit_bio ()
.
Я не уверен, где лучше всего зацепиться за выход из очереди. Возможно, elv_next_request ()
на старых ядрах или blk_start_request ()
на более новых.
Это зависит от конкретного драйвера и типа устройства. Для устройства 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, био); это фактический вызов указателя функции в самом устройстве.
http://lxr.linux.no/#linux+v2.6.32/include/linux/types.h # L126
Показывает, как индексы используются для записи в раздел. Обратите внимание, что это используется не только для записи.
Это находится в драйверах устройств и обычно выполняется через комбинацию передач DMA и прерываний, сигнализирующих о завершении ввода-вывода. Они различны для каждого конкретного аппаратного устройства. Посмотрите здесь , чтобы понять, насколько сложно это сделать с простой дискетой.
Посмотрите код планировщика ввода-вывода .