chipset: msm8x25
codebase: android4.1
PMEM是高通使用的固定内存分配机制,ION是Google为了使各家厂商使用同一种固定内存分配机制而出现的产物。
当然在ION使用的情况下,PMEM也是可以被定义使用的,主要看用户空间选择哪个了,不过两者并存实在没这个必要,毕竟很浪费内存。
先看下kernel在开机的时候是如何申请这部分内存作为PMEM使用的。
万事从start_kernel开始:
asmlinkage void __init start_kernel(void)
{
char * command_line;
extern const struct kernel_param __start___param[], __stop___param[];
//snip
setup_arch(&command_line);
//snip
}
void __init setup_arch(char **cmdline_p)
{
struct machine_desc *mdesc;
setup_processor();
mdesc = setup_machine_fdt(__atags_pointer);
if (!mdesc)
mdesc = setup_machine_tags(machine_arch_type);
machine_desc = mdesc;
machine_name = mdesc->name;
//snip
arm_memblock_init(&meminfo, mdesc);
paging_init(mdesc);
//snip
if (mdesc->init_early)
mdesc->init_early();
}
void __init arm_memblock_init(struct meminfo *mi, struct machine_desc *mdesc)
{
//snip
/* reserve any platform specific memblock areas */
/*调用平台相关函数指针,这里为board-msm7x27.c中的
msm7x27a_reserve_info 的msm7x27a_calculate_reserve_size函数。
*/
if (mdesc->reserve)
mdesc->reserve();
//snip
}
mdesc结构为struct machine_desc,不了解的可以学习下这个结构体的用法,网上一搜一大把,这里直接转到
我们对应的地方去:
MACHINE_START(MSM7X27A_SURF, "QCT MSM7x27a SURF")
.atag_offset = 0x100,
.map_io = msm_common_io_init,
.reserve = msm7x27a_reserve,
.init_irq = msm_init_irq,
.init_machine = msm7x2x_init,
.timer = &msm_timer,
.init_early = msm7x2x_init_early,
.handle_irq = vic_handle_irq,
MACHINE_END
static void __init msm7x27a_reserve(void)
{
reserve_info = &msm7x27a_reserve_info;
msm_reserve();
}
void __init msm_reserve(void)
{
unsigned long msm_fixed_area_size;
unsigned long msm_fixed_area_start;
/*初始化内存池相关结构,看来它想讲申请的内存