<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > arm linux 啟動之二:start_kernel到創(chuàng)建1號進(jìn)程

          arm linux 啟動之二:start_kernel到創(chuàng)建1號進(jìn)程

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

          一、start_kernel

          本文引用地址:http://www.ex-cimer.com/article/201611/318004.htm

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

             1)smp_setup_processor_id() 單CPU位為空。

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

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

               isetup_processor初始化CPU體系架構(gòu),setup_machine初始化平臺數(shù)據(jù)結(jié)構(gòu)

           ii init_mm 初始化1號進(jìn)程的task_struct

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

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

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

          vi 相關(guān)全局變量賦值 init_arch_irq = mdesc->init_irq;
          system_timer = mdesc->timer;
          init_machine = mdesc->init_machine;

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

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

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

            10)build_all_zonelists()初始化所有內(nèi)存管理節(jié)點(diǎn)列表,以便后面進(jìn)行內(nèi)存管理初始化。

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

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

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

            14)mm_init() 內(nèi)存管理初始化

           15)sched_init() 調(diào)度管理初始化

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

            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相關(guān)的初始化。

          27)rest_init 創(chuàng)建1號進(jìn)程。

          二、rest_init

          1) kernel_thread(kernel_init, NULL, CLONE_FS CLONE_SIGHAND); 創(chuàng)建1號進(jìn)程init

          2)創(chuàng)建kthreadd線程,它是內(nèi)核線程之父,管理調(diào)度其它的內(nèi)核線程,內(nèi)核線程列表由kthread_create_list全局鏈表管理。

          3) 創(chuàng)建idle線程消耗空CPU時間。

          接下來,就是第三部分的kernel_init運(yùn)行,即1號進(jìn)程。



          關(guān)鍵詞: ARMLinux啟

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();