В компьютерах, соответствующих последовательности загрузки BIOS IBM PC:
Код, используемый IBM PC для загрузки, можно увидеть здесь:
Первая версия MBR из IBM® Personal Computer ™ DOS 2.00
Этот код имеет множество версий, которые также представлены на страницах звездного человека.
Отправной точкой об этих многих версиях может быть эта страница:
от MS-DOS 3.30 до MS-Windows ™ 95 (A)
Один из наиболее распространенных кодов MBR:
MBR для: MS-Windows ™ 95B, 98, 98SE и ME
Большая часть этих версий кода использовалась только для загрузки следующей VBR (объемной загрузочной записи). VBR раздела, помеченного как загрузочный в таблице разделов, а затем передать ему выполнение.
(Помните, что VBR не является абсолютным сектором диска 0 или W7 MBR )
Найдите это примечание ассемблера на странице W7 MBR :
; В следующем коде используется INT 13, функция 42h («Расширенное чтение») для чтения
; первый сектор (VBR) загрузочного раздела в память по адресу 0x7c00.
Windows ™ 7 (и Vista) VBR (объемная загрузочная запись)
Интересно прочитать это со страницы W7VBR :
; В следующем коде для чтения используется INT 13, функция 42h («Расширенное чтение с диска»); 1 сектор из оставшихся 15 секторов области загрузочной записи в ; Объем памяти; начиная с местоположения 7E00.
Как вы можете подтвердить, загрузочный код начался с MBR (сектор диска 0), загрузил VBR (загрузочную запись тома) и многие (15 в W7) следующих секторов.
Но здесь мы говорим о GRUB, поэтому перейдите на страницу GRUB :
и найдите этот код:
{{1} }
[7C44] -> Примечание: очень важное место для всех, кто использует GRUB! Это (4-байтовое) четырехбайтовое слово содержит расположение GRUB stage2 файл в секторах! Он называется stage2_sector в коде stage1.S. Если GRUB установлен в MBR дистрибутивом , который всегда включает несколько секторов из stage2 сразу после GRUB MBR, вы увидите байты 01 00 00 00 в это место; в противном случае он будет указывать на этап 2 в каталоге "/ boot / grub".
Это почти всегда 01 00 00 00
(или просто: следующий сектор).
Это означает, что BIOS загружает абсолютный сектор 0 (MBR), код GRUB, установленный в MBR, продолжает читать следующие сектора. До размера core.img
(GRUB2) в последних дистрибутивах (около 60 секторов, или ~ 30 кБ). В современных дисках после MBR остается свободным полный мегабайт, так что проблем нет. Диски EFI имеют отдельный раздел для всего этого кода, и здесь еще меньше проблем (то есть с размером).
Устаревшая стадия записи GRUB 2 или, возможно, стадия 1.5 в некоторых крайних случаях, в MBR и несколько / многих из следующих 62 секторов.
Это также объясняется изображениями на странице Wikipedia Grub .
С сайта GNU 10 файлов изображений GRUB :
stage1 Это важный образ, используемый для загрузки GRUB. Обычно это встраивается в MBR или загрузочный сектор раздела. Поскольку размер загрузочного сектора ПК составляет 512 байт, размер этого образа составляет ровно 512 байт. Все, что нужно сделать на этапе 1, - это загрузить этап 2 или этап 1.5 с локального диска. . Из-за ограничения размера stage1 кодирует расположение Stage 2 (или Stage 1.5) в формате черного списка, поэтому он никогда не понимает структуру файловой системы .
ПРИМЕЧАНИЕ : stage2 может быть записан на другой физический диск. Со страницы GRUB :
[7C40] -> 80 («Загрузочный диск») ПРИМЕЧАНИЕ. Для тех из вас, у кого есть загрузочные системы с несколькими ОС: если ваша установка Linux с GRUB См.: Оставшееся программное обеспечение (этап 2, файл меню и т. Д.) Находится 7C5A где-нибудь, кроме основного главного диска, это значение будет 81, 82 и т. д. в зависимости от того, на каком диске находится каталог / boot / grub ОС Linux. В файле stage1.S он называется байтом GRUB_INVALID_DRIVE и закомментирован как "диск, с которого загружается stage2". (Слово INVALID имеет какое-то отношение к логике кода.)
Используйте массивы и не храните шаблоны подстановки имен файлов в переменных (вместо этого разрешите им расширяться в соответствующие пути):
component_dirs=( 'src/component '{a,b,c} )
component_data=()
component_code=()
for dir in "${component_dirs[@]}"; do
component_data+=( "$dir"/*.txt )
component_code+=( "$dir"/*.c )
done
Тогда вы могли бы сделать, например,
cat "${component_data[@]}"
, если этот массив не содержит сотни или тысячи имен путей.
eval ">\"dist/support.txt\" cat ${component_data_pattern}";
test -s "dist/all.c";
Мне это не нравится, но это работает. Учитывая, что мы пытаемся расширить шаблон, который включает в себя как фигурные скобки, так и файловые шаблоны, один из которых имеет место до раскрытия переменной, а другой — после, может не быть альтернативы чему-то подобному :ручному расширению переменной в строку, которая включает весь вызов команды, и используя эту строку в качестве аргумента для eval
или bash -c
. Не забудьте экранировать внутренние кавычки с помощью \"
.
В приведенном выше примере других аргументов нет. Если есть другие аргументы, и они также используют какую-то замену, вам нужно экранировать (с помощью \$
, \*
, \{
или \}
), чтобы они не раскрывались до тех пор, пока команда наконец оцениваются, и их можно интерпретировать в контексте.
readonly annoying_arg="$PWD/src/docs/test data.txt";
eval ">\"dist/support.txt\" cat ${component_data_pattern} \"\$annoying_arg\"";
test -s "dist/all.c";