linux高通平台代码,高通linux系统初始化

标签:

很多驱动中出现: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中追踪到:

.init.data : {

*(.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)

. = ALIGN(16); __setup_start = .; *(.init.setup) __setup_end = .;

__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 = .;

__con_initcall_start = .; *(.con_initcall.init) __con_initcall_end = .;

__security_initcall_start = .; *(.security_initcall.init) __security_initcall_end = .;

. = ALIGN(4); __initramfs_start = .; *(.init.ramfs) . = ALIGN(8); *(.init.ramfs.info)

可知initcall分为0-7等级。

内核启动后,下一步就会进入文件系统, 那么如何进入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;

}

标签:

来源: https://blog.csdn.net/sheji105/article/details/82625667

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值