天天看點

Xen 彙編函數調用的第一個C函數 __start_xen 簡析

__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.