PHP
首页 | 下载 | 博客 | 链接

区域

工具

查看代码的工具推荐用cscope,配合vim查找原型/函数/结构相当方便,如果怕麻烦,lxr也是个不错的选择,比如lxr.linux.no


xen 3.4 代码分析

xen的启动(schedule)
xen的运行(schedule)
schedule && credit
Event Channel
per cpu
上下文切换过程
数据结构
hypercall


xen 3.0 代码分析

xen启动/运行过程简介


资源链接

to be continue...


说明

文章中引用的版本是xen-3.0.4,分析的是x86_64平台. 为了保证行号的一致性,中文的注释没有插入回车/换行符.可能会显得有些紧巴巴的.
由于个人能力有限,网站内容存在许多错误和不足,希望读者批评指正. 本人联系方式:yubo@yubo.org

运行中的xen(schedule方面)

运行中的dom可能会不断的调用某些schedule函数,使得pcpu与vcpu之间达到平衡

startup_cpu_idle_loop() -> continue_cpu_idle_loop() -> do_softirq()
    softirq_handlers[]为静态变量,里面存放了与中断编号相对应的函数指针,该函数数组使用open_softirq()进行注册,下面列出xen(ia64)的中断对应的函数调用
  1. TIMER_SOFTIRQ -> timer_softirq_action()
  2. SCHEDULE_SOFTIRQ -> schedule()***待续
  3. NEW_TLBFLUSH_CLOCK_PERIOD_SOFTIRQ -> new_tlbflush_clock_period()
  4. PAGE_SCRUB_SOFTIRQ -> page_scrub_softirq()
  5. RCU_SOFTIRQ -> rcu_process_callbacks()
  6. STOPMACHINE_SOFTIRQ -> stopmachine_softirq()
  7. TASKLET_SOFTIRQ -> tasklet_action()
    1. ia64
    2. CMC_DISABLE_SOFTIRQ -> ia64_mca_cmc_vector_disable()
    3. CMC_ENABLE_SOFTIRQ -> ia64_mca_cmc_vector_enable()
      x86
    1. NMI_MCE_SOFTIRQ -> nmi_mce_softirq()
    2. TIME_CALIBRATE_SOFTIRQ -> local_time_calibration()
    3. VCPU_KICK_SOFTIRQ -> vcpu_kick_softirq()

xen/include/xen/softirq.h

  1.  /* Low-latency softirqs come first in the following list. */
  2.  enum {
  3.   TIMER_SOFTIRQ = 0,
  4.   SCHEDULE_SOFTIRQ,
  5.   NEW_TLBFLUSH_CLOCK_PERIOD_SOFTIRQ,
  6.   PAGE_SCRUB_SOFTIRQ,
  7.   RCU_SOFTIRQ,
  8.   STOPMACHINE_SOFTIRQ,
  9.   TASKLET_SOFTIRQ,
  10.   NR_COMMON_SOFTIRQS
  11.  };

xen/include/asm-ia64/softirq.h

  1.  #define CMC_DISABLE_SOFTIRQ (NR_COMMON_SOFTIRQS + 0)
  2.  #define CMC_ENABLE_SOFTIRQ (NR_COMMON_SOFTIRQS + 1)

xen/include/asm-x86/softirq.h

  1.  #define NMI_MCE_SOFTIRQ (NR_COMMON_SOFTIRQS + 0)
  2.  #define TIME_CALIBRATE_SOFTIRQ (NR_COMMON_SOFTIRQS + 1)
  3.  #define VCPU_KICK_SOFTIRQ (NR_COMMON_SOFTIRQS + 2)




schedule()

schedule()何时被调用?

在xen的大循环中,do_softirq()先通过下面的过程得到cpuid
do_softirq() -> smp_processor_id() -> raw_smp_processor_id() -> get_processor_id() -> get_cpu_info()

然后用softirq_pending()取出该cpu的pending值(64bitmap),
softirq_pending() -> cpu_data() -> per_cpu() -> RELOC_HIDE()

用find_first_set_bit()宏找到第一个设置为1的位i,用clear_bit()将i位置0,然后调用softirq_handlers[i],schedule()对应的是第1个位(从0开始)

bitmap的schedule位何时被设置?

在大循环函数中,raise_softirq(SCHEDULE_SOFTIRQ);会在每次do_softirq()之前执行.设置SCHEDULE_SOFTIRQ中断位

schedule()解析

见下一章节
 
Done in 0.0423729419708 seconds