struct domain *domain_create(domid_t dom_id, unsigned int cpu)
分配一个struct domain空间,并初始化此空间
之后执行construct_dom0
int construct_dom0(struct domain *d,
unsigned long guest_start, unsigned long guest_size,
unsigned long image_start, unsigned long image_size,
unsigned long initrd_start, unsigned long initrd_size,
char *cmdline)
模拟器启动参数都保存在domain_addrs[]中,其中domain0的相关属性为:
{
MEMMAP_GUEST_0_START_PADDR, // guest memory start 0x00200000
0x05e00000,//MEMMAP_GUEST_0_SIZE, // guest memory size 0x05e00000
MEMMAP_GUEST_0_ELF_IMAGE_PADDR, // elf image address 0x01c00000
// _binary_mini_start,
MEMMAP_GUEST_0_ELF_MAX_SIZE, // elf image size 0x00400000
MEMMAP_GUEST_0_RAMDISK_IMAGE_PADDR,//0, // ramdisk image address 0x00800000
0x00046daf,//MEMMAP_GUEST_0_RAMDISK_SIZE,//0, // ramdisk image size 0x00046daf
0, // commandline
0
}
要想指定Xen ARM的启动位置,需要修改此数据结构。当然,首先要将domain镜像加载如内存。
附domain和domain_addrs的定义
struct domain
{
domid_t domain_id;
shared_info_t *shared_info; /* shared data area */
spinlock_t big_lock;
spinlock_t page_alloc_lock; /* protects all the following fields */
struct list_head page_list; /* linked list, of size tot_pages */
struct list_head xenpage_list; /* linked list, of size xenheap_pages */
unsigned int tot_pages; /* number of pages currently possesed */
unsigned int max_pages; /* maximum value for tot_pages */
unsigned int xenheap_pages; /* # pages allocated from Xen heap */
/* Scheduling. */
int shutdown_code; /* code value from OS (if DOMF_shutdown) */
void *sched_priv; /* scheduler-specific data */
struct domain *next_in_list;
struct domain *next_in_hashbucket;
struct list_head rangesets;
spinlock_t rangesets_lock;
/* Event channel information. */
struct evtchn *evtchn[NR_EVTCHN_BUCKETS];
spinlock_t evtchn_lock;
grant_table_t *grant_table;
/*
* Interrupt to event-channel mappings. Updates should be protected by the
* domain's event-channel spinlock. Read accesses can also synchronise on
* the lock, but races don't usually matter.
*/
#define NR_PIRQS 256 /* Put this somewhere sane! */
u16 pirq_to_evtchn[NR_PIRQS];
u32 pirq_mask[NR_PIRQS/32];
/* I/O capabilities (access to IRQs and memory-mapped I/O). */
struct rangeset *iomem_caps;
struct rangeset *irq_caps;
struct rangeset *dma_caps;
unsigned long domain_flags;
unsigned long vm_assist;
atomic_t refcnt;
struct vcpu *vcpu[MAX_VIRT_CPUS];
/* Bitmask of CPUs which are holding onto this domain's state. */
cpumask_t domain_dirty_cpumask;
struct arch_domain arch;
void *ssid; /* sHype security subject identifier */
/* Control-plane tools handle for this domain. */
xen_domain_handle_t handle;
uint32_t store_port; //for xenstore kcr
unsigned long store_mfn; //for xenstore kcr
uint32_t console_port; //for console ldh
unsigned long console_mfn; //for console ldh
/* For ACM */
unsigned long scid;
uint8_t acm_batterylife;
uint16_t acm_battery_save_mode;
uint16_t acm_shutdown;
u32 *status;
void *scan_code;
};
struct domain_addr_set domain_addrs[4]= {
{
MEMMAP_GUEST_0_START_PADDR, // guest memory start
0x05e00000,//MEMMAP_GUEST_0_SIZE, // guest memory size
MEMMAP_GUEST_0_ELF_IMAGE_PADDR, // elf image address
// _binary_mini_start,
MEMMAP_GUEST_0_ELF_MAX_SIZE, // elf image size
MEMMAP_GUEST_0_RAMDISK_IMAGE_PADDR,//0, // ramdisk image address
0x00046daf,//MEMMAP_GUEST_0_RAMDISK_SIZE,//0, // ramdisk image size
0, // commandline
0
},
{
MEMMAP_GUEST_1_START_PADDR, // guest memory start
MEMMAP_GUEST_1_SIZE, // guest memory size
MEMMAP_GUEST_1_ELF_IMAGE_PADDR, // elf image address
//_binary_mini_start,
MEMMAP_GUEST_1_ELF_MAX_SIZE, // elf image size
0, // ramdisk image address
0, // ramdisk image size
0, // commandline
0
},
{
MEMMAP_GUEST_2_START_PADDR, // guest memory start
MEMMAP_GUEST_2_SIZE, // guest memory size
MEMMAP_GUEST_2_ELF_IMAGE_PADDR, // elf image address
MEMMAP_GUEST_2_ELF_MAX_SIZE, // elf image size
0, // ramdisk image address
0, // ramdisk image size
0, // commandline
0
},
{
MEMMAP_GUEST_3_START_PADDR, // guest memory start
MEMMAP_GUEST_3_SIZE, // guest memory size
MEMMAP_GUEST_3_ELF_IMAGE_PADDR, // elf image address
MEMMAP_GUEST_3_ELF_MAX_SIZE, // elf image size
0, // ramdisk image address
0, // ramdisk image size
0, // commandline
0
},
};