新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > arm linux 啟動之二:start_kernel到創建1號進程

        arm linux 啟動之二:start_kernel到創建1號進程

        作者: 時間:2016-11-09 來源:網絡 收藏
        本文介紹arm linux啟動的第二部分,C語言編寫,主要講述start_kernel到1號進程的創建。主要講述大概過程,以后再對子函數進行講解。

        一、start_kernel

        本文引用地址:http://www.104case.com/article/201611/318004.htm

          start_kernel位于init/main.c,主要完成linux一些子系統的初始化。

           1)smp_setup_processor_id() 單CPU位為空。

           2)lock_kernel() 鎖CPU,linux是支持搶占的,多CPU時調用這個函數防止其他CPU搶占。
            3)tick_init() 時間相關初始化
            4)boot_cpu_init() 確定有多少個CPU可用。現在以單CPU講述。
            5)page_address_init() 初始化高端內存。linux內核空間為1G,對應最大能支持的物理內存也是1G。為了能夠支持超過1G的內存,使用高端內存(128M)來進行映射處理。

           6)setup_arch(&command_line),位于arch/arm/kernel/setup.c這個函數比較重要。

             isetup_processor初始化CPU體系架構,setup_machine初始化平臺數據結構

         ii init_mm 初始化1號進程的task_struct

        iiiparse_cmdline(cmdline_p, from) 獲取default啟動參數,取得相關的啟動命令信息。

        ivpaging_init(&meminfo, mdesc); 創建正式頁表

        vrequest_standard_resources(&meminfo, mdesc); 申請IO資源

        vi 相關全局變量賦值 init_arch_irq = mdesc->init_irq;
        system_timer = mdesc->timer;
        init_machine = mdesc->init_machine;

          7)mm_init_owner 初始化init的內存,arm體系為空

           8)setup_command_line(command_line)獲取uboot中的bootargs參數,取得相關的啟動命令信息

        9)setup_nr_cpu_ids();setup_per_cpu_areas();smp_prepare_boot_cpu() 多CPU函數

          10)build_all_zonelists()初始化所有內存管理節點列表,以便后面進行內存管理初始化。

          11)page_alloc_init() 物理內存分配初始化。

          12)parse_early_param() 獲取命令行early最早執行部分的參數。

          13)vfs_caches_init_early() vfs cache子系統初始化

          14)mm_init() 內存管理初始化

         15)sched_init() 調度管理初始化

         16)rcu_init()初始化直接讀拷貝更新的鎖機制

          17)init_IRQ 中斷初始化

          18)timer初始化,高精度time初始化

          19)軟中斷初始化

        20)local_irq_enable 開中斷

        21)console_init 初始化控制臺,初始化之后以后prink就可以輸出了,之前是輸出到緩沖里面。

        22)頁表cache初始化

        23)thread cache初始化

        24)IPC初始化

        25)異步信號初始化

        26)還有一些其他多CPU相關的初始化。

        27)rest_init 創建1號進程。

        二、rest_init

        1) kernel_thread(kernel_init, NULL, CLONE_FS CLONE_SIGHAND); 創建1號進程init

        2)創建kthreadd線程,它是內核線程之父,管理調度其它的內核線程,內核線程列表由kthread_create_list全局鏈表管理。

        3) 創建idle線程消耗空CPU時間。

        接下來,就是第三部分的kernel_init運行,即1號進程。



        關鍵詞: ARMLinux啟

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 新密市| 凤城市| 都江堰市| 安平县| 瑞昌市| 呼图壁县| 建湖县| 荥经县| 陈巴尔虎旗| 清徐县| 汤原县| 左贡县| 威海市| 甘孜县| 色达县| 鲜城| 仁化县| 靖边县| 得荣县| 方城县| 湘潭县| 中牟县| 南靖县| 定襄县| 万荣县| 鄂伦春自治旗| 开封县| 西丰县| 江华| 贵阳市| 阳高县| 化州市| 陵川县| 钟祥市| 崇信县| 建昌县| 文登市| 项城市| 甘孜| 嘉峪关市| 杭锦旗|