linux内核移植详解1——板级初始化过程

2020-04-21 要闻 阅读

  ?转载于 chinaunix@技巧点亮人生,胜利通向出色!

  1.之前谈到我们要为我们的处理器设置一个它独有的机械号,在arch/arm/tools/mach-types中,我写了这么一句话:

  # machine_is_xxx CONFIG_xxxx MACH_TYPE_xxx number

  sep4020? ARCH_4020 GFD4020?194

  我们说bootloader必然要把机械号传给内核,如许内核才华找到响应的处理器,这里uboot传的机械号就是(number)194,然则内核又是若何依据这个194找到我们的处理器,找到我们的板级装备。

  ?

  2.下面那段定义看似必然意义都没有,然则实践是有的,经过我们的gen-mach-types会在include/asm-arm/mach-types.h中主动生成这么一段话:

  #define MACH_TYPE_GFD4020? 194

  ?

  #ifdef CONFIG_ARCH_4020

  # ifdef machine_arch_type

  #? undef machine_arch_type

  #? define machine_arch_type?__machine_arch_type

  # else

  #? define machine_arch_type?MACH_TYPE_GFD4020

  # endif

  # define machine_is_sep4020()?(machine_arch_type==MACH_TYPE_GFD4020)

  #else

  # define machine_is_sep4020()?(0)

  #endif

  ?

  3.在我们的arch/arm/4020.c中有一个函数,这个函数包罗了我们板级初始化的一切初始化步调。

  MACHINE_START(GFD4020, "4020 board")

  ?.phys_io?=0x10000000,

  ?.io_pg_offst?=((0xe0000000) >> 18) & 0xfffc,

  ?.boot_params?=0x30000100,

  ?.fixup=fixup_gfd4020,

  ?.map_io=sep4020_map_io,

  ?.init_irq?=? sep4020_init_irq,

  ?.init_machine?=sep4020_init,

  ?.timer=&sep4020_timer,

  MACHINE_END

  跟出来发明其实这一步实际上是定义了一个结构体,

  struct machine_desc __mach_desc_##_type

  {

  ?.nr=MACH_TYPE_GFD4020,//可见就是194

  ?.name="4020 board",

  ?//主要的板级初始化函数

  ?.map_io? ?=sep4020_map_io,

  ?.init_irq?=sep4020_init_irq,

  ?.init_machine?=sep4020_init,

  ?.timer? ?=&sep4020_timer,

  }

  ?

  4.linux起来以后会进入start_kernel大年夜函数,在这个启动的大年夜函数中的最前面几步会到一个setup_arch的子函数,我们的板级初始化过程就是经过这个函数完成的。

  setup_arch->setup_machine->lookup_machine_type(nr);

  mdesc=setup_machine(machine_arch_type);这个参数就是经过uboot传过去的机械号194;然后经过lookup_machine_type函数掉掉落之条件到的machine_desc结构体;

  掉掉落了这个板级结构体以后,就把这个板级结构体中的我们cpu的信息赋给系统通用的全局变量,以下:

标签: