Как с помощью GRUB2 загрузить раздел Windows 10, который находится на другом диске, отличном от моего раздела EFI?

С 2010 года не было необходимости перезаписывать приведенные выше строки (не совсем в)стеке основного потока в Linux.

Как /proc/self/cmdline, так и /proc/self/environмогут быть изменены самим процессом во время выполнения путем вызова функции prctl()соответственно PR_SET_MM_ARG_START+ PR_SET_MM_ARG_ENDили PR_SET_MM_ENV_START+ PR_SET_MM_ENV_END. Они напрямую устанавливают указатели памяти на пространство памяти приложения процесса, удерживаемое ядром для каждого процесса, которые используются для извлечения содержимого /proc/${PID}/cmdlineи /proc/${PID}/environи, следовательно, командной строки и среды, о которых сообщает psкоманда.

Таким образом, нужно просто создать новый аргумент или строку среды (, а не вектор, обратите внимание — память, на которую указывает, должна быть фактическими строковыми данными, конкатенированными и-разделенными )и сообщить ядру, где они находятся..

Это описано на странице руководства Linux для функции prctl(2), а также на странице руководства environ(7). Что не задокументировано , так это то, что ядро ​​отклоняет любую попытку установить начальный адрес выше конечного адреса или конечный адрес ниже начального адреса; или (или -)установить любой адрес равным нулю. Кроме того, это не оригинальный механизм, предложенный Брайаном Донланом в 2009 году, который позволял устанавливать начало и конец в одной операции, атомарно. Более того, ядро ​​не предоставляет способа получить текущие значения этих указателей.

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

Один атомарный системный вызов, который устанавливает весь диапазон за один раз, был бы намного проще для безопасного использования прикладными программами.

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

Я написал довольно простые функции setprocargv()и setprocenvv()для своих наборов инструментов, которые используют это. Цепочка -загрузки программ из встроенных наборов инструментов, таких как setenvи foreground, таким образом, отражает связанную -с аргументами команды и средой, где это разрешено Linux.

# /package/admin/nosh/command/clearenv setenv WIBBLE wobble foreground pause \; true &
[1] 1057
# hexdump -C /proc/1057/cmdline
00000000  66 6f 72 65 67 72 6f 75  6e 64 00 70 61 75 73 65  |foreground.pause|
00000010  00 3b 00 74 72 75 65 00                           |.;.true.|
00000018
# hexdump -C /proc/1057/environ
00000000  57 49 42 42 4c 45 3d 77  6f 62 62 6c 65 00        |WIBBLE=wobble.|
0000000e
# hexdump -C /proc/1058/cmdline
00000000  70 61 75 73 65 00                                 |pause.|
00000006
# hexdump -C /proc/1058/environ
00000000  57 49 42 42 4c 45 3d 77  6f 62 62 6c 65 00        |WIBBLE=wobble.|
0000000e
# 

Обратите внимание, что это не препятствует вещам, которые отслеживают процесс и обращаются к его памяти напрямую другими способами (, а не через эти два псевдо-файла ), и, конечно, оставляет окно до того, как строки будут изменяется там, где эта информация может быть видна, точно так же, как это происходит при перезаписи данных над стеком основного потока. Как и в случае с перезаписью данных, здесь не учитываются языковые библиотеки времени выполнения, которые при различных обстоятельствах создают копии среды (в куче ). В общем, не считайте, что это такой же хороший механизм для передачи «секретов» программе, как (, скажем ), когда он наследует дескриптор открытого файла в конец чтения безымянного канала, считывая его во входной буфер. полностью под вашим контролем, который вы затем стираете.

Дополнительная литература

1
24.02.2020, 05:58
1 ответ

Не паникуйте, я нашел ответ на этот очаг вопроса. Надеюсь, это не потеряется во всех ответах.

Для всех, кто ищет что-то подобное в будущем, решение для меня состояло в том, чтобы полностью уничтожить раздел EFI (с помощью parted live или вашего любимого диспетчера разделов восстановления ). Оттуда я создал новый раздел в формате FAT32 размером 256 МБ в конце моего первого диска и назвал его EFI. Некоторые руководства говорят вам, что этот раздел должен быть в начале диска, но согласно спецификации UEFI это не так.

Затем я загрузил установочный USB-накопитель Windows 10. Вошел в командную строку и использовал некоторые встроенные функции -для создания новых загрузочных файлов. Я в основном следовал руководству, найденному здесь , но для получения более подробной информации вы можете выполнить поиск «как создать окна раздела efi».

После этогоЯ не мог загрузить Linux, но процесс установки и настройки загрузчика с двойной загрузкой -с аварийным компакт-диском Linux тривиален и хорошо задокументирован.

1
28.04.2021, 23:22

Теги

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