grub2源码分析
文章平均质量分 68
tiantao2012
这个作者很懒,什么都没留下…
展开
-
grub的test命令
一般在build grub的最后会通过grub-mkimage来生成grubaa64.efi,其中-p 后面跟的是在grub.cfg 中可以支持的命令 ./bin/grub-mkimage -v -o grubaa64.efi -O arm64-efi -p / boot chain configfile efinet test这里重点看一下test这个命令。加上这个命令后,就可以在gru原创 2017-03-30 14:53:39 · 1170 阅读 · 0 评论 -
grub的reboot 命令实现
grub的reboot 命令如下:其路径在grub-core/commands/reboot.c 中static grub_err_t __attribute__ ((noreturn))grub_cmd_reboot (grub_command_t cmd __attribute__ ((unused)), int argc __attribute__ ((unuse原创 2017-06-16 16:25:11 · 2380 阅读 · 0 评论 -
grub2的exit命令
在grub-core/commands/minicmd.c 中有实现cat/help/dump/rmmod/lsmod/exit 命令GRUB_MOD_INIT(minicmd){ cmd_cat = grub_register_command ("cat", grub_mini_cmd_cat, N_("FILE"), N_("Show t原创 2017-07-06 17:02:51 · 1008 阅读 · 0 评论 -
grub中的date命令
grub的date命令实现在grub-core/commands/date.c 中GRUB_MOD_INIT(date){ cmd = grub_register_command ("date", grub_cmd_date, N_("[[year-]month-day] [hour:minute[:second]]"),原创 2017-08-01 08:53:51 · 712 阅读 · 0 评论 -
grub2 中时间的获取在arm和arm64的差别
在arm32的时候,在grub中通过调用bios提供的create_event 来产生时间戳,源码路径如下:grub-core/kernel/arm/efi/init.cincrement_timer (grub_efi_event_t event __attribute__ ((unused)), void *context __attribute__ ((unused)原创 2017-07-27 09:38:31 · 2306 阅读 · 0 评论 -
使用objdump grub中的命令
grub2中没有统一的symbol文件而是由一个一个的模块组成,这里以reboot 为例查看objdump -s 和objdump -S的区别原创 2017-07-27 17:14:32 · 687 阅读 · 0 评论 -
grub中为加载模块申请memory的初始化
grub中的程序像kenrel一样可以是buildin的,也可以build成模块。在需要时候通过insmod 加载进来例如下面这个grub.cfg 中的codemenuentry "Microsoft Windows 8.1" { echo "Loading Microsoft Windows 8.1..." insmod part_gpt insmod fat insmod sear原创 2017-09-15 15:08:09 · 2040 阅读 · 0 评论 -
grub2中 load 模块的过程
kern/dl.c:607: module at 0x2ffbc3ad40, size 0x718kern/dl.c:631: relocating to 0x2ffbc3ca20kern/arm64/dl_helper.c:51: reloc_xxxx64 0x2ffbc3c56c += 0xe4kern/arm64/dl.c:90: reloc_abs64 0x2ffbc3c59原创 2017-09-18 14:11:28 · 1338 阅读 · 0 评论 -
grub exit 命令failed
之前在grub 命令行中输入exit的时候回返回到bios,但是此时bios会挂掉。通过在bios中加log确认已经从grub返回到bios了,但是bios中查了好久也没有进展,后来找到如下patch解决了这个问题。Signed-off-by: Mark Salter --- grub-core/kern/arm/efi/init.c | 2 +- grub-core/kern/efi/原创 2017-11-21 14:22:29 · 1382 阅读 · 0 评论 -
grub中的import_unicode.py 分析之一
在autogen.sh中会执行下面的python脚本echo "Importing unicode..."${PYTHON} util/import_unicode.py unicode/UnicodeData.txt unicode/BidiMirroring.txt unicode/ArabicShaping.txt grub-core/unidata.c其中这个util/impo原创 2017-02-23 15:28:02 · 518 阅读 · 0 评论 -
grub中的import_unicode.py 分析之二
在autogen.sh中会执行下面的python脚本echo "Importing unicode..."${PYTHON} util/import_unicode.py unicode/UnicodeData.txt unicode/BidiMirroring.txt unicode/ArabicShaping.txt grub-core/unidata.c其中这个util/impo原创 2017-02-23 16:13:15 · 605 阅读 · 0 评论 -
grub中的autogen.sh分析
#! /usr/bin/env bashset -e #当有错误发生时,就退出当前脚本。# Set ${PYTHON} to plain 'python' if not set already: ${PYTHON:=python} # 如果没有定义PYHON的话,就让PYTHON=python。export LC_COLLATE=Cunset LC_ALLf原创 2017-02-23 14:27:22 · 1334 阅读 · 0 评论 -
grub2 boot kernel
grub/grub-core/kern/arm64/efi中的startup.s 是grub2的入口函数FUNCTION(_start) /* * EFI_SYSTEM_TABLE and EFI_HANDLE are passed in x1/x0. */ ldr x2, efi_image_handle_val str x原创 2016-12-14 20:38:15 · 2512 阅读 · 1 评论 -
grub2 的linux 和initrd命令
在grub2 中最重要的三个命令就是linux/initrd/boot 命令,那个命令只有linux/initrd 是需要用户在grub.cfg中指定的boot 命令系统会自动调用。在grub2中通过GRUB_MOD_INIT来初始化一个模块,就想kernel中的module_init一样GRUB_MOD_INIT (linux){ cmd_linux = grub_regi原创 2016-12-17 16:43:29 · 4289 阅读 · 0 评论 -
grub2 中的boot命令
boot命令的调用flow如下:grub_enter_normal_mode ->grub_normal_execute->grub_show_menu->show_menu->grub_menu_execute_entrygrub_menu_execute_entry(grub_menu_entry_t entry, int auto_boot){ if (grub_errn原创 2016-12-17 17:06:53 · 3176 阅读 · 0 评论 -
grub.cfg中if语句解析
grub.cfg 中支持if/else等语句,这些命令是通过c code来解析的,我们以if为例看看grub2中是如何用c语言解析if语句的.在grub 中if语句的处理如下/* Execute an if statement. */grub_err_tgrub_script_execute_cmdif (struct grub_script_cmd *cmd){原创 2016-12-17 17:58:06 · 1805 阅读 · 0 评论 -
grub2 中注册自定义的命令
在grub2中通过grub_register_command 来注册一个command例如: cmd_linux = grub_register_command ("linux", grub_cmd_linux, 0, N_("Load Linux."));static inline grub_command_tgrub_register_command (const原创 2016-12-17 21:23:39 · 917 阅读 · 0 评论 -
grub2中命令的执行
在grub中有两种方式在grub的源码中执行grub支持的命令一种是不带参数的,可以用grub_command_execute 来执行例如常见的normal/linux/boot 命令就是这样执行的。 grub_command_execute ("normal", 0, 0);还有一种带参数的.例如:smbios --type 0 --get-string 5 这种命令一般放原创 2017-02-04 17:21:07 · 2647 阅读 · 0 评论 -
grub2中normal 命令的执行
在normal命令的回调函数grub_cmd_normal 中会执行grub.cfg中定义的命令grub_cmd_normal (struct grub_command *cmd __attribute__ ((unused)), int argc, char *argv[]){ if (argc == 0) { /* Guess the原创 2017-02-04 17:36:50 · 2447 阅读 · 1 评论 -
grub2 linux等命令中不能使用环境变量
在menu.c中的grub_menu_execute_entry 中会调用grub_env_context_close 来关掉context。这样诸如linux/devicetree等这些命令中就不能在适应grub_env_get 这样的函数.可以看到grub_env_context_close 会把grub_current_context 这个list上的var全部释放掉.grub_原创 2017-02-07 15:06:34 · 970 阅读 · 0 评论 -
grub2中env绑定hook函数
在调用grub_env_get 获取环境变量的时候,可以对这个环境变量绑定一个处理函数。grub_env_get (const char *name){ struct grub_env_var *var; var = grub_env_find (name); if (! var) return 0; if (var->read_hook)原创 2017-02-08 08:58:26 · 762 阅读 · 0 评论 -
grub2-set-default 设置默认开机启动项
使用grub2-editenv list 可以查看grub.cfg中的入口项,通过grub2-set-default + 字符串可以设置默认的启动项[root@localhost ~]# grub2-editenv listsaved_entry=CentOS Linux 7 (AltArch)[root@localhost ~]# grub2-set-default "CentOS Lin...原创 2019-03-02 17:56:52 · 17378 阅读 · 3 评论