在Linux启动时尽早保留物理内存空间

时间:2016-01-15 01:30:43

标签: linux linux-kernel linux-device-driver

我正试图在系统启动后尽早找到为专有内存类型硬件保留物理内存的方法(使用Intel Xeon服务器平台的Linux CentOs)。

我在arch / x86 / kernel / setup.c中的setup_arch()处执行了以下操作并且它可以工作,但发现我不允许修补内核。要求是没有BIOS和内核mod。

setup_arch()
{    
  ....
  // Calls a proprietary function that returns custom proprietary memory module's starting address and size. 

  memblock_reserve(mem_start_addr, mem_size);  
  .....
 }

我不能在Grub上使用memmap = xx / xx,因为设备的开始和大小是未知的(必须是"通过软件发现"

有没有办法做到这一点?

1 个答案:

答案 0 :(得分:2)

一个想法是编写自定义grub模块并使用它设置memmap=xx。 以下是如何做到这一点。

请注意,以下方法仅适用于CentOS 6.x or below uses grub 0.9x以上的CentOS 7。 在这种情况下,您可能需要修改grub 0.9x的代码并替换/boot/grub/stage1/boot/grub/stage2

$ git clone git://git.savannah.gnu.org/grub.git
$ cd grub
$ git checkout grub-2.02-beta2 # CentOS 7 currently uses grub-2.02-beta
$ vim grub-core/Makefile.core.def # add following row
module = {
    name = my_custom_module;
    common = lib/my_custom_module.c;
};

$ vim grub-core/lib/my_custom_module.c # create following file
#include <grub/dl.h>
#include <grub/env.h>

GRUB_MOD_LICENSE ("GPLv3+");

GRUB_MOD_INIT(my_custom_module){
    // Calls a proprietary function that returns custom proprietary memory module's starting address and size.
    const char *mem_size = "123";
    grub_env_set("my_memsize",mem_size);
}
GRUB_MOD_FINI(my_custom_module){
}
$ ./autogen.sh
$ ./configure
$ make

现在您可以找到grub-core/my_custom_module.mod已创建。 所以将其复制到/boot/grub2/i386-pc/(或您的*.mod文件存在的任何内容)

编辑grub.conf并添加类似

的内容
insmod my_custom_module
linux /boot/vmlinuz-3.10.el7.x86_64 root=UUID=1a3b5c7d9 ro memmap=${my_memsize}