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
總結
以上是生活随笔為你收集整理的linux高通平台代码,高通linux系统初始化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 磁盘管理3板斧,Linux
- 下一篇: cgo linux arm,Golang