Маркетинговые штучки: сноб-потребитель и HDD #4
реклама
Маркетинговые штучки: сноб-потребитель и слишком большой и быстрый HDD.
В этой серии заметок мы поговорим о неутомимой борьбе сноба-потребителя с такими энергонезависимыми накопителями информации, как жесткие диски. Как обычно, пойдем в обход, используя много вводного материала.
Наконец-то! Встречайте давно обещанное продолжение...
Часть четвертая.
Сегодня лекция:
Сеансы Компьютерной Магии
(с полным её разоблачением)
Общественный разоблачитель, гр.: grizlyk
СКМ выпуск #2: RAID 0 и ужасы.
В то время как весь адекватный мир переходит на народную демократию, основанную на единственно верной системе рейтингов +1/-1, когда все граждане отдают все свои силы на построение нового, свободного мира, где каждый имеет свое право, мира без бурь, войн и прочих катаклизмов, я пишу тут невесть что, не вступая на светлый путь приближения к всемирному счастью.
Проблема тут в том, что саморегулирующиеся, истинно верные системы почему то никак не отражают реальное положение дел в тех сферах, которые призваны саморегулировать и их содержимое по каким-то капризам генератора случайных чисел всегда, всегда совершенно неотличимо от официальной политической позиции их владельцев.
Как и ряд других, лично я полагаю, что данный механизм самоуправления это пародия на свободу, что-то вроде постановочных теле-ток-шоу "демократия", где люди-актеры не просто горячо обсуждают разные злободневные вопросы, а всегда приходят в итоге к саморегулирующемуся единственно верному выводу, особенно весело это тем, что не каждый из зрителей и из участников шоу это понимает, т.е. такой невинный первоапрельский розыгрыш скрытой камерой.
Но, будучи пытливым исследователем, я иду дальше улыбок и прекрасно вижу, что пародия на свободу построена на обмане возведенном в доблесть, это как раз характерная черта этого самого нового строящегося мира, где все прогнившие ветхие идеи, не соответствующие адекватности, опровергнуты мудрыми исследованиями господина Дарвина в области самозарождения видов, товарища Лысенко в области генетики и фольксдойче Энштейна в области расщепления атомного ядра. Что вы можете противопоставить доказательству возможности расщепления атомного ядра? Это неопровержимо все опровергает и доказывает.
Ну, а теперь, после возвышенной торжественной части, в которой рассылаются приветы съедам и разъездам, а также подчеркивается ведущая роль народной демократии в указании направлений, перейдем к деталям, к низменному - к RAID 0.
Содержание.
1. Закрытая архитектура современных компьютеров и RAID 0.
2. Большая загадка фирмваре.
3. Расширение MBR для поддержки RAID 0
4. Дисковые расширения BIOS.
1. Закрытая архитектура современных компьютеров и RAID 0.
Вспомним о том, что мы уже убедились, как мало сил надо было потратиить на то, чтобы
- сделать расширение MBR с 32 до 48 битной адресации секторов ;
- поддержать APM управление питанием на компьютерах с неверной спецификацией ACPI.
Вопрос, а требует ли RAID 0 больших усилий для своей работы?
Как вы наверное уже сами догадались, хорошая поддержка RAID 0 требует не больше усилий при модификации MBR, чем расширение MBR с 32 до 48 битной адресации секторов.
А что мы имеем на самом деле?
На практике мы имеем множество несовместимых реализаций RAID 0, каждый производитель (продающий RAID массивы под торговыми марками Microsoft, Intel, AMD, Promise, VIA, SIL, Marvell) сделал их несовместимыми между собой и каждый массив обслуживается своим собственным уникальным программным кодом - фирмваре.
Раз только мы услышали фирмваре, мы сразу должны сказать - здесь нас обманывают. Так и есть и чтобы это доказать применительно к RAID 0, сегодня мы практически разработаем готовое, промышленное расширение MBR для поддержки RAID 0, как всегда мы по возможности не будем пользоваться бумагой, будем разрабатывать расширение в уме, для демонстрации всей глубины обмана (получается что EFI - интерфейс для глубокого, гибкого и полного обмана потребителя в промышленных масштабах).
Разумеется мы не можем заставить независимого производителя выпускать качественный и совместимый продукт, но мы в праве описать отказ производителя делать качественный и совместимый продукт. Я не говорю, что ранее производители были образцы морали, хотя моральность ранее была лучше, но ранее как минимум им хватало чувства понимания ограниченности своих возможностей, трудности написания софта и они не пытались от жадности съесть больше, чем могут.
"Фирмваре" = "закрытая архитектура" = "несовместимость" = "неработоспособность" = "в целом низкое качество", таково семантическое значение слова "фирмваре" в сегодняшние дни.
Что дает нам фирмваре и несовместимость? Мы не можем взять и перенести RAID 0 массив с одного контроллера на другой, как простой диск, что дает нам проблемы с апгрейдом, с миграцией и с восстановлением поврежденных массивов. Ситуация аналогична тому, что для каждого контроллера SATA мы должны были бы приобретать свой собственный уникальный жесткий диск со своим интерфейсом.
На практике миграция данных с одной системы на другую требует вспомогательных временных хранилищ (временных пустых дисков объема равного RAID массиву) и при наличии всех необходимых аппратных компонент миграция данных для RAID 0 диска размером в 1Tбайт может занимать несколько суток!
Каждый контроллер, в котором создан RAID 0 массив, обладает своими существенными проблемами, например:
- фирмваре PCI контроллера RAID от VIA отказывается воспринимать SATA3 диски;
- фирмваре PCI контроллера RAID от SIL отказвается интегрироваться в BOOT процесс с матплатами;
- фирмваре PCIе контроллера RAID от Marvell не имеет поддержки драйверов для новых версий Windows;
- фирмваре интегрированных в AMD-чипсеты RAID контроллеров от Promise не имеет интерфейса обновления версии BIOS части, а софт для Windows для этих контроллеров требует только определенные версии для BIOS части, а с другими не работает;
- фирмваре интегрированных в Intel-чипсеты RAID контроллеров от Intel работает не на каждом чипсете Intel;
- фирмваре для RAID массивов от Microsoft в общем требует повышения версии Windows, т.е. стоит отдельных денег и не может свободно использоваться с другими ОС.
Также особо отметим драйвера для Windows для интегрированных в AMD-чипсеты RAID контроллеров, которые работают с особенными сбоями. Предположительно, при ошибке чтения сектора на диске драйвер возвращает общее ошибочное состояние "not ready" вместо конкретной ошибки ("сектор не найден", "ошибка CRC" и т.д.), а Windows интерпретирует состояние "not ready" максимально широко, аналогично отключению диска, в результате сбой чтения сектора на системном RAID диске приводит к тому, что операции драйвера блокируются для всех остальных секторов тоже, включая файлы подкачки и критические файлы Windows, что немедленно приводит либо к синему экрану, либо к зависанию системы. Сбой на столько необработан, что блокируется вся цепочка нитей, вызвавших обращение к драйверу, в том числе принудительное закрытие приложения.
Отметим, что несовместимость драйвера для Windows 7 для интегрированных в AMD-чипсеты RAID контроллеров с системой обработки ошибок Windows 7 настолько крупная, что не работают даже утилиты Windows 7 для восстановления данных на поврежденных поверхностях накопителей, даже если на накопителе не расположен системный диск.
То, как в Windows 7 работают эти утилиты для восстановления данных заслуживает отдельного упоминания просто потому, что сами эти утилиты требуют восстановления. Особенно это раздражает, что первые утилиты такого типа для РС от Norton появились 30 лет назад! Это просто невероятно, как можно было написать эти утилиты для Windows 7 хуже, чем было 30 лет назад. Программисты Microsoft вообще не в курсе дела? Пусть сходят в музей!
Нельзя писать системные программы в таком же стиле, как виджеты для web, все рухнет. Когда в течении 40 минут команда "chkdsk c: /f /r" обрабатывает файловую запись номер 3188, я хочу спросить у Microsoft и AMD: вы вообще тестируете свой софт на работоспособность или он у вас строго AS IS?
2. Большая загадка фирмваре.
Давайте сами разработаем программу для поддержки RAID 0. А можно ли это вообще сделать? Ну конечно!
Когда мы рассматривали принцип построения RAID 0 массива, мы умышленно игнорировали детали реализации RAID 0 массива, поскольку это было ненужно, ну а теперь мы отметим, что по реализации RAID 0 контроллеры можно разделить на аппаратные и программные.
Что значит аппаратный RAID 0 массив? Это значит, что для BIOS и ОС этот RAID 0 массив выглядит как обычный SATA диск, он не требует специальных драйверов. BIOS контроллера аппаратного RAID 0 массива позволяет конфигурировать массив "по ту сторону контроллера", так что все остальные видят только стандартный SATA накопитель, а для Windows контроллер аппаратного RAID 0 массива устанавливает два устройства:
- стандартный SATA контроллер, к которому подключены RAID 0 массивы как обычные SATA диски;
- уникальное для этого контроллера устройство для настройки SATA массива "по ту сторону SATA контроллера" из-под Windows.
Аппаратный RAID 0 массив означает, что на RAID контроллере есть свой процессор, который не привлекая центральный процессор производит преобразование запросов на чтение/запись от операционной системы в запросы на чтение/запись для отдельных дисков массива.
Первый, кто будет возмущен таким подходом, это Intel, который с 90-х годов носится с идеей NSP, когда очень, очень мощный центральный процессор Intel заменяет собой все мелкие, ненужные периферийные процессоры, оставляя на периферии только аппаратную обвязку и котроллеры типа DMA для переноса данных из/в системную память.
Яркий пример реализации идеи NSP это win-модем для телефонной линии под Windows 95 - дешевый, плохо работающий, несовместимый с другими операционными системами. Аппаратная альтернатива - аппаратный модем USR.
Другой пример это AC97 и HD аудио кодеки для аудио-чипов, распаянных на матплатах, когда всю обработку звука выполняет центральный процессор, поскольку Windows это не ОС реального времени и архитектура существующего ПК не разработана для решения задач реального времени, временные проблемы с неготовностью диска или сети приводят к заиканию звука, к запаздыванию сигналов при микшировании с разных входов на время до секунды, все это потому что требуется обработка в реальном времени. Аппаратная альтернатива - аппаратный SoundBlaster, который менее подвержен заиканиям и не вносит задержек при микшировании или внутренней обработке звука.
Ясно, что с RAID накопителями та же самая ситуация, но накопители это не устройства реального времени (как правило), поэтому для таких задач, как создание RAID 0 массива, технология NSP и программный RAID контроллер (программная реализация RAID 0 массива) подходит как раз хорошо.
Можно даже сказать, что для выпускаемых ныне процессоров не существует никаких объективных или технических препятствий, когда любой многоканальный контроллер SATA нельзя было бы использовать для создания RAID 0 массивов. Любой многоканальный контроллер SATA мог бы поддержать RAID!
Как же работает программный RAID?
Не просто, а очень просто. Код обслуживания RAID 0 это сотня ассемблерных команд. Можно даже сказать, что этот код вообще ничего не делает.
а) от операционной системы драйвер RAID получает запрос на чтение/запись пакета данных в виде описания {начальный сектор first_sector, число секторов sectors}.
б) пусть у нас RAID 0 размещен на двух дисках disks, диски чередуются как "четный strip блок на первом, нечетный на втором". Размер блока для чередования strip_sectors это один или более секторов, например 64 сектора.
в) код обслуживания RAID 0 разделяет параметры исходного пакета данных на попадание в блоки для чередования и формирует серию промежуточных описаний {начальный сектор, число секторов} для каждого диска
давайте посмотрим на io_raid_0 - это сущность реализации RAID 0 и это то, что не работало у столь именитых производителей целых два дня:
Программа "RAID-0 Essentials" (cpp)
//***
//32bit environment
typedef unsigned long long ureg64;
typedef unsigned ureg32;
//error handling loopback
typedef chart_cstr;
class Terr{
public:
Terr(const void *const who, const t_cstr *const what);
};
//
struct t_io_packet{
enum{ IO_RD=0, IO_WR, IO_TRIM, IO_TOTAL };
ureg32 opcode;
ureg64 first_sector; //from 0!
ureg64 sectors;
};
//
struct t_raid0_data{
ureg64 strip_sectors;
ureg32 disks;
};
//функция pend может завершиться ранее, чем данные реально переданы c/на диск
extern
void io_pend_disk( const ureg32 disk, const t_io_packet io_packet );
#ifndef max
#define max(a,b) (((a) > (b)) ? (a) : (b))
#endif
//***
//
void io_raid_0( const t_io_packet io_packet ){
if( !io_packet.sectors )return;
if( !(io_packet.opcode < ureg32(t_io_packet::IO_TOTAL)) )throw Terr(io_raid_0,"bad opcode");
#define NUM_OF_DISKS 2
const
t_raid0_data raid0_data={64,NUM_OF_DISKS};
t_io_packet io_disks[NUM_OF_DISKS];
if(!raid0_data.strip_sectors)throw Terr(io_raid_0,"!strip_sectors");
if(!raid0_data.disks)throw Terr(io_raid_0,"!disks in ary");
t_io_packet p=io_packet;
//head
{
const
ureg64 head_first_sector = p.first_sector % raid0_data.strip_sectors;
if( head_first_sector ){
const
ureg64 head_sectors = max( (raid0_data.strip_sectors - head_first_sector), p.sectors );
//
const
ureg64 strip_block_num = p.first_sector / raid0_data.strip_sectors;
const
ureg64 disk_num = strip_block_num % raid0_data.disks;
const
ureg64 strip_block_first_sector = strip_block_num / raid0_data.disks;
//
io_disks[disk_num].first_sector = head_first_sector + strip_block_first_sector;
io_disks[disk_num].sectors = head_sectors;
io_disks[disk_num].opcode = p.opcode;
io_pend_disk( (ureg32)disk_num, io_disks[(ureg32)disk_num] );
//
p.first_sector += head_sectors;
p.sectors -= head_sectors;
}}
//body
{
ureg64 strip_block_num = p.first_sector / raid0_data.strip_sectors;
for(
ureg64 strip_blocks = p.sectors/raid0_data.strip_sectors;
strip_blocks;
--strip_blocks
){
//
const
ureg64 disk_num = strip_block_num % raid0_data.disks;
const
ureg64 strip_block_first_sector = strip_block_num / raid0_data.disks;
//
io_disks[disk_num].first_sector = strip_block_first_sector;
io_disks[disk_num].sectors = raid0_data.strip_sectors;
io_disks[disk_num].opcode = p.opcode;
io_pend_disk( (ureg32)disk_num, io_disks[(ureg32)disk_num] );
//
p.first_sector += raid0_data.strip_sectors;
p.sectors -= raid0_data.strip_sectors;
++strip_block_num;
}}
//tail
{
const
ureg64 tail_sectors = p.sectors;
if( tail_sectors ){
//
const
ureg64 strip_block_num = p.first_sector / raid0_data.strip_sectors;
const
ureg64 disk_num = strip_block_num % raid0_data.disks;
const
ureg64 strip_block_first_sector = strip_block_num / raid0_data.disks;
//
io_disks[disk_num].first_sector = strip_block_first_sector;
io_disks[disk_nнum].sectors = tail_sectors;
io_disks[disk_num].opcode = p.opcode;
io_pend_disk( (ureg32)disk_num, io_disks[(ureg32)disk_num] );
}}
}
Это все очень напоминает функцию копирования видеобуферов, функцию ОС аналогичную vfprintf для оптимизированного чтения/записи списка блоков, но главное, очень напоминает функцию эффективного копирования потока в файл блоками кратными размеру сектора (только в качестве размера сектора используется размер блока для чередования strip_sectors), а на какой именно диск копировать сектора/блоки разницы нет никакой, поэтому то мы и можем говорить, что этот код вообще ничего не делает.
Этот код реально компилируется, занимает около 1Кбайта и выполняет все основные функции программного RAID 0 по сборке/разборке пакетов по дискам. Грандиозно, да? За жалкие 40 уе получить от производителя вот такой код, который еще к тому же будет написан с ошибками и не будет работать правильно?
Если непонятны детали кода, то в принципе большой блок в памяти логически разбивается на блоки меньшего размера и задания на перемещения этих кусочков из той же самой памяти друг за другом отправляются каждому диску. Аппаратный RAID 0 контроллер делает в принципе то же самое, только силами своего встроенного процессора.
Первое что хочется спросить: почему каждый BIOS не содержит в себе такой код и не позволяет программно объединять диски в RAID 0 массивы? Это большая загадка фирмваре.
Заметим, что для простой поддержки raid 0 из нескольких дисков одного размера этот код реально работает и для BIOS или драйвера ОС больше вообще ничего не нужно, например, если у вас в системе два диска 80h и 81h, которые вы объединилим в RAID 0, то в BIOS появится диск 82h, который и будет RAID 0 массивом, а драйвер ОС распознав 82h как RAID 0 массив из 80h и 81h подменит функции BIOS, обращаясь к аппаратуре дисков 80h и 81h.
Но для обеспечения портируемости RAID массивов нам нужен стандарт описания разделов диска, на котором можно было бы размещать RAID массивы. Вот этим титаническим эпохальным трудом, размером с четверть листа А4, мы сейчас и займемся. Кто же будет исходным образцом, флагманом, так сказать, портируемого програмного обеспечения, кто же впишет свое имя золотыми буквами, ну и т.д.?
Конечно же это будет Майкрософт со своим шедевром всех времен и народов - MBR.
А что, вы ждали что-то иное?
3. Расширение MBR для поддержки RAID 0.
В прошлый раз мы расширяли MBR для поддержки LBA48. А теперь давайте разработаем расширение расширения MBR еще и для поддержки RAID массивов.
А можно ли это вообще сделать? Ну конечно!
а) Для этого каждый диск, который будет использваться в RAID, вначале должен быть проинициализирован как одиночный диск с MBR.
б) На этом диске для резервирования места под RAID-часть надо создать в MBR обычным образом описание раздела, тип которого означает RAID-часть (raid_partition), для этого возьмем любой малоиспользуемый номер, например 40h, а значение 41h отведем под hidden_raid_partition.
в) На диске, помимо RAID, смогут существовать все остальные разделы, для создания RAID 0 массивов, размеры RAID-разделов на всех дисках, которые вы хотите включить в RAID 0, должны совпадать, иначе RAID-разделы большие, чем раздел самого малого размера, будут иметь неиспользуемые области.
В нашем примере "RAID-0 Essentials", для структуры
struct t_raid0_data{
ureg64 strip_sectors;
ureg32 disks;
};
совпадают размеры RAID-разделов (равны размеру всего диска) и начальные сектора (равны 0), но в общем это совсем не обязательно и в модификации "RAID-0 Essentials" для поддержки MBR каждый диск в массиве будет дополнительно характиризоваться парой чисел {начальным сектором раздела first_sector, размером RAID-раздела sectors}:
struct t_raid0_disk{
ureg64 first_sector;
ureg64 sectors;
};
const
t_raid0_disk raid0_disks[NUM_OF_DISKS];
а код, присваивающий к io_disks[disk_num].first_sector перед вызовом io_pend_disk
io_disks[disk_num].first_sector = ....;
будет модифицирован вставкой после этого такой линии
io_disks[disk_num].first_sector += raid0_disks[disk_num].first_sector;
и еще надо будет отсекать вызовы io_pend_disk выходящие за пределы границы RAID-раздела (io_disks[disk_num].sectors)
(это несущественные модификации)
г)При зарузке системы софт RAID контроллера должен пролистать все имеющиеся разделы на предмет нахождения 40h и далее изучить конфигурационную информацию в самом разделе 40h.
д) В начале раздела RAID на каждом диске резервируются сектора для хранения информации о сборке RAID массива, в нашем примере мы резервируем RAID_DESCRIPTION_SECTORS как размер одного блока чередования (strip_sectors, 64 сектора)
#define RAID_DESCRIPTION_SECTORS 64
а код "RAID-0 Essentials", присваивающий к io_disks[disk_num].first_sector будет еще раз модифицирован вставкой после этого еще одной линии
io_disks[disk_num].first_sector += RAID_DESCRIPTION_SECTORS;
после RAID_DESCRIPTION_SECTORS начинается область данных RAID массива (физический сектор 0 собранного массива). Когда приложение смотрит на раздел RAID через одиночный диск, оно видит в начале каждого раздела RAID эту область RAID_DESCRIPTION_SECTORS, когда BIOS или драйвер операционной системы собирает RAID массив, этот RAID массив представляется приложению как отдельный физический диск (несмотря на то, что части массива расположены на одиночных дисках, которые одновременно тоже видны приложению как отдельные физические диски) и он уже не содержит в себе область RAID_DESCRIPTION_SECTORS.
эта RAID_DESCRIPTION_SECTORS область имеет не менее одного сектора, подписана AA55 со смещения [FEh] и сектора RAID_DESCRIPTION_SECTORS содержат следующую стандартную информацию, начиная со смещения [0]:
*[] - смещения со * не стандартные, а случайные в данном примере
смещение описание
------------------------
[00h] код х86 выводящий сообщение о невозможности загрузки с раздела RAID вне RAID массива [16]
ureg8 EBh идентификатор RAID раздела №1
это код операции процессора jmp short $+??, переход на этот код выводящий сообщение
(jmp $+20h в нашем примере)
*[01h] ureg8 байт смещения в команде процессора EBh для перехода на этот код (1Eh в нашем примере)
org 7c00h
7C00 EB 1E jmp $+20h
*[02h] код сообщения (в нашем примере здесь ASCIIZ строка сообщения об ошибке)
char[14] 'It''s RAID ary',0
org 7c02h
7C02 49 74 27 73 20 52 41+ db 'It''s RAID ary',0
49 44 20 61 72 79 00
[10h] таблица параметров RAID [16]
char[4] 'RAID' идентификатор RAID раздела №2
ureg32 число резервных секторов под описание RAID массива (64 в нашем примере)
ureg16 смещение начала таблицы параметров RAID от начала первого сектора, байт (40h в нашем примере)
ureg32 размер таблицы параметров RAID, байт (288 байт в нашем примере)
ureg16 тип RAID 0,1,5, не_задан итд, который определяет и тип таблицы основных параметров (RAID 0 в нашем примере)
org 7c10h
7C10 52 41 49 44 db 'RAID'
7C14 40 00 00 00 dd 64
7C18 40 00 dw 40h
7C1A 20 01 00 00 dd 288
7C1E 00 00 dw 0
[20h] код выводящий сообщение
org 7c20h
7C20 8C C8 mov ax,cs
7C22 8E D8 mov ds,ax
7C24 BE 7C02 mov si,7c02h
7C27 FC cld
7C28 nxt_m:
7C28 AC lodsb
7C29 0A C0 or al, al
7C2B 74 06 jz eom
7C2D B4 0E mov ah,0eh
7C2F CD 10 int 10h
7C31 EB F7 jmp nxt_m
7C33 eom:
7C33 FB sti
7C34 B4 00 mov ah,0
7C36 CD 16 int 16h
7C38 CD 18 int 18h
7C3A CD 19 int 19h
7C3C s:
7C3C F4 hlt
7C3D EB FD jmp s
7C3F 00 db 0
*[40h] таблица основных параметров RAID 0 (в нашем примере таблица здесь) [256]
ureg8 старшая версия таблицы (0 в нашем примере)
ureg8 младшая версия таблицы (1 в нашем примере)
ureg16 размер strip-блока RAID-массива в секторах, от единицы (64 в нашем примере)
ureg48 размер каждой части RAID-массива в strip-блоках, от единицы
ureg16 резерв
ureg16 номер данного диска в данном массиве RAID 0, от нуля
ureg16 число дисков для данного массива RAID 0, от единицы
char[8] 128 бит серийный номер данного массива RAID 0 (все диски одного массива RAID имеют одинаковый номер)
char[32] 32 байтный короткий пользовательский идентификатор (все диски одного массива RAID имеют одинаковый идентификатор)
char[200] 200 байтный пользовательский идентификатор данного массива RAID 0 (все диски одного массива RAID имеют одинаковый идентификатор)
этих данных достаточно чтобы найти все части данного массива RAID 0 на дисках
*[140h] таблица дополнительных параметров RAID 0 [32]
кэширование данных о следующем диске в raid массиве нужно для ускорения сбора raid при загрузке
кэширование заполняется каждым хост-контроллером один раз при первом подключении raid массива к данному контроллеру
если вы выполняете первое подключение, надо вручную указать на необходимость провести такое кэширование
если raid массив не планируется использовать как системный диск, т.е. он не виден через BIOS, а только через драйвера Windows,
то данные кэширования могут храниться не здесь на диске, а в конфигурационных файлах драйверов ОС.
описание следующего диска в raid массиве [16 из 32]
ureg8 0 указывает, что данная часть таблицы не используется, иначе 1
ureg8 0 указывает, что следующий диск на MBR, иначе формат таблицы иной (здесь не описано)
ureg16 резерв
ureg16 номер порта в многопортовом контроллере, где следующая часть RAID (зависит от конкретного контроллера)
ureg16 номер раздела MBR, где следующая часть RAID (от 0-3 основные разделы, 4-last1 разделы в первом расширенном и т.д.)
char[8] 128 бит номер, по которому можно по API в BIOS найти контроллер со следующим диском или 0
описание первого диска в этом raid массиве [16 из 32]
точно такая же таблица, как использовалась для описания следующего диска в raid массиве,
но ссылается на первый диск в массиве, это облегчает работу если нашелся диск с массивом из середины цепочки
*[160h] пусто (в нашем примере [80h])
это место может использоваться либо под более сложный stub код сообщения об ошибке
или под хранение небольшой таблицы дополнительных параметров контроллера RAID в конфигурационном разделе
[1E0h] описание конфигурационного раздела контроллера RAID [16]
если контроллер хранит конфигурационную информацию о самом себе (а не о RAID массиве) на диске, а не в NVRAM памяти,
он хранит ее на накопителе, подключенном к одному из своих портов
описание конфигурационного раздела заполняется каждым таким RAID-контроллером один раз при первом подключении raid массива
к данному контроллеру
если вы выполняете первое подключение RAID массива к такому контроллеру, надо вручную указать на необходимость провести такое
заполнение
если вы выполняете отключение RAID массива от такого контроллера, надо вручную указать на необходимость провести безопасноe
отключение, чтобы конфигурационная информация контроллера была правильно перемещена
описание диска, хранящего конфигурационную информацию этого raid контроллера
таблица аналогична по сути той, что использовалась для описания первого диска в raid массиве,
но ссылается диск, который в зарезервированных RAID секторах хранит конфигурационную информацию RAID контроллера,
чей конфигурационный раздел и который управляет этим raid массивом, это облегчает работу если нашелся диск с массивом
из середины цепочки
ureg8 0 указывает, что конфигурационный раздел и эта часть таблицы не используются контроллером, иначе 1
ureg8 0 указывает, что конфигурационный раздел на MBR, иначе формат таблицы иной (здесь не описано)
ureg16 резерв
ureg16 номер порта в многопортовом контроллере, где кофигурационный раздел RAID контроллера (зависит от конкретного контроллера)
ureg16 номер раздела MBR, где кофигурационный RAID раздел RAID контроллера (от 0-3 основные разделы, 4-last1 разделы в первом расширенном и т.д.)
char[8] 128 бит номер, по которому можно по API в BIOS найти этот RAID контроллер
[1F0h] таблица параметров контроллера RAID [10]
если это конфигурационный раздел, на который ссылается секция [1E0h],
то здесь RAID контроллер, владеющий конфигурационным разделом, хранит дополнительную конфигурационную информацию о самом себе
ureg16 резерв
ureg16 смещение начала таблицы дополнительных параметров контроллера RAID от начала первого сектора, байт (0 в нашем примере)
ureg32 размер таблицы дополнительных параметров контроллера RAID, байт (0 байт в нашем примере, т.е. не используется)
ureg16 число отдельных raid массивов, которыми управляет этот raid-контроллер, от нуля
[1FAh] таблица параметров RAID-массива [4]
если это первый диск в RAID массиве, на который ссылается секция *[150h], то здесь хранится конфигурационная информация о RAID массиве
ureg16 резерв
ureg8 биты параметров RAID-массива:
биты 0,1 тип разрешенного кэширования
00 нет
01 чтение
10 запись
11 чтение/запись
биты 2-7 резерв, неопределены
ureg8 резерв
[1FEh] сигнатура расширения BIOS [2], идентификатор RAID раздела №3
db 55h,aah
//
формат таблицы дополнительных параметров контроллера RAID (из секции [1F0h]) зависит от контроллера,
но часть этой таблицы стандартна (размещается эта таблица не в секции [1F0h], а адресуется через
смещение_начала/размер_таблицы в этой секции)
стандартная часть расположена в начале этой таблицы, это массив числом элементов равный числу "отдельных raid массивов,
которыми управляет этот raid-контроллер" из секции [1F0h]
для каждого из этих raid-массивов создается элемент таблицы, который представляет из себя все ту-же таблицу
"описание первого диска в этом raid массиве" [16] из секции *[140h] и ссылается на первый диск в этом raid-массиве,
это облегчает работу по сбору нескольких раздельных raid массивов, находящихся на одном raid контроллере
остальная информация зависит от контроллера
Таким образом, для сбора массива при загрузке RAID контолллеру надо:
- перечисляя разделы с идентификатором raid_partition, найти раздел с секцией [1E0h], которая ссылается на него, по ней найти свой конфигурационный раздел контроллера RAID;
- в конфигурационном разделе перечисляя все активные raid массивы из таблицы дополнительных параметров инициализировать их.
Очень просто.
Конечно, формат MBR с поддержкой RAID может быть любым, но если формат может быть любым это не означает, что его совсем нельзя сделать как-либо определенно, вот вам конкретный пример определенности, пригодный по крайней мере для портируемого RAID на уровне драйверов ОС.
В общем это была вся работа по созданию. Оформлять было больше работы. Поздравляю себя, поздравляю вас, а особенно поздравляю тех производителей, кто это все не сделал в надежде разбогатеть.
4. Дисковые расширения BIOS.
У MBR много плюсов, поскольку ее проектировали во времена открытых архитектур, но есть и один минус, даже это минус не MBR, а самого традиционного 16-бит BIOS.
Дело в том, что MBR, будучи частью BIOS и его раширением, не предназначена для закрепления программ расширения BIOS в оперативной памяти резидентно, т.е. после работы кода из MBR загрузчик вашей ОС должен получить "чистую" систему: BIOS, область данных BIOS и всю пустую память, а для того, чтобы установить расширение BIOS, его надо разместить в адресном пространстве ROM: установить в ROM на отдельное устройство или встроить в ROM материнской платы в качестве специального модуля, в общем уникального для каждой материнской платы в современном компьютере.
Если и надо было апгрейдить интерфейс 16-бит BIOS, то надо было дать возможность устанавливать AA55 модули BIOS с диска: 32-битные в оперативную память выше 1Мбайта и 32-битные и 16-битные в shadow память в области ROM. В таком случае добавить в BIOS поддержку нового оборудования или того же RAID накопителя было бы делом нескольких минут:
- установить модули на диск в область внесистемного загрузчика (эта область неограничена по размеру);
- во время работы BIOS эти модули будут загружены в память и затем инициализированы для встраивания в BIOS так, словно они зашиты в ROM.
При наличии такого интерфейса добавить совместимый RAID драйвер, например, было бы делом пары минут, но, как вы уже догадались, ничего такого не было сделано, поскольку производителя мало волнует вопрос о том, как пользователь будет пользоваться его продуктом.
Обсуждение этой заметки в форуме.
Создано: 22.04.13
Последний раз отредактировано: 22.04.13
реклама
Лента материалов
Соблюдение Правил конференции строго обязательно!
Флуд, флейм и оффтоп преследуются по всей строгости закона!
Комментарии, содержащие оскорбления, нецензурные выражения (в т.ч. замаскированный мат), экстремистские высказывания, рекламу и спам, удаляются независимо от содержимого, а к их авторам могут применяться меры вплоть до запрета написания комментариев и, в случае написания комментария через социальные сети, жалобы в администрацию данной сети.
Сейчас обсуждают