![Grub2 中的字符串操作](https://linux22.com/image/1250006/Grub2%20%E4%B8%AD%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%93%8D%E4%BD%9C.png)
Grub2 的新功能之一是脚本化。我在工作中使用它效果很好。然而,我最近发现了一个严重的缺点。它不支持任何字符串操作或算术运算。
我的具体问题:我需要在启动之前弄乱 PCI 设备。在setpci
和之间,write_dword
我可以轻松写入所需的值。我从中获取基地址寄存器setpci
,并将 0x18 写入其中,然后将所需的值写入该地址。
我在实验时在脑子里做了计算,但现在我不知道如何让 Grub2 在启动时做同样的计算。
更糟糕的是,PCI 地址总是以 000 结尾。所以理论上我可以用“18”这也行得通。Grub2 再次让我失望,不支持字符串操作。
有没有办法在 Grub2 脚本中获取子字符串?
有没有办法在 Grub2 脚本中执行算术运算?
答案1
如果你想要 Grub2 中的脚本功能,你需要lua 支持,它不是发布版本的一部分。它是grub-extras,你可以得到来源:bazaar 仓库。您需要从源代码重建 Grub2。我认为除了源代码之外没有任何文档,不过您可以在grub-devel邮件列表。祝你好运。
答案2
该regexp
命令可用于执行有限的字符串操作。
https://www.gnu.org/software/grub/manual/grub/grub.html#regexp
未经测试的示例:
regexp --set base "(....)00" "$reg"
if [ "$base" != "" ]; then
setpci "${base}18" ...
fi