Почему в ядре Linux нет оптимизированных функций, как в glibc (например, memchr, strchr)?

Вот вариант ответа Уилла . Он включает в себя дополнительный catпроцесс, но предлагает удобство heredoc. Вкратце это выглядит так:

f () 
{
    echo ok;
}

cat <

Если вы хотите больше пищи для размышлений, попробуйте это:

#!/bin/bash

f () 
{ 
    x="a b"; 
    menu "$x"; 
    y="difficult thing"; 
    echo "a $y to parse"; 
}

menu () 
{
    [ "$1" == "a b" ] && 
    echo "here's the menu"; 
}

cat <

Выход::

here's the menu
a difficult thing to pass

Здесь у нас есть функция menu, соответствующая функции в вопросе, которая «определена в другом месте основного скрипта». Если "в другом месте" означает, что его определение уже было прочитано на этом этапе, когда функция, требующая sudo, выполняется, то ситуация аналогична. Но, возможно, его еще не читали. Может быть другая функция, которая вызовет его определение. В этом случае declare -f menuнужно заменить на что-то более сложное или весь скрипт подправить таким образом, что функция menuуже объявлена.

25
12.02.2020, 08:01
1 ответ

Я помню, что мне пришлось исправить ошибку дампа ядра ядра в Solaris в 2006 году, которая была вызвана файловой системой ISO -9660 + Rock Ridge, созданной чем-то другим, а не mkisofs.

Это программное обеспечение для форматирования ISO включало имя файла Rock Ridge не в середине записи каталога ISO -9660 (, как это сделано mkisofs), а в конце записи каталога ISO -9660. Теперь вам нужно знать, что имена файлов Rock Ridge не заканчиваются нулевым байтом...

Случилось так, что (в то время слишком сильно оптимизированные )строковые подпрограммы в ядре Solaris могли в некоторых случаях перегружаться на единицу, и если имя файла Rock Ridge заканчивалось точно в конце 2-килобайтного сектора и этот сектор заканчивался как раз в конце страницы памяти ядра размером 4 КБ, это превышение доступа вызвало панику ядра из-за нелегального доступа к памяти.

Нам нужно было переписать код доступа, чтобы он был очень консервативным, чтобы предотвратить эту панику ядра в будущем.

Как видите, иногда гораздо сложнее написать безопасный код для ядра, и такой код иногда немного медленнее просто для того, чтобы избежать паники ядра.

Кстати, :проблему с потенциально непредсказуемой предварительной выборкой из ЦП в программах пользовательского пространства можно решить, позволив компоновщику добавить несколько байтов после сегментов, если существует вероятность достижения конца страницы MMU. Это не работает в ядре, которое зависит от области отображения.

7
28.04.2021, 23:23

Теги

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