3.5.1.268. __va

#define __va(x)     ((void *)__phys_to_virt((phys_addr_t)(x)))

__va 用于将一个物理地址转换成虚拟地址

3.5.1.269. vectors_base

#define vectors_base()  (vectors_high() ? 0xffff0000 : 0)

vectors_base 用于返回exception vector所在的虚拟地址

3.5.1.270. vectors_high

#if __LINUX_ARM_ARCH__ >= 4
#define vectors_high()  (get_cr() & CR_V)
#else
#define vectors_high() (0)
#endif

vectors_high 用于指明exception vector所在的位置,由SCTLR寄存器的’bit-13 V’决定.如果该bit为0,则exception vector位于0x00000000,反之 则为0xffff0000

3.5.1.271. vm_area_add_early

static struct vm_struct *vmlist __initdata;

void __init vm_area_early(struct vm_struct *vm)
{
    struct vm_struct *tmp, **p;

    //判断vmap_initialized是否为true
    BUG_ON(vmap_initialized);

    for(p = &vmlist; (tmp = *p) != NULL; p = &tmp->next)
    {
        if(tmp->addr >= vm->addr) {
            BUG_ON(tmp->addr < vm->addr + vm->size);
            break;
        } else {
            BUG_ON(tmp->addr + tmp->size > vm->addr);
        }
    }

    vm->next = *p'
    *p = vm;
}

vm_area_early 将一个vm_struct加入到内核早期的vmlist

3.5.1.272. vm_reseve_area_early

void __init vm_reserve_area_early(unsigned long addr, unsigned long size, void *caller)
{
    struct vm_struct *vm;
    struct static_vm *svm;

    svm = early_alloc_aligned(sizeof(*svm), __alignof__(*svm));

    vm = &svm->vm;
    vm->addr = (void *)addr;
    vm->size = size;
    vm->flags = VM_IOREMAP | VM_ARM_EMPTY_MAPPING;
    vm->caller = caller;
    add_static_vm_early(svm);
}

vm_reserve_area_early 给指定虚拟地址建立静态预留映射,但不对映实际的物理地址,只做预留作用

3.5.1.273. vmalloc_min

static void * __initdata vmmaloc_min = (void *)(VMALLOC_END - (240 << 20) - VMALLOC_OFFSET);

vmalloc_min 用于指向VMMALOC内存区域最低地址