__start_xen
|
|____percpu_init_areas 初始化percup資料需要的記憶體,從全局變量__per_cpu_start開始,每個結構配置設定2的PERCPU_SHIFT(13)次方位元組記憶體(8K)。
|
|____set_intr_gate 初始化TRAP_page_fault中斷,early_page_fault在entry.S檔案中定義, 中斷門執行級别為0
|
|____cmdline_parse 儲存到全局變量saved_cmdline中
|
|____parse_video_info 根據全局變量boot_vid_info初始化全局變量vga_console_info,懷疑boot_vid_info為bios内部的一塊記憶體塊,啥時候初始化的不知道???
RELOC_HIDE這個宏是啥意思???
|
|____set_current 設定位址0xfffff000為目前vcpu的位址
|
|____smp_prepare_boot_cpu 将目前cpu初始化到全局變量 cpu_online_map cpu_callout_map cpu_present_map cpu_possible_map中,并配置為線上狀态
|
|____console_init_preirq 初始化序列槽
|
|____ print video system infomation about BIOS
|
|____ check the e820_raw_nr ,some multi boot info and lowmem_kb for boot information
|
|____init_e820
| |
| |__sanitize_e820_map 整理e820記憶體段
| |
| |
| |__copy_e820_map 拷貝e820記憶體段到全局結構體e820中
| |
| |
| |__clip_to_limit 縮小e820的區域大小,通過減去e820數組後面的項目。
| |
| |
| |__reserve_dmi_region 通過修改e820中項目的類型,來将具有辨別符dmi的項的記憶體塊變為保留子產品
| |
| |
| |__mtrr_top_of_ram 通過查找MTRR的Write Block區域來判斷 top-of-RAM
|
|____kexec_reserve_area 将e820涉及的記憶體位址作為保留位址
|
|____針對boot allocte 和 multi boot info等資料結構進行初始化 mbi參數有startxen的參數傳入
|
|____bootstrap_map ensure mod[0] is mapped before parsing mod0是mbi的第一個子產品,需要確定這個子產品的記憶體已經映射完畢,且不需要使用pagetable
|
|____bzimage_headroom mod[0]的起始位址是setup_header結構。我覺得就是hvmloader
|
|____映射e820的記憶體到指定的位置 16MB to BOOTSTRAP_DIRECTMAP_END 這個地方就是在搬記憶體 map_pages_to_xen set_pdx_range???
| |
| |____set_pdx_range 設定page descripto index
| |
| |____map_pages_to_xen 建立新的映射 什麼意思???
| |
| |____搬移記憶體,并且重新配置頁表 ???
| |
| |____将mbi的搬移到第一個可用的e820記憶體中
| |
| |____配置kexec_crash_area記憶體塊。
|
|____reserve_e820_ram(&boot_e820, initial_images_base, initial_images_end) 将MBI的記憶體配置為保留e820資料
|
|____setup_max_pdx???
|
|____init_frametable 對全局變量pdx_group_valid中的所有位所對應的page進行初始化
| |
| |____init_frametable_chunk
|
|
|____acpi_boot_table_init
|
|
|____acpi_numa_init
|
|
|____numa_initmem_init
|
|
|____end_boot_allocator
|
|
|____vesa_init
|
|
|____softirq_init
| |
| |____open_softirq(TASKLET_SOFTIRQ, tasklet_action) 注冊軟中斷處理函數
| | |
| | |____tasklet_action 會處理全局事件連結清單tasklet_list中的next事件,并将其從連結清單中删除,根據連結清單的内容決定是否再次發出softirq的中斷
|
|
|____early_cpu_init 對多個常見CPU廠家的類型進行結構的初始化 結構定義在xen/xen/arch/x86/cpu目錄下相關檔案下。
| |
| |____early_cpu_detect 通過調用彙編指令cpuid 對CPU資訊進行初始收集
|
|
|____paging_init
|
|
|____tboot_probe tboot用于引導macOS系統
|
|
|
|____memguard_guard_stack
|
|
|____open_softirq(NEW_TLBFLUSH_CLOCK_PERIOD_SOFTIRQ, new_tlbflush_clock_period);
|
|
|____sort_exception_tables 按照結構的第一個成員的位址降排序兩個表__start___ex_table 和 __start___pre_ex_table,結構exception_table_entry 第一個成
員為指令允許fault的位址,第二個成員為程式能夠continue的位址,這兩個表的内容什麼時候初始化的??????????
|
|
|____find_smp_config 檢查第一的1k記憶體 第640的1k記憶體 1M記憶體的最後64k記憶體。
|
|
|____dmi_scan_machine 檢測smbios系統的資訊
|
|
|____generic_apic_probe
|
|
|____acpi_boot_init
|
|
|____init_cpu_to_node 初始化全局變量數組x86_cpu_to_apicid和apicid_to_node
|
|
|____get_smp_config
|
|
|____zap_low_mappings
|
|
|____init_apic_mappings
|
|
|____percpu_free_unused_areas
|
|
|____init_IRQ 初始化256個中斷,前16個用i8259A_irq_type作為handle初始化descriptor,後面的除了80(syscall)和82(hypercall),用interrupt數組初始化?
???
|
|
|____xsm_init xen security module初始化
|
|
|____init_idle_domain
| |
| |____scheduler_init
| |
| |____domain_create idle domain id is 0x7FFFU
| |
| |____alloc_vcpu
| |
| |____this_cpu(curr_vcpu) = current
|
|
|____trap_init
| |
| |____一系列的set_intr_gate方法,注冊門函數
| |
| |____CPU0 uses the master IDT
| |
| |____percpu_traps_init 調用msr對CPU進行初始化trap
| |
| |____cpu_init ???
| |
| |____open_softirq(NMI_MCE_SOFTIRQ, nmi_mce_softirq) 初始化數組softirq_handlers中的某個元素
|
|
|____rcu_init 一個2.6以後開始應用的鎖機制,對于多讀少寫進行保護的鎖機制。
|
|
|____timer_init
|
|
|____early_time_init
|
|
|____arch_init_memory
| |
| |____domain_create dom_xen
| |
| |____domain_create dom_io
| |
| |____domain_create dom_cow
| |
| |____将 0 到 1M記憶體 以及所有e820标記類型不是E820_RAM和E820_UNUSABLE的記憶體歸屬于 dom_io使用
| | |
| | |____share_xen_page_with_guest 修改page_info中關于dom的結構。
| |
| |____subarch_init_memory 将涉及RDWR_MPT的記憶體配置設定給 dom_xen
| | |
| | |____setup_compat_arg_xlat 配置argument translation area???? 為什麼要用那麼大的空間 32M 8K個頁
| |
| |____mem_sharing_init 初始化哈希連結清單
|
|
|____identify_cpu
| |
| |____用常量配置cpuinfo_x86中的一些成員
| |
| |____調用該結構的回調函數c_identify
| |
| |____調用該結構的回調函數c_init
| |
| |____初始化CPU結構的标志位成員x86_capability
| |
| |____mtrr_bp_init
|
|
|____local_irq_enable 一個問題 為什麼選擇的是這個CPU? smp_processor_id做了些什麼??
| |
| |____ __sti()
| |
| |____force_evtchn_callback 從全局變量HYPERVISOR_shared_info中取出需要配置的vcpu
| |
| |____do_hypervisor_callback 觸發全部挂載在結構evtchn_upcall_pending上的事件
|
|
|____vesa_mtrr_init 根據kernel參數vesa-mtrr 來初始化mtrr_types,然後在mtrr中配置相關的寄存器。
|
|
|____iommu_setup 根據kernel參數iommu設定的值,對iommu進行配置。
|
|
|____smp_prepare_cpus
| |
| |____ smp_boot_cpus 啟動多處理器中的其它未初始化的cpu
| |
| |____ mtrr_aps_sync_begin 同步多處理器的mtrr
|
|
|____spin_debug_enable 使能自旋鎖,在每次使用自旋鎖時都會檢測這裡面配置的變量。
|
|
|____init_xen_time
|
|
|____initialize_keytable 初始化熱鍵,也就是xm debug-key所支援的那些!! 可以用于調試 哈哈
|
|
|____console_init_postirq 沒看明白,主要是在dom heap中配置設定了一塊記憶體,然後對這塊記憶體初始化,
|
|
|____對每一個為present狀态的CPU
| |
| |____ rcu_online_cpu
| |
| |____ __cpu_up 這個應該是相關的那個關鍵的處理函數
| |
| |____ srat_detect_node 初始化與numa相關的資料結構,通過apicid_to_node取出acpi與node之間的關系,建立cpu與node的關系 node是個什麼概念???Set
up cpu_to_node[].
| |
| |____ numa_add_cpu 然後建立numa與node之間的關系??? Set up node_to_cpumask based on cpu_to_node[]
|
|____smp_cpus_done
| |
| |____ setup_ioapic_dest 配置acpi中有irq資訊的結構與irq結構進行初始化,pin這個概念不明晰。
| |
| |____ mtrr_save_state
| |
| |____ mtrr_aps_sync_end
|
|____initialise_gdb 通過啟動參數gdb 的配置可以實作對序列槽用于調試的配置。
|
|____do_initcalls 将__initcall_start 到 __initcall_end之間定義的初始化函數全部調用一遍,
|
|____watchdog_enable
|
|
|____tboot_protect_mem_regions 将一些txt_heap_base/sinit_base/TXT_PRIV_CONFIG_REGS_BASE位址設定為Unusable
|
|
|____建立Dom0
| |
| |____ domain_create 建立dom0
| |
| |____修改核心啟動的 指令選項
| |
| |____從mbi中找到啟動的起始位址和長度
| |
| |____construct_dom0
|
|
|____watchdog_enable
|
|
|____Create initial domain 0
| |
| |____domain_create
| |
| |____parase command line
| |
| |____construct_dom0
| |
| |____
|
|
|____scrub_heap_pages 将所有處于free狀态的頁都清空,以備用于非特權域使用
|
|
|____init_trace_bufs 根據啟動參數tbuf_size,确定是否使用trace 以及 每個CPU所配置設定的buffer的尺寸。
|
|
|____init_tmem
|
|
|____console_endboot
|
|
|____serial_endboot
|
|
|____domain_unpause_by_systemcontroller
|
|
|____reset_stack_and_jump
|
|
|____init_done
|
|
|____ Begin the endless loop for schedule.