Одна альтернатива, которая могла бы быть более чистой, должна иметь 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
}
За эти 0,6 секунды происходят вещи. Все сообщения до "Starting kernel" распечатываются U-Boot Все сообщения из "Booting Linux" и далее распечатываются ядром Linux. Ядро должно инициализировать свои собственные структуры данных и ряд периферийных устройств (достаточно, чтобы иметь возможность распечатать трассу). Это требует времени.
Вы можете посмотреть, что делает ядро, прочитав main
. Сообщение "Booting Linux" приходит от вызова на smp_setup_processor_id
.
Можно отследить код в отладчике, чтобы увидеть, где он проводит время. Возможно, например, что инициализируется какое-то лишнее оборудование. Но вряд ли на этом этапе можно что-то выиграть.
Я бы догадался, что это во многом связано со способом приклеивания системного загрузчика и ядра . Разд. 5.1.3 (Загрузчик Bootstrap) в Embedded Linux Primer от Hallinan говорит следующее:
Некоторые загрузчики bootstrap выполняют проверку контрольной суммы образа ядра, и большинство распаковывают и перемещают образ ядра. Разница между начальным загрузчиком и начальным загрузчиком в этом контексте проста: Загрузчик управляет платой при включении питания и никак не зависит от ядра Linux. Напротив, основной задачей начального загрузчика является работа в качестве связующего звена между пустым металлическим системным загрузчиком и ядром Linux. Ответственность загрузчика заключается в обеспечении надлежащего контекста для запуска ядра, а также в выполнении необходимых действий по распаковке и перемещению двоичного образа ядра
Если вы увидите образ с ним, то увидите, что перед реальным выполнением ядра выполняются ассемблеры head.s
и head-
. Некоторые другие задачи, такие как распаковка ядра в память, должны быть выполнены, так как ядро не находится в форме kernel proper (vmlinux
), а сжато и приклеено к этим подпрограммам в виде образа piggy.gz
.
Хотя это и специфично для арки, но я думаю, что это может объяснить дополнительное время между переключением с Uboot на ядро.
Вы начинаете с функции do_bootm_linux
в bootm.c
и работаете с кодом. Также можно попробовать добавить параметр debug
или loglevel=7
при запуске ядра для получения дополнительной информации.