<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      【linux】具體芯片MACHINE_START處理

      歡迎轉(zhuǎn)載,轉(zhuǎn)載時(shí)需保留作者信息,謝謝。

      郵箱:tangzhongp@163.com

      博客園地址:http://www.rzrgm.cn/embedded-tzp

      Csdn博客地址:http://blog.csdn.net/xiayulewa

       

      MACHINE_START定義了一個(gè)具體機(jī)器。Linux已經(jīng)定義好了調(diào)用接口,只需要實(shí)現(xiàn)MACHINE_START中的成員即可。

       

      Mach-mini2440.c (src\arch\arm\mach-s3c24xx)  中定義:

       

      MACHINE_START(MINI2440, "MINI2440")

          /* Maintainer: Michel Pollet <buserror@gmail.com> */

          .atag_offset    = 0x100,

          .map_io     = mini2440_map_io,

          .init_machine   = mini2440_init,

          .init_irq   = s3c2440_init_irq,

          .init_time  = samsung_timer_init,

          .restart    = s3c244x_restart,

      MACHINE_END

       

      #define MACHINE_START(_type,_name)          \

      static const struct machine_desc __mach_desc_##_type    \

       __used                         \

       __attribute__((__section__(".arch.info.init"))) = {    \

          .nr     = MACH_TYPE_##_type,        \

          .name       = _name,

       

      #define MACHINE_END             \

      };

      可見編譯后放置在段.arch.info.init中。

       

      struct machine_desc成員的處理流程

       

      ?  init_machine

      start_kernel→rest_init→kernel_init→kernel_init_freeable→do_basic_setup→do_initcalls

       

      static initcall_t *initcall_levels[] __initdata = {

          __initcall0_start,  /* src\arch\arm\kernel\vmlinux.lds中定義__initcall0_start = .; *(.initcall0.init) *(.initcall0s.init) */

          __initcall1_start, /* src\arch\arm\kernel\vmlinux.lds中定義*/

          __initcall2_start, /* 同上*/

          __initcall3_start, /* 同上*/

          __initcall4_start, /* 同上*/

          __initcall5_start, /* 同上*/

          __initcall6_start, /* 同上*/

          __initcall7_start, /* 同上*/

          __initcall_end, /* 同上*/

      };

       

      static void __init do_initcalls(void)

      {

          int level;

       

          for (level = 0; level < ARRAY_SIZE(initcall_levels) - 1; level++)

              do_initcall_level(level);

      }

       

      因此do_initcalls函數(shù)會(huì)執(zhí)行所有的src\arch\arm\kernel\vmlinux.lds中定義__initcall0_start_initcall_end之間的段。

       

      Setup.c (src\arch\arm\kernel)中有:

       

      static int __init customize_machine(void)

      {

          /*

           * customizes platform devices, or adds new ones

           * On DT based machines, we fall back to populating the

           * machine from the device tree, if no callback is provided,

           * otherwise we would always need an init_machine callback.

           */

          if (machine_desc->init_machine)

              machine_desc->init_machine();

      #ifdef CONFIG_OF

          else

              of_platform_populate(NULL, of_default_bus_match_table,

                          NULL, NULL);

      #endif

          return 0;

      }

      arch_initcall(customize_machine);

       

      Init.h (src\include\linux)中有:

      #define arch_initcall(fn)       __define_initcall(fn, 3)

       

      #define __define_initcall(fn, id) \

          static initcall_t __initcall_##fn##id __used \

      __attribute__((__section__(".initcall" #id ".init"))) = fn

       

      最后得到函數(shù)customize_machine被分配到了__initcall0_start_initcall_end之間的段.initcall3.init.

       

      總結(jié):整個(gè)流程為: start_kernel→rest_init→kernel_init→kernel_init_freeable→do_basic_setup→do_initcalls

      customize_machinemachine_desc->init_machine()MACHINE_START宏定義的.init_machine   = mini2440_init

       

      ?  map_io

      setup_arch→paging_init→devicemaps_init→ mdesc->map_io();MACHINE_START宏定義的.map_io     = mini2440_map_io

       

      ?  init_irq

       

      start_kernel→init_IRQ→init_irqmachine_desc->init_irq()

      MACHINE_START宏定義的.init_irq   = s3c2440_init_irq

       

      ?  init_time:

      start_kernel→time_init→machine_desc->init_time()

      MACHINE_START宏定義的.init_time  = samsung_timer_init

       

      posted on 2015-04-23 11:50  embedded_linux  閱讀(1120)  評(píng)論(0)    收藏  舉報(bào)

      主站蜘蛛池模板: 九九视频热最新在线视频| 亚洲一区二区三区在线播放无码 | 国产成人午夜福利在线观看| 国产精品国产高清国产专区| 污网站在线观看视频| 色综合久久久久综合体桃花网| 国产精品黄大片在线播放| 亚洲成av人片无码不卡播放器| 房山区| 欧美亚洲综合久久偷偷人人| 亚洲小说乱欧美另类| 欧美巨大巨粗黑人性aaaaaa | 钟祥市| 色二av手机版在线| 精品人妻av区乱码| 欧美激情一区二区三区在线| 亚洲男人av天堂久久资源| 国产成人啪精品午夜网站| 先锋影音av最新资源| 亚洲国内精品一区二区| 欧美精品一区二区在线观看播放| 又污又爽又黄的网站| AV最新高清无码专区| 欧美亚洲国产日韩一区二区| 男女性杂交内射女bbwxz| 岛国最新亚洲伦理成人| av深夜免费在线观看| 国产成人av综合色| 成人午夜在线观看刺激| 久天啪天天久久99久孕妇| 中文字幕有码高清日韩| 国产精品人成视频免费播放| 大胆欧美熟妇xxbbwwbw高潮了| 中文字幕国产精品综合| 精品国产一区二区三区蜜臀 | 国产重口老太和小伙| 久久精品国产蜜臀av| 麻豆久久久9性大片| 丰满少妇呻吟高潮经历| 女性高爱潮视频| 天天躁夜夜躁天干天干2020|