imx6的kernel3.4.15启动流程
生活随笔
收集整理的這篇文章主要介紹了
imx6的kernel3.4.15启动流程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
//最開始的定義為
DT_MACHINE_START(IMX6Q, "Freescale i.MX6 Quad/DualLite (Device Tree)").smp = smp_ops(imx_smp_ops),.map_io = imx6q_map_io,.init_irq = imx6q_init_irq, //中斷的板級初始化.init_machine = imx6q_init_machine, //
.init_late = imx6q_init_late, .dt_compat = imx6q_dt_compat, //比較得到設備樹
MACHINE_END//后面函數都是在start_kernel中
setup_archsetup_machine_fdtDT_MACHINE_START //在這里定義一個machine描述符,編譯的時候會放入.arch.info.init段中
MACHINE_ENDof_flat_dt_match_machine //找到最合適的machine描述符early_init_dt_scan_nodes //找到幾個比較重要的節點early_init_dt_scan_chosen //找到 chosen 節點,并將值放入boot_command_line中early_init_dt_scan_root //掃描根節點,獲取 {size,address}-cells信息,并保存在dt_root_size_cells和dt_root_addr_cells全局變量中early_init_dt_scan_memory //掃描DTB中的 memory node,并把相關信息保存在meminfo中,全局變量meminfo保存了系統內存相關的信息paging_init(mdesc) //
devicemaps_init(mdesc)mdesc->map_io //這里就是調用了DT_MACHINE_START中的imx6q_map_io
unflatten_device_tree //需要將DTB轉換成節點是 device_node 的樹狀結構,也就是把所有節點保存在C代碼中的device_node中
__unflatten_device_treefdt_magic //檢查設備樹magicfdt_totalsize //檢測大小fdt_version //檢測版本fdt_check_header //檢測頭unflatten_dt_node //第一輪的scan,主要目的是為了獲取設備樹的大小dt_alloc //將獲取的大小在內存中申請一段內存(device_node數量的大小)unflatten_dt_node //第二輪scan,將設備樹中所有信息掛在上一步申請內存中(以結構體device_node為鏈表)arm_dt_init_cpu_maps //獲取cpu的節點
init_IRQmachine_desc->init_irq() //這里也就是上面DT_MACHINE_START中的 imx6q_init_irq
imx_gpc_check_dtirqchip_initof_irq_init //遍歷Device Tree,找到interrupt controller,并掛在intc_desc,然后系統開始匹配中斷,一旦匹配上,進行中斷初始化
time_init //時鐘初始化,非常重要,在這里面對各種時鐘倍頻,分頻操作
of_clk_initmatches = &__clk_of_table; //__clk_of_table就是保存clk結構體的內存,拿到后依次運行,我們在文件中定義了CLK_OF_DECLARE(imx6q, "fsl,imx6q-ccm", imx6q_clocks_init);
rest_initkernel_initkernel_init_freeabledo_basic_setupdriver_initof_core_initfor_each_of_allnodes //從根節點輪訓所有節點__of_attach_node_sysfs //sys/firmware/devicetree/base目錄下面為設備樹展開成sysfs的目錄和二進制屬性文件,所有的node節點就是一個目錄,所有的property屬性就是一個二進制屬性文件。
do_initcallswhile(0~7) //會依次初始化0~7,其中3是架構,6是設備do_initcall_level(3) //在代碼中有arch_initcall(customize_machine)
customize_machinemachine_desc->init_machine() //這里就是DT_MACHINE_START定義的imx6q_init_machine of_platform_populate(NULL, of_default_bus_match_table, NULL, parent); //加載platform設備for_each_child_of_node //輪訓根節點of_platform_bus_create //創建platform總線, 這里會把i2c adapter之類的設備進行了初始化
imx6q_enet_initimx_anatop_initimx6q_csi_mux_initimx6q_pm_init //電源管理初始化
imx6q_axi_initdo_initcall_level(6) //在代碼中的device_initcall/module_init/device_initcall都是這個等級的,為設備驅動do_initcall_level(7) //最低優先級的,late_initcall為這個等級,其中有late_initcall(init_machine_late)
init_machine_latemachine_desc->init_late() //這里就是DT_MACHINE_START定義的 init_latetry_to_run_init_process("/sbin/init")//嘗試運行sbin/inittry_to_run_init_process("/etc/init")try_to_run_init_process("/bin/init") try_to_run_init_process("/bin/sh")kthreadd從上面流程可以看出chosen、memory、cpus節點未掛在device_node上
?
轉載于:https://www.cnblogs.com/maogefff/p/9502545.html
總結
以上是生活随笔為你收集整理的imx6的kernel3.4.15启动流程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: B4010 菜肴制作 拓扑排序(附随机跳
- 下一篇: jquery中siblings方法配合什