c - 在 Grub 2.02 源代码中查找倒数计时器
问题描述
将 Grub 的超时更改为 1/10 或 1/100 秒间隔
在 AMD64 架构的 UEFI 系统上使用 Grub 2.02。我想将 grub 的超时计数器从 1 秒间隔更改为 1/10 秒或 1/100 秒间隔。原因是为了让gfxmenu
循环进度倒计时不那么“断断续续”。下面的启动 GIF 显示循环 1 秒“块”中的 5 秒倒计时:
修改源代码并重新编译成功后,/etc/default/grub
会修改如下:
- 如果间隔为 1/10 秒,则 2.5 秒倒计时为
GRUB_TIMEOUT=25
. - 如果间隔为 1/100 秒,则 2.5 秒倒计时为
GRUB_TIMEOUT=250
.
Grub 2.02 源是 1/2 百万行
我已经按照这里的描述下载了源代码:how to build grub2 bootloader from it's source and test it with qemu emulator and 花时间浏览源文件。但是有 477k 行要搜索:
~/src/grub-2.02$ wc -l **/*
20 asm-tests/arm.S
18 asm-tests/i386-pc.S
4 asm-tests/i386.S
11 asm-tests/mips.S
8 asm-tests/powerpc.S
(... SNIP ...)
115 util/spkmodem-recv.c
477316 total
我在Ask Ubuntu中完成了许多 bash 项目,但这将是我的第一个 C/Assembler Linux 项目。作为一个“新手”,我的想法是:
- 哪个文件包含倒数计时器源代码?
- 如何将时间间隔更改为 1/10 秒或 1/100 秒?
- 将源代码放在我的主目录下是一种传统方法吗?
- 任何有关在 Virtualbox 中编译和测试的技巧都会有所帮助。
请注意只有第一个问题是相关的。其他问题是作者选择更详细的答案。
解决方案
变量GRUB_TIMEOUT
在 中进行评估util/grub.d/00_header.in
。
if [ "x$GRUB_BUTTON_CMOS_ADDRESS" != "x" ]; then
cat <<EOF
if cmostest $GRUB_BUTTON_CMOS_ADDRESS ; then
EOF
make_timeout "${GRUB_HIDDEN_TIMEOUT_BUTTON}" "${GRUB_TIMEOUT_BUTTON}" "${GRUB_TIMEOUT_STYLE_BUTTON}"
echo else
make_timeout "${GRUB_HIDDEN_TIMEOUT}" "${GRUB_TIMEOUT}" "${GRUB_TIMEOUT_STYLE}"
echo fi
else
make_timeout "${GRUB_HIDDEN_TIMEOUT}" "${GRUB_TIMEOUT}" "${GRUB_TIMEOUT_STYLE}"
fi
请注意,这是一个生成脚本的脚本,这就是它看起来很奇怪的原因。 make_timeout
看起来像这样(同上):
make_timeout ()
{
if [ "x${3}" != "x" ] ; then
timeout="${2}"
style="${3}"
elif [ "x${1}" != "x" ] && [ "x${1}" != "x0" ] ; then
# Handle the deprecated GRUB_HIDDEN_TIMEOUT scheme.
timeout="${1}"
if [ "x${2}" != "x0" ] ; then
grub_warn "$(gettext "Setting GRUB_TIMEOUT to a non-zero value when GRUB_HIDDEN_TIMEOUT is set is no longer supported.")"
fi
if [ "x${GRUB_HIDDEN_TIMEOUT_QUIET}" = "xtrue" ] ; then
style="hidden"
verbose=
else
style="countdown"
verbose=" --verbose"
fi
else
# No hidden timeout, so treat as GRUB_TIMEOUT_STYLE=menu
timeout="${2}"
style="menu"
fi
cat << EOF
if [ x\$feature_timeout_style = xy ] ; then
set timeout_style=${style}
set timeout=${timeout}
EOF
if [ "x${style}" = "xmenu" ] ; then
cat << EOF
# Fallback normal timeout code in case the timeout_style feature is
# unavailable.
else
set timeout=${timeout}
EOF
else
cat << EOF
# Fallback hidden-timeout code in case the timeout_style feature is
# unavailable.
elif sleep${verbose} --interruptible ${timeout} ; then
set timeout=0
EOF
fi
cat << EOF
fi
EOF
}
正如你所看到的,它只是sleep
在最后调用了一些选项。该命令定义在grub-core/commands/sleep.c
. 虽然该sleep
命令只能以整秒为增量休眠,但底层函数grub_millisleep
可以做得更好。
通过更改对 的所有grub_millisleep(1000)
调用来修补此函数应该很容易grub_millisleep(100)
,但请记住,这会破坏sleep
. 一个更简洁的选项是添加一个新选项,sleep
以便可以根据具体情况选择行为。
推荐阅读
- php - 如何使用 PHP 将 NULL 插入十进制类型列?
- python - Python中是否有一些函数可以生成具有特殊条件的矩阵?
- python - 如何乘以python流星对象
- python - pygame.init() 终止程序没有错误
- c++ - 使用单独类中的 ->GetString(" ") 时出现段错误
- php - 如何制作变量“?” 在 laravel 5.8 中
- c# - 使用 image.FromStream 方法从 byte[] 转换为 image
- jwt - 如何使用 Auth0 和 JWT 限制特定角色的 aspnet 核心操作
- plot - 绘制与连续和虚拟交互的边际效应
- python-3.x - 使用异步队列时重复的 python id