【GRUB】增加自定义命令
代码上的直观理解
首先GRUB2的源代码来自grub-2.02: GRUB2源代码,来自ftp://ftp.gnu.org/gnu/grub/,版本是grub-2.02.tar.gz。。
关于如何编译和使用可以参考GRUB2编译与使用 。
于是我们就能够进入到GRUB界面了:
从上图还可以看到使用了hello这条命令。
查看代码,发现确实是有一个hello.c的文件,其实现如下:
GRUB_MOD_LICENSE ("GPLv3+");
static grub_err_t
grub_cmd_hello (grub_extcmd_context_t ctxt __attribute__ ((unused)),
int argc __attribute__ ((unused)),
char **args __attribute__ ((unused)))
{
grub_printf ("%s\n", _("Hello World"));
return 0;
}
static grub_extcmd_t cmd;
GRUB_MOD_INIT(hello)
{
cmd = grub_register_extcmd ("hello", grub_cmd_hello, 0, 0,
N_("Say `Hello World'."), 0);
}
GRUB_MOD_FINI(hello)
{
grub_unregister_extcmd (cmd);
}
从上述的代码,很容易看出来GRUB下的命令是如何实现的,即使用grub_register_extcmd()来注册其实现。
基本上关于命令的实现就这么简单。
然而……
问题出现
为了进一步验证hello命令就是上述的代码引入的,这里修改了打印信息:
static grub_err_t
grub_cmd_hello (grub_extcmd_context_t ctxt __attribute__ ((unused)),
int argc __attribute__ ((unused)),
char **args __attribute__ ((unused)))
{
grub_printf ("%s\n", _("Goodbye World"));
return 0;
}
修改完之后重新编译,可以看到编译的打印中hello.c确实是被重新编译了。
但是却发现结果还是打印Hello World,而不是这里修改的Goodbye World。
比较两次生成的二进制:
发现除了一个类似时间戳的东西发生了变化,没有其它的变化,也就是说上述修改的字符串根本就没有生效。
由于不是很懂Linux下的编译,所以目前没有看出问题的原因。
需要好好查下……
更新:在【GRUB】GRUB2编译与使用已经说明了原因。
还没有评论,来说两句吧...