歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux內核

Linux內核start_kernel()函數

Linux內核start_kernel()函數
  1. asmlinkage void __init start_kernel(void)  
  2. {  
  3.     char * command_line;  
  4.     extern struct kernel_param __start___param[], __stop___param[];  
  5.   
  6.     smp_setup_processor_id();   
  7.     //空函數   
  8.   
  9.     /* 
  10.      * Need to run as early as possible, to initialize the 
  11.      * lockdep hash: 
  12.      */  
  13.   
  14.       
  15.     lockdep_init();/*初始化一些數據*/  
  16.     debug_objects_early_init();  
  17.     cgroup_init_early();  
  18.   
  19.     local_irq_disable(); /*關閉中斷*/  
  20.     early_boot_irqs_off();  
  21.     /*   
  22.      * 每一個中斷都有一個中斷描述符(struct irq_desc)來進行描述,這個函數的   
  23.      * 作用就是設置所有中斷描述符的鎖   
  24.      */    
  25.     early_init_irq_lock_class();  
  26.   
  27. /* 
  28.  * Interrupts are still disabled. Do necessary setups, then 
  29.  * enable them 
  30.  */  
  31.     lock_kernel(); /*鎖上內核,Linux是支持搶占CPU,放棄啟動被中斷(針對多處理器)*/  
  32.     tick_init(); /*初始化時鐘*/  
  33.     boot_cpu_init();/*//這個實際上是在多CPU環境下選擇CPU,這裡直接CPUID選擇的是0號cpu*/  
  34.     page_address_init(); /* 初始化頁地址,使用鏈表將其鏈接起來 */    
  35.     printk(KERN_NOTICE);  
  36.     printk(linux_banner); /*打印Linux版本*/  
  37.     setup_arch(&command_line); /* 這是一個重量級的函數了,會比較仔細地分析一下,主要完成了4個方面的工作,一個就是取得MACHINE和PROCESSOR的信息然或將他們賦值給kernel相應的全局變量,然後呢是對boot_command_line和tags接行解析,再然後呢就是memory、cach的初始化,最後是為kernel的後續運行請求資源。 */  
  38.     /*初始化內存*/  
  39.     mm_init_owner(&init_mm, &init_task);  
  40.     setup_command_line(command_line); /*保存命令行參數*/  
  41.     setup_per_cpu_areas();/* 為每個cpu申請內存空間 */  
  42.     setup_nr_cpu_ids();  
  43.     smp_prepare_boot_cpu(); /* arch-specific boot-cpu hooks//設置啟動的CPU為在線狀態.在多CPU架構下 */  
  44.   
  45.     /* 
  46.      * Set up the scheduler prior starting any interrupts (such as the 
  47.      * timer interrupt). Full topology setup happens at smp_init() 
  48.      * time - but meanwhile we still have a functioning scheduler. 
  49.      */  
  50.     sched_init();/*初始化進程調度器*/  
  51.     /* 
  52.      * Disable preemption - early bootup scheduling is extremely 
  53.      * fragile until we cpu_idle() for the first time. 
  54.      */  
  55.     preempt_disable(); /*禁止系統調用,即禁止搶占*/  
  56.     build_all_zonelists(); /*建立內存區域鏈表*/  
  57.     page_alloc_init();/*內存頁初始化*/  
  58.     printk(KERN_NOTICE "Kernel command line: %s\n", boot_command_line);/*打印Linux命令行啟動參數*/  
  59.     parse_early_param();/*解析參數*/  
  60.     parse_args("Booting kernel", static_command_line, __start___param,  
  61.            __stop___param - __start___param,  
  62.            &unknown_bootoption); //執行命令行解析,若參數不存在,則調用unknown_bootoption   
  63.     if (!irqs_disabled()) {  
  64.         printk(KERN_WARNING "start_kernel(): bug: interrupts were "  
  65.                 "enabled *very* early, fixing it\n");  
  66.         local_irq_disable();  
  67.     }/*判斷中斷是否關閉,若打開則關閉中斷*/  
  68.     sort_main_extable(); /*對異常處理函數排序*/  
  69.     trap_init();/*空函數*/  
  70.     rcu_init();/*初始化互斥機制*/  
  71.     /* init some links before init_ISA_irqs() */  
  72.     early_irq_init();/*中斷向量的初始化*/  
  73.     init_IRQ();/*完成其余中斷向量的初始化*/  
  74.     pidhash_init();/*進程Hash table的初始化*/  
  75.     init_timers();/*初始化定時器*/  
  76.     hrtimers_init();/*高精度時鐘初始化*/  
  77.     softirq_init();/*軟中斷初始化*/  
  78.     timekeeping_init();/*共用時鐘的初始化*/  
  79.     time_init();/*初始化系統時鐘*/  
  80.     sched_clock_init();/*進程調度時鐘初始化*/  
  81.     profile_init(); /* 對內核的profile(一個內核性能調式工具)功能進行初始化 */    
  82.     if (!irqs_disabled())  
  83.         printk(KERN_CRIT "start_kernel(): bug: interrupts were "  
  84.                  "enabled early\n");  
  85.     early_boot_irqs_on(); /*打開IRQ中斷*/  
  86.     local_irq_enable();  
  87.   
  88.     /* 
  89.      * HACK ALERT! This is early. We're enabling the console before 
  90.      * we've done PCI setups etc, and console_init() must be aware of 
  91.      * this. But we do want output early, in case something goes wrong. 
  92.      */  
  93.     console_init();/*打印中斷的初始化*/  
  94.     if (panic_later)  
  95.         panic(panic_later, panic_param);  
  96.   
  97.     lockdep_info();  
  98.   
  99.     /* 
  100.      * Need to run this when irqs are enabled, because it wants 
  101.      * to self-test [hard/soft]-irqs on/off lock inversion bugs 
  102.      * too: 
  103.      */  
  104.     locking_selftest();  
  105.   
  106. #ifdef CONFIG_BLK_DEV_INITRD   
  107.     if (initrd_start && !initrd_below_start_ok &&  
  108.         page_to_pfn(virt_to_page((void *)initrd_start)) < min_low_pfn) {  
  109.         printk(KERN_CRIT "initrd overwritten (0x%08lx < 0x%08lx) - "  
  110.             "disabling it.\n",  
  111.             page_to_pfn(virt_to_page((void *)initrd_start)),  
  112.             min_low_pfn);  
  113.         initrd_start = 0;  
  114.     }  
  115. #endif   
  116.     vmalloc_init(); /*內存池的初始化*/  
  117.     vfs_caches_init_early();/*虛擬文件系統的初始化*/  
  118.     cpuset_init_early();/*空函數*/  
  119.     page_cgroup_init();/**/  
  120.     mem_init();/*對全局的物理頁變量初始化,對沒有分配的頁面初始化*/  
  121.     enable_debug_pagealloc();  
  122.     cpu_hotplug_init();/*空函數*/  
  123.     kmem_cache_init();/*內核內存緩沖池的初始化*/  
  124.     debug_objects_mem_init();  
  125.     idr_init_cache();/*idr初始化緩沖*/  
  126.     setup_per_cpu_pageset();/*空函數*/  
  127.     numa_policy_init();/*空函數*/  
  128.     if (late_time_init)  
  129.         late_time_init();  
  130.     calibrate_delay(); /*校驗延時函數的精確度*/  
  131.     pidmap_init();/*進程號位圖初始化,一般用一個page來只是所有的進程PID占用情況*/  
  132.     pgtable_cache_init();/*空函數*/  
  133.     prio_tree_init();/*初始化優先級數組*/  
  134.     anon_vma_init();/*空函數*/  
  135. #ifdef CONFIG_X86   
  136.     if (efi_enabled)  
  137.         efi_enter_virtual_mode();  
  138. #endif   
  139.     thread_info_cache_init();/*空函數*/  
  140.     cred_init();  
  141.     fork_init(num_physpages);/*初始化fork()環境*/  
  142.     proc_caches_init();/*為proc文件系統創建高速緩存*/  
  143.     buffer_init();/*空函數*/  
  144.     key_init();/*沒有鍵盤為空,有鍵盤初始化一個高速緩存*/  
  145.     security_init();/*空函數*/  
  146.     vfs_caches_init(num_physpages); /*虛擬文件系統掛載*/  
  147.     radix_tree_init();/*radix樹的初始化,供頁面查找*/  
  148.     signals_init();/*初始化信號量*/  
  149.     /* rootfs populating might need page-writeback */  
  150.     page_writeback_init();/*CPU在內存中開辟高速緩存,CPU直接訪問高速緩存提以高速度。當cpu更新了高速緩存的數據後,需要定期將高速緩存的數據寫回到存儲介質中,比如磁盤和flash等。這個函數初始化寫回的周期*/  
  151. #ifdef CONFIG_PROC_FS   
  152.     proc_root_init();/*如果配置了proc文件系統,則需初始化並加載proc文件系統。在根目錄的proc文件夾就是proc文件系統,這個文件系統是ram類型的,記錄系統的臨時數據,系統關機後不會寫回到flash中*/  
  153. #endif   
  154.     cgroup_init();/*空函數*/  
  155.     cpuset_init();/*空函數*/  
  156.     taskstats_init_early();/*進程狀態初始化,實際上就是分配了一個存儲線程狀態的高速緩存*/  
  157.     delayacct_init();/*空函數*/  
  158.   
  159.     check_bugs();/*測試CPU的缺陷,記錄檢測的缺陷,便於內核其他部分工作��需要*/  
  160.   
  161.     acpi_early_init(); /* before LAPIC and SMP init */  
  162.   
  163.     ftrace_init();  
  164.   
  165.     /* Do the rest non-__init'ed, we're now alive */  
  166.     rest_init(); /* 創建init進程 */    
  167. }  
Copyright © Linux教程網 All Rights Reserved