Почему начальная загрузка ядра запускается слишком поздно

Одна альтернатива, которая могла бы быть более чистой, должна иметь answer возвратитесь 0 или возвратитесь 1, в зависимости от того, сказал ли пользователь yes или no. Затем протестируйте значение answer в месте, где Вы называете его и только делаете действие если answer возвращенный 0.

На основе Вашего более раннего сценария это выглядело бы примерно так:

while tomcat_running && user_wants_to_stop_tomcat; do
    echo "$tomcat_status_stopping"
    kill $RUN
    sleep 2
done

function tomcat_running() {
    check_tomcat_status
    [ -n "$RUN" ]
}

function user_wants_to_stop_tomcat() {
    answer "WARNING: Tomcat still running. Kill it? "
}

function answer() {
    while true; do
        printf "$1"
        read response
        case $response in
        [yY][eE][sS]|[yY])
            return 0
            ;;
        [nN][oO]|[nN])
            return 1
            ;;
        *)
            printf "Please, enter Y(yes) or N(no)!\n"
            ;;
        esac
    done
}
2
17.06.2014, 16:31
3 ответа

За эти 0,6 секунды происходят вещи. Все сообщения до "Starting kernel" распечатываются U-Boot Все сообщения из "Booting Linux" и далее распечатываются ядром Linux. Ядро должно инициализировать свои собственные структуры данных и ряд периферийных устройств (достаточно, чтобы иметь возможность распечатать трассу). Это требует времени.

Вы можете посмотреть, что делает ядро, прочитав main. Сообщение "Booting Linux" приходит от вызова на smp_setup_processor_id.

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

3
27.01.2020, 21:54

Я бы догадался, что это во многом связано со способом приклеивания системного загрузчика и ядра . Разд. 5.1.3 (Загрузчик Bootstrap) в Embedded Linux Primer от Hallinan говорит следующее:

Некоторые загрузчики bootstrap выполняют проверку контрольной суммы образа ядра, и большинство распаковывают и перемещают образ ядра. Разница между начальным загрузчиком и начальным загрузчиком в этом контексте проста: Загрузчик управляет платой при включении питания и никак не зависит от ядра Linux. Напротив, основной задачей начального загрузчика является работа в качестве связующего звена между пустым металлическим системным загрузчиком и ядром Linux. Ответственность загрузчика заключается в обеспечении надлежащего контекста для запуска ядра, а также в выполнении необходимых действий по распаковке и перемещению двоичного образа ядра

Если вы увидите образ с ним, то увидите, что перед реальным выполнением ядра выполняются ассемблеры head.s и head-.s. Некоторые другие задачи, такие как распаковка ядра в память, должны быть выполнены, так как ядро не находится в форме kernel proper (vmlinux), а сжато и приклеено к этим подпрограммам в виде образа piggy.gz.

Хотя это и специфично для арки, но я думаю, что это может объяснить дополнительное время между переключением с Uboot на ядро.

2
27.01.2020, 21:54

Вы начинаете с функции do_bootm_linux в bootm.c и работаете с кодом. Также можно попробовать добавить параметр debug или loglevel=7 при запуске ядра для получения дополнительной информации.

1
27.01.2020, 21:54

Теги

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