bugfix: 当物理机具有多个memory area的时候,无法正确使用这些区域的问题.以及在内核代码处出现内存空洞而导致无法正常运行的问题. (#448)

* bugfix: 当物理机具有多个memory area的时候,无法正确使用这些区域的问题.以及在内核代码处出现内存空洞而导致无法正常运行的问题.

解决方案:
1. 分区域把空闲页添加到buddy
2. 将内核链接到16M的位置,以避免uefi带来的内存空洞.

这个值是因为我看到linux的救援内核也是在16M的地址,因此猜测厂商不会使用这块内存.
尽管uefi规范讲的是固件可以采用任何地址,内核需要使用内核重定位技术去避免遇到内存空洞,但我没有这么做.
This commit is contained in:
LoGin
2023-11-19 11:42:53 +08:00
committed by GitHub
parent 46e234aef6
commit 99dbf38d2e
9 changed files with 275 additions and 157 deletions

View File

@ -102,6 +102,20 @@ bool multiboot2_get_VBE_info(const struct iter_data_t *_iter_data, void *data, u
return true;
}
/// @brief 获取加载基地址
/// @param _iter_data
/// @param data
/// @param reserved
/// @return
bool multiboot2_get_load_base(const struct iter_data_t *_iter_data, void *data, unsigned int *reserved)
{
if (_iter_data->type != MULTIBOOT_TAG_TYPE_LOAD_BASE_ADDR)
return false;
*(struct multiboot_tag_load_base_addr_t *)data = *(struct multiboot_tag_load_base_addr_t *)_iter_data;
return true;
}
/**
* @brief 获取帧缓冲区信息
*

View File

@ -434,6 +434,8 @@ void multiboot2_iter(bool (*_fun)(const struct iter_data_t *, void *, unsigned i
*/
bool multiboot2_get_memory(const struct iter_data_t *_iter_data, void *_data, unsigned int *count);
bool multiboot2_get_load_base(const struct iter_data_t *_iter_data, void *data, unsigned int *reserved);
/**
* @brief 获取VBE信息
*