高通linux-系统初始化

版权声明:本文为博主原创文章,未经博主允许不得转载。转载请标注出处: https://blog.csdn.net/sheji105/article/details/82625667

1. init.h

很多驱动中出现:arch_initcall,subsys_initcall

比如: drivers/i2c/busses/i2c-msm-v2.c 中为subsys_initcall

查看代码可追踪到include/linux/init.h, 都是一些宏定义。

init.h 会根据条件语句选择宏定义, 本平台代码摘录如下:

#define pure_initcall(fn)          __define_initcall(fn, 0)

 

#define core_initcall(fn)          __define_initcall(fn, 1)

#define core_initcall_sync(fn)        __define_initcall(fn, 1s)

#define postcore_initcall(fn)          __define_initcall(fn, 2)

#define postcore_initcall_sync(fn)  __define_initcall(fn, 2s)

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

#define arch_initcall_sync(fn)        __define_initcall(fn, 3s)

#define subsys_initcall(fn)       __define_initcall(fn, 4)

#define subsys_initcall_sync(fn)     __define_initcall(fn, 4s)

#define fs_initcall(fn)              __define_initcall(fn, 5)

#define fs_initcall_sync(fn)           __define_initcall(fn, 5s)

#define rootfs_initcall(fn)        __define_initcall(fn, rootfs)

#define device_initcall(fn)       __define_initcall(fn, 6)

#define device_initcall_sync(fn)     __define_initcall(fn, 6s)

#define late_initcall(fn)           __define_initcall(fn, 7)

#define late_initcall_sync(fn)         __define_initcall(fn, 7s)

 

#define __initcall(fn) device_initcall(fn)

 

__define_initcall ----> arch/arm/kernel/vmlinux.lds

vmlinux.lds中追踪到:

  1. .init.data : {
  2.   *(.init.data) *(.meminit.data) *(.init.rodata) . = ALIGN(8); __start_ftrace_events = .; *(_ftrace_events) __stop_ftrace_events = .; . = ALIGN(8); __start_kprobe_blacklist = .; *(_kprobe_blacklist) __stop_kprobe_blacklist = .; *(.meminit.rodata) . = ALIGN(8); __reservedmem_of_table = .; *(__reservedmem_of_table) *(__reservedmem_of_table_end) . = ALIGN(8); __clksrc_of_table = .; *(__clksrc_of_table) *(__clksrc_of_table_end) . = ALIGN(8); __iommu_of_table = .; *(__iommu_of_table) *(__iommu_of_table_end) . = ALIGN(8); __cpu_method_of_table = .; *(__cpu_method_of_table) *(__cpu_method_of_table_end) . = ALIGN(32); __dtb_start = .; *(.dtb.init.rodata) __dtb_end = .; . = ALIGN(8); __irqchip_of_table = .; *(__irqchip_of_table) *(__irqchip_of_table_end) . = ALIGN(8); __earlycon_of_table = .; *(__earlycon_of_table) *(__earlycon_of_table_end)
  3.   . = ALIGN(16); __setup_start = .; *(.init.setup) __setup_end = .;
  4.   __initcall_start = .; *(.initcallearly.init) __initcall0_start = .; *(.initcall0.init) *(.initcall0s.init) __initcall1_start = .; *(.initcall1.init) *(.initcall1s.init) __initcall2_start = .; *(.initcall2.init) *(.initcall2s.init) __initcall3_start = .; *(.initcall3.init) *(.initcall3s.init) __initcall4_start = .; *(.initcall4.init) *(.initcall4s.init) __initcall5_start = .; *(.initcall5.init) *(.initcall5s.init) __initcallrootfs_start = .; *(.initcallrootfs.init) *(.initcallrootfss.init) __initcall6_start = .; *(.initcall6.init) *(.initcall6s.init) __initcall7_start = .; *(.initcall7.init) *(.initcall7s.init) __initcall_end = .;
  5.   __con_initcall_start = .; *(.con_initcall.init) __con_initcall_end = .;
  6.   __security_initcall_start = .; *(.security_initcall.init) __security_initcall_end = .;
  7.   . = ALIGN(4); __initramfs_start = .; *(.init.ramfs) . = ALIGN(8); *(.init.ramfs.info)
  8.  

可知initcall分为0-7等级。

 

 

2. mount 文件系统

内核启动后,下一步就会进入文件系统, 那么如何进入root,代码是如何实现的的呢?

查看include/linux/init.h, 找到init_rootfs 。

init/do_mounts.c

 

int __init init_rootfs(void)

{

   int err = register_filesystem(&rootfs_fs_type);

 

   if (err)

      return err;

 

   if (IS_ENABLED(CONFIG_TMPFS) && !saved_root_name[0] &&

      (!root_fs_names || strstr(root_fs_names, "tmpfs"))) {

      err = shmem_init();

      is_tmpfs = true;

   } else {

      err = init_ramfs_fs();

   }

 

   if (err)

      unregister_filesystem(&rootfs_fs_type);

 

   return err;

}

 

猜你喜欢

转载自blog.csdn.net/sheji105/article/details/82625667