Запуск нескольких команд от файлов, сопоставив схему Brace + Chall, не повторяя его

В компьютерах, соответствующих последовательности загрузки BIOS IBM PC:

  • MBR (абсолютный сектор 0) с диска загружается BIOS в память 0000: 7C00.
  • Этот код выполняется.

От IBM к W7

Код, используемый 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, поэтому перейдите на страницу 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 имеет какое-то отношение к логике кода.) 
 

0
20.12.2018, 21:33
2 ответа

Используйте массивы и не храните шаблоны подстановки имен файлов в переменных (вместо этого разрешите им расширяться в соответствующие пути):

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[@]}"

, если этот массив не содержит сотни или тысячи имен путей.

1
28.01.2020, 02:30

Оценивать всю команду (Не только аргументы)

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";
1
28.01.2020, 02:30

Теги

Похожие вопросы