Как стать автором
Обновить

Комментарии 8

На скрине вроде бы ошибка на initrd вылезает - м.б. дело в его размере?

Да, именно в его. Под ядром не конкретно файл kernel в данном случае имеется в виду.

Не хочу быть нудным, но:

sudo journalctl --list-boots
sudo journalctl -p 3..1 -xe --since "Tue 2023-02-28 19:51:46"

Кто писать-то это будет в журнал, когда загрузка ядра даже не начинается? Мы говорим о коде EFI.

и грузит ядро одной физической командой чтения.

размер буфера чтения ограничен как раз величиной 16 мегабайт.

где файл читается порциями по 1 мегабайту

приводит к ошибке чтения и мгновенному возврату обратно в меню.

Если это про операцию read с диска, то эти цитаты демонстрируют непонимание как все работает на самом деле.


Операция read совершенно не обязана читать столько, сколько запросил вызывающий. Она читает сколько возможно и возвращает количество прочитанных байт. И это никак ошибкой не является. Программист должен проверить прочиталось ли нужное количество или нет и если нет, должен вызвать функцию снова для разницы. Все.


Читать именно порциями по 1МБ не исправляет ситуацию ну никак, потому что 1МБ тоже может не прочитаться полностью. По крайней мере гарантии никакой нет. То есть заменили один баг на другой.

Вы говорите о реализации функции read в libc, в то время как речь идёт о функции Read (с большой буквы даже) в EFI API. Она возвращает только код возврата, судя по коду Lenovo.

На этом этапе ещё нет ядра операционной системы и всех этих приятностей.

А где можно об этом прочитать? По крайней мере, если функция возвращает только код ошибки (кстати, read тоже возвращает код ошибки, отрицательными числами (я говорю скорее всего о sys_read (но это не суть))).


Но даже если и так, то тогда та же функция должна иметь ограничение на входных параметрах, чтобы не задавали размер больше чем она может читать физически. И тогда обязанность выбирать правильный размер тоже на того кто вызывает функцию. Правда, тогда чтением порциями в 1МБ багом не является.

А где можно об этом прочитать?

Я так понимаю, в описании EFI.

Но даже если и так, то тогда та же функция должна иметь ограничение на входных параметрах, чтобы не задавали размер больше чем она может читать физически

Функции всё равно, чтение осуществляет контроллер диска. Это по сути просто прототип функции, содержащий ссылку на реализацию в прошивке контроллера (как водится, через несколько уровней абстракции, но без изменения содержания). Lenovo пишет, что всё зависит именно от HBA, но я думаю, что диск тоже играет роль.

Как только дело доходит до функций работы с железом напрямую, в современных системах, честно говоря, просто глюк на глюке. Драйвер контроллеров SAS MegaRAID, входящий во все дистрибутивы Linux, например, просто виснет, когда размер читаемого блока не кратен 512 байтам (а это так для работы с ленточными накопителями через /dev/stN). Я смотрел этот код, там просто кошмар.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории