我们知道,不管在什么样的平台上启动linux,它的开始都是以start_kernel()进行系统的初始化,当然网络协议栈的初始化也是在这个过程中完成,下面从start_kernel()开始跟踪:
start_kernel() --> rest_kernel() --> kernel_thread(kernel_init, NULL, CLONE_FS) --> kernel_init_freeable() --> do_basic_setup() --> do_initcalls():
static void __init do_initcalls(void)
{
int level;
for (level = 0; level < ARRAY_SIZE(initcall_levels) - 1; level++)
do_initcall_level(level);
}
static void __init do_initcall_level(int level)
{
initcall_t *fn;
strcpy(initcall_command_line, saved_command_line);
parse_args(initcall_level_names[level],
initcall_command_line, __start___param,
__stop___param - __start___param,
level, level,
NULL, &repair_env_string);
for (fn = initcall_levels[level]; fn < initcall_levels[level+1]; fn++)
do_one_initcall(*fn);
}
宏定义__define_initcall(level,fn)指示编译器在编译的时候,将一系列初始化函数的起始地址值按照一定的顺序放在一个section中。在内核初始化阶段,do_initcalls() 将按顺序从该section中以函数指针的形式取出这些函数的起始地址,来依次完成相应的初始化。由于内核某些部分的初始化需要依赖于其他某些部分的初始化的完成,因此这个顺序排列常常非常重要。下面我们来打印一下vmlinux中这些section的排列顺序:
# object -t vmlinux | grep __initcall |sort
c08c9294 g .init.data 00000000 __initcall_start
c08c9294 l O .init.data 00000004 __initcall_cpu_suspend_alloc_spearly
c08c9298 l O .init.data 00000004 __initcall_init_static_idmapearly
c08c929c l O .init.data 00000004 __initcall_spawn_ksoftirqdearly
c08c92a0 l O .init.data 00000004 __initcall_init_workqueuesearly
c08c92a4 l O .init.data 00000004 __initcall_migration_initearly
c08c92a8 l O .init.data 00000004 __initcall_check_cpu_stall_initearly
c08c92ac l O .init.data 00000004 __initcall_rcu_scheduler_really_startedearly
c08c92b0 l O .init.data 00000004 __initcall_rcu_spawn_gp_kthreadearly
c08c92b4 l O .init.data 00000004 __initcall_cpu_stop_initearly
c08c92b8 l O .init.data 00000004 __initcall_hashlib_initearly
c08c92bc l O .init.data 00000004 __initcall_dynamic_debug_initearly
c08c92c0 l O .init.data 00000004 __initcall_rand_initializeearly
c08c92c4 g .init.data 00000000 __initcall0_start
c08c92c4 l O .init.data 00000004 __initcall_ipc_ns_init0
c08c92c8 l O .init.data 00000004 __initcall_init_mmap_min_addr0
c08c92cc l O .init.data 00000004 __initcall_init_cpufreq_transition_notifier_list0
c08c92d0 l O .init.data 00000004 __initcall_net_ns_init0
c08c92d4 g .init.data 00000000 __initcall1_start
c08c92d4 l O .init.data 00000004 __initcall_vfp_init1
c08c92d8 l O .init.data 00000004 __initcall_ptrace_break_init1
c08c92dc l O .init.data 00000004 __initcall_register_cpufreq_notifier1
c08c92e0 l O .init.data 00000004 __initcall_v6_userpage_init1
c08c92e4 l O .init.data 00000004 __initcall_qcom_atomic_pool_size_set1
c08c92e8 l O .init.data 00000004 __initcall_cpu_hotplug_pm_sync_init1
c08c92ec l O .init.data 00000004 __initcall_alloc_frozen_cpus1
c08c92f0 l O .init.data 00000004 __initcall_wq_sysfs_init1
c08c92f4 l O .init.data 00000004 __initcall_ksysfs_init1
c08c92f8 l O .init.data 00000004 __initcall_pm_init1
c08c92fc l O .init.data 00000004 __initcall_init_jiffies_clocksource1
c08c9300 l O .init.data 00000004 __initcall_cpu_pm_init1
c08c9304 l O .init.data 00000004 __initcall_init_zero_pfn1
c08c9308 l O .init.data 00000004 __initcall_fsnotify_init1
c08c930c l O .init.data 00000004 __initcall_filelock_init1
c08c9310 l O .init.data 00000004 __initcall_init_script_binfmt1
c08c9314 l O .init.data 00000004 __initcall_init_elf_binfmt1
c08c9318 l O .init.data 00000004 __initcall_debugfs_init1
c08c931c l O .init.data 00000004 __initcall_prandom_init1
c08c9320 l O .init.data 00000004 __initcall_pinctrl_init1
c08c9324 l O .init.data 00000004 __initcall_regulator_init1
c08c9328 l O .init.data 00000004 __initcall_cpufreq_core_init1
c08c932c l O .init.data 00000004 __initcall_cpuidle_init1
c08c9330 l O .init.data 00000004 __initcall_rpm_clk_init1
c08c9334 l O .init.data 00000004 __initcall_gcc_apq8084_init1
c08c9338 l O .init.data 00000004 __initcall_gcc_ipq806x_init1
c08c933c l O .init.data 00000004 __initcall_gcc_msm8660_init1
c08c9340 l O .init.data 00000004 __initcall_gcc_msm8960_init1
c08c9344 l O .init.data 00000004 __initcall_gcc_msm8974_init1
c08c9348 l O .init.data 00000004 __initcall_gcc_ipq40xx_init1
c08c934c l O .init.data 00000004 __initcall_adcc_ipq40xx_init1
c08c9350 l O .init.data 00000004 __initcall_gcc_dummy_init1
c08c9354 l O .init.data 00000004 __initcall_sock_init1
c08c9358 l O .init.data 00000004 __initcall_netlink_proto_init1
c08c935c g .init.data 00000000 __initcall2_start
c08c935c l O .init.data 00000004 __initcall_atomic_pool_init2
c08c9360 l O .init.data 00000004 __initcall_bdi_class_init2
c08c9364 l O .init.data 00000004 __initcall_mm_sysfs_init2
c08c9368 l O .init.data 00000004 __initcall_kobject_uevent_init2
c08c936c l O .init.data 00000004 __initcall_gpiolib_sysfs_init2
c08c9370 l O .init.data 00000004 __initcall_pcibus_class_init2
c08c9374 l O .init.data 00000004 __initcall_pci_driver_init2
c08c9378 l O .init.data 00000004 __initcall_backlight_class_init2
c08c937c l O .init.data 00000004 __initcall_amba_init2
c08c9380 l O .init.data 00000004 __initcall_tty_class_init2
c08c9384 l O .init.data 00000004 __initcall_wakeup_sources_debugfs_init2
c08c9388 l O .init.data 00000004 __initcall_regmap_initcall2
c08c938c l O .init.data 00000004 __initcall_syscon_init2
c08c9390 l O .init.data 00000004 __initcall_spi_init2
c08c9394 l O .init.data 00000004 __initcall_spmi_init2
c08c9398 l O .init.data 00000004 __initcall_i2c_init2
c08c939c l O .init.data 00000004 __initcall_init_ladder2
c08c93a0 l O .init.data 00000004 __initcall_init_menu2
c08c93a4 l O .init.data 00000004 __initcall_msm_bus_init2
c08c93a8 g .init.data 00000000 __initcall3_start
c08c93a8 l O .init.data 00000004 __initcall_gate_vma_init3
c08c93ac l O .init.data 00000004 __initcall_customize_machine3
c08c93b0 l O .init.data 00000004 __initcall_arch_hw_breakpoint_init3
c08c93b4 l O .init.data 00000004 __initcall_exceptions_init3
c08c93b8 l O .init.data 00000004 __initcall_qfprom_init3
c08c93bc l O .init.data 00000004 __initcall_apq8064_pinctrl_init3
c08c93c0 l O .init.data 00000004 __initcall_apq8084_pinctrl_init3
c08c93c4 l O .init.data 00000004 __initcall_ipq8064_pinctrl_init3
c08c93c8 l O .init.data 00000004 __initcall_msm8960_pinctrl_init3
c08c93cc l O .init.data 00000004 __initcall_msm8x74_pinctrl_init3
c08c93d0 l O .init.data 00000004 __initcall_ipq40xx_pinctrl_init3
c08c93d4 l O .init.data 00000004 __initcall_dma_bus_init3
c08c93d8 l O .init.data 00000004 __initcall_dma_channel_table_init3
c08c93dc l O .init.data 00000004 __initcall_msm_init_datamover3
c08c93e0 l O .init.data 00000004 __initcall_qcom_rpm_init3
c08c93e4 l O .init.data 00000004 __initcall_i2c_msm_init3
c08c93e8 l O .init.data 00000004 __initcall_sps_init3
c08c93ec g .init.data 00000000 __initcall4_start
c08c93ec l O .init.data 00000004 __initcall_topology_init4
c08c93f0 l O .init.data 00000004 __initcall_param_sysfs_init4
c08c93f4 l O .init.data 00000004 __initcall_pm_sysrq_init4
c08c93f8 l O .init.data 00000004 __initcall_default_bdi_init4
c08c93fc l O .init.data 00000004 __initcall_init_reserve_notifier4
c08c9400 l O .init.data 00000004 __initcall_init_admin_reserve4
c08c9404 l O .init.data 00000004 __initcall_init_user_reserve4
c08c9408 l O .init.data 00000004 __initcall_init_bio4
c08c940c l O .init.data 00000004 __initcall_crypto_wq_init4
c08c9410 l O .init.data 00000004 __initcall_cryptomgr_init4
c08c9414 l O .init.data 00000004 __initcall_blk_settings_init4
c08c9418 l O .init.data 00000004 __initcall_blk_ioc_init4
c08c941c l O .init.data 00000004 __initcall_blk_softirq_init4
c08c9420 l O .init.data 00000004 __initcall_blk_iopoll_setup4
c08c9424 l O .init.data 00000004 __initcall_blk_mq_init4
c08c9428 l O .init.data 00000004 __initcall_genhd_device_init4
c08c942c l O .init.data 00000004 __initcall_gpiolib_debugfs_init4
c08c9430 l O .init.data 00000004 __initcall_pwm_debugfs_init4
c08c9434 l O .init.data 00000004 __initcall_pwm_sysfs_init4
c08c9438 l O .init.data 00000004 __initcall_pci_slot_init4
c08c943c l O .init.data 00000004 __initcall_qcom_pcie_init4
c08c9440 l O .init.data 00000004 __initcall_fbmem_init4
c08c9444 l O .init.data 00000004 __initcall_regulator_fixed_voltage_init4
c08c9448 l O .init.data 00000004 __initcall_gpio_regulator_init4
c08c944c l O .init.data 00000004 __initcall_rpm_reg_init4
c08c9450 l O .init.data 00000004 __initcall_ipq40xx_regulator_init4
c08c9454 l O .init.data 00000004 __initcall_misc_init4
c08c9458 l O .init.data 00000004 __initcall_init_scsi4
c08c945c l O .init.data 00000004 __initcall_ata_init4
c08c9460 l O .init.data 00000004 __initcall_mtdsplit_squashfs_init4
c08c9464 l O .init.data 00000004 __initcall_phy_init4
c08c9468 l O .init.data 00000004 __initcall_rtc_init4
c08c946c l O .init.data 00000004 __initcall_power_supply_class_init4
c08c9470 l O .init.data 00000004 __initcall_hwmon_init4
c08c9474 l O .init.data 00000004 __initcall_watchdog_init4
c08c9478 l O .init.data 00000004 __initcall_leds_init4
c08c947c l O .init.data 00000004 __initcall_msm_bus_device_init_driver4
c08c9480 l O .init.data 00000004 __initcall_init_soundcore4
c08c9484 l O .init.data 00000004 __initcall_alsa_sound_init4
c08c9488 l O .init.data 00000004 __initcall_proto_init4
c08c948c l O .init.data 00000004 __initcall_net_dev_init4
c08c9490 l O .init.data 00000004 __initcall_neigh_init4
c08c9494 l O .init.data 00000004 __initcall_fib_rules_init4
c08c9498 l O .init.data 00000004 __initcall_pktsched_init4
c08c949c l O .init.data 00000004 __initcall_tc_filter_init4
c08c94a0 l O .init.data 00000004 __initcall_tc_action_init4
c08c94a4 l O .init.data 00000004 __initcall_genl_init4
c08c94a8 l O .init.data 00000004 __initcall_wireless_nlevent_init4
c08c94ac l O .init.data 00000004 __initcall_pcie_init4s
c08c94b0 g .init.data 00000000 __initcall5_start
c08c94b0 l O .init.data 00000004 __initcall_proc_cpu_init5
c08c94b4 l O .init.data 00000004 __initcall_dma_debug_do_init5
c08c94b8 l O .init.data 00000004 __initcall_alignment_init5
c08c94bc l O .init.data 00000004 __initcall_clocksource_done_booting5
c08c94c0 l O .init.data 00000004 __initcall_init_pipe_fs5
c08c94c4 l O .init.data 00000004 __initcall_eventpoll_init5
c08c94c8 l O .init.data 00000004 __initcall_anon_inode_init5
c08c94cc l O .init.data 00000004 __initcall_proc_cmdline_init5
c08c94d0 l O .init.data 00000004 __initcall_proc_consoles_init5
c08c94d4 l O .init.data 00000004 __initcall_proc_cpuinfo_init5
c08c94d8 l O .init.data 00000004 __initcall_proc_devices_init5
c08c94dc l O .init.data 00000004 __initcall_proc_interrupts_init5
c08c94e0 l O .init.data 00000004 __initcall_proc_loadavg_init5
c08c94e4 l O .init.data 00000004 __initcall_proc_meminfo_init5
c08c94e8 l O .init.data 00000004 __initcall_proc_stat_init5
c08c94ec l O .init.data 00000004 __initcall_proc_uptime_init5
c08c94f0 l O .init.data 00000004 __initcall_proc_version_init5
c08c94f4 l O .init.data 00000004 __initcall_proc_softirqs_init5
c08c94f8 l O .init.data 00000004 __initcall_proc_kmsg_init5
c08c94fc l O .init.data 00000004 __initcall_init_ramfs_fs5
c08c9500 l O .init.data 00000004 __initcall_blk_scsi_ioctl_init5
c08c9504 l O .init.data 00000004 __initcall_dynamic_debug_init_debugfs5
c08c9508 l O .init.data 00000004 __initcall_chr_dev_init5
c08c950c l O .init.data 00000004 __initcall_firmware_class_init5
c08c9510 l O .init.data 00000004 __initcall_thermal_init5
c08c9514 l O .init.data 00000004 __initcall_cpufreq_gov_performance_init5
c08c9518 l O .init.data 00000004 __initcall_sysctl_core_init5
c08c951c l O .init.data 00000004 __initcall_inet_init5
c08c9520 l O .init.data 00000004 __initcall_ipv4_offload_init5
c08c9524 l O .init.data 00000004 __initcall_af_unix_init5
c08c9528 l O .init.data 00000004 __initcall_ipv6_offload_init5
c08c952c l O .init.data 00000004 __initcall_pci_apply_final_quirks5s
c08c9530 g .init.data 00000000 __initcallrootfs_start
c08c9530 l O .init.data 00000004 __initcall_populate_rootfsrootfs
c08c9534 g .init.data 00000000 __initcall6_start
c08c9534 l O .init.data 00000004 __initcall_register_pmu_driver6
c08c9538 l O .init.data 00000004 __initcall_msm_rpm_log_driver_init6
c08c953c l O .init.data 00000004 __initcall_proc_execdomains_init6
c08c9540 l O .init.data 00000004 __initcall_ioresources_init6
c08c9544 l O .init.data 00000004 __initcall_uid_cache_init6
c08c9548 l O .init.data 00000004 __initcall_init_posix_timers6
c08c954c l O .init.data 00000004 __initcall_init_posix_cpu_timers6
c08c9550 l O .init.data 00000004 __initcall_irq_pm_init_ops6
c08c9554 l O .init.data 00000004 __initcall_timekeeping_init_ops6
c08c9558 l O .init.data 00000004 __initcall_init_clocksource_sysfs6
c08c955c l O .init.data 00000004 __initcall_init_timer_list_procfs6
c08c9560 l O .init.data 00000004 __initcall_alarmtimer_init6
c08c9564 l O .init.data 00000004 __initcall_clockevents_init_sysfs6
c08c9568 l O .init.data 00000004 __initcall_sched_clock_syscore_init6
c08c956c l O .init.data 00000004 __initcall_futex_init6
c08c9570 l O .init.data 00000004 __initcall_proc_modules_init6
c08c9574 l O .init.data 00000004 __initcall_kallsyms_init6
c08c9578 l O .init.data 00000004 __initcall_ikconfig_init6
c08c957c l O .init.data 00000004 __initcall_utsname_sysctl_init6
c08c9580 l O .init.data 00000004 __initcall_irq_work_init_cpu_notifier6
c08c9584 l O .init.data 00000004 __initcall_perf_event_sysfs_init6
c08c9588 l O .init.data 00000004 __initcall_init_per_zone_wmark_min6
c08c958c l O .init.data 00000004 __initcall_kswapd_init6
c08c9590 l O .init.data 00000004 __initcall_setup_vmstat6
c08c9594 l O .init.data 00000004 __initcall_mm_compute_batch_init6
c08c9598 l O .init.data 00000004 __initcall_proc_vmalloc_init6
c08c959c l O .init.data 00000004 __initcall_memblock_init_debugfs6
c08c95a0 l O .init.data 00000004 __initcall_init_emergency_pool6
c08c95a4 l O .init.data 00000004 __initcall_slab_sysfs_init6
c08c95a8 l O .init.data 00000004 __initcall_init_cleancache6
c08c95ac l O .init.data 00000004 __initcall_fcntl_init6
c08c95b0 l O .init.data 00000004 __initcall_proc_filesystems_init6
c08c95b4 l O .init.data 00000004 __initcall_dio_init6
c08c95b8 l O .init.data 00000004 __initcall_fsnotify_mark_init6
c08c95bc l O .init.data 00000004 __initcall_inotify_user_setup6
c08c95c0 l O .init.data 00000004 __initcall_proc_locks_init6
c08c95c4 l O .init.data 00000004 __initcall_init_mbcache6
c08c95c8 l O .init.data 00000004 __initcall_init_devpts_fs6
c08c95cc l O .init.data 00000004 __initcall_ext4_init_fs6
c08c95d0 l O .init.data 00000004 __initcall_journal_init6
c08c95d4 l O .init.data 00000004 __initcall_init_squashfs_fs6
c08c95d8 l O .init.data 00000004 __initcall_init_hfsplus_fs6
c08c95dc l O .init.data 00000004 __initcall_init_hfs_fs6
c08c95e0 l O .init.data 00000004 __initcall_init_nls_utf86
c08c95e4 l O .init.data 00000004 __initcall_init_jffs2_fs6
c08c95e8 l O .init.data 00000004 __initcall_ovl_init6
c08c95ec l O .init.data 00000004 __initcall_init_xfs_fs6
c08c95f0 l O .init.data 00000004 __initcall_ipc_init6
c08c95f4 l O .init.data 00000004 __initcall_ipc_sysctl_init6
c08c95f8 l O .init.data 00000004 __initcall_key_proc_init6
c08c95fc l O .init.data 00000004 __initcall_crypto_algapi_init6
c08c9600 l O .init.data 00000004 __initcall_chainiv_module_init6
c08c9604 l O .init.data 00000004 __initcall_eseqiv_module_init6
c08c9608 l O .init.data 00000004 __initcall_seqiv_module_init6
c08c960c l O .init.data 00000004 __initcall_crypto_null_mod_init6
c08c9610 l O .init.data 00000004 __initcall_sha256_generic_mod_init6
c08c9614 l O .init.data 00000004 __initcall_crypto_ctr_module_init6
c08c9618 l O .init.data 00000004 __initcall_crypto_gcm_module_init6
c08c961c l O .init.data 00000004 __initcall_crypto_ccm_module_init6
c08c9620 l O .init.data 00000004 __initcall_aes_init6
c08c9624 l O .init.data 00000004 __initcall_arc4_init6
c08c9628 l O .init.data 00000004 __initcall_deflate_mod_init6
c08c962c l O .init.data 00000004 __initcall_crc32c_mod_init6
c08c9630 l O .init.data 00000004 __initcall_lzo_mod_init6
c08c9634 l O .init.data 00000004 __initcall_crypto_xz_mod_init6
c08c9638 l O .init.data 00000004 __initcall_krng_mod_init6
c08c963c l O .init.data 00000004 __initcall_ghash_mod_init6
c08c9640 l O .init.data 00000004 __initcall_asymmetric_key_init6
c08c9644 l O .init.data 00000004 __initcall_x509_key_init6
c08c9648 l O .init.data 00000004 __initcall_proc_genhd_init6
c08c964c l O .init.data 00000004 __initcall_noop_init6
c08c9650 l O .init.data 00000004 __initcall_deadline_init6
c08c9654 l O .init.data 00000004 __initcall_libcrc32c_mod_init6
c08c9658 l O .init.data 00000004 __initcall_percpu_counter_startup6
c08c965c l O .init.data 00000004 __initcall_phy_core_init6
c08c9660 l O .init.data 00000004 __initcall_qcom_apq8064_sata_phy_driver_init6
c08c9664 l O .init.data 00000004 __initcall_qcom_ipq806x_sata_phy_driver_init6
c08c9668 l O .init.data 00000004 __initcall_pcs_driver_init6
c08c966c l O .init.data 00000004 __initcall_ipq4019_pwm_driver_init6
c08c9670 l O .init.data 00000004 __initcall_pci_proc_init6
c08c9674 l O .init.data 00000004 __initcall_genericbl_driver_init6
c08c9678 l O .init.data 00000004 __initcall_mdss_qpic_driver_init6
c08c967c l O .init.data 00000004 __initcall_mdss_fb_init6
c08c9680 l O .init.data 00000004 __initcall_mdss_qpic_panel_init6
c08c9684 l O .init.data 00000004 __initcall_bam_dma_driver_init6
c08c9688 l O .init.data 00000004 __initcall_gsbi_driver_init6
c08c968c l O .init.data 00000004 __initcall_tcsr_driver_init6
c08c9690 l O .init.data 00000004 __initcall_qcom_restart_reason_driver_init6
c08c9694 l O .init.data 00000004 __initcall_scm_restart_reason_driver_init6
c08c9698 l O .init.data 00000004 __initcall_qcom_cache_dump_driver_init6
c08c969c l O .init.data 00000004 __initcall_init_tz_log6
c08c96a0 l O .init.data 00000004 __initcall_pty_init6
c08c96a4 l O .init.data 00000004 __initcall_sysrq_init6
c08c96a8 l O .init.data 00000004 __initcall_serial8250_init6
c08c96ac l O .init.data 00000004 __initcall_msm_serial_hsl_init6
c08c96b0 l O .init.data 00000004 __initcall_msm_serial_hs_init6
c08c96b4 l O .init.data 00000004 __initcall_qca_serial_hs_init6
c08c96b8 l O .init.data 00000004 __initcall_msm_rng_driver_init6
c08c96bc l O .init.data 00000004 __initcall_topology_sysfs_init6
c08c96c0 l O .init.data 00000004 __initcall_at24_init6
c08c96c4 l O .init.data 00000004 __initcall_ahci_pci_driver_init6
c08c96c8 l O .init.data 00000004 __initcall_ipq_ahci_driver_init6
c08c96cc l O .init.data 00000004 __initcall_init_mtd6
c08c96d0 l O .init.data 00000004 __initcall_ofpart_parser_init6
c08c96d4 l O .init.data 00000004 __initcall_cmdline_parser_init6
c08c96d8 l O .init.data 00000004 __initcall_init_mtdblock6
c08c96dc l O .init.data 00000004 __initcall_cfi_probe_init6
c08c96e0 l O .init.data 00000004 __initcall_of_flash_driver_init6
c08c96e4 l O .init.data 00000004 __initcall_msm_nand_driver_init6
c08c96e8 l O .init.data 00000004 __initcall_m25p80_driver_init6
c08c96ec l O .init.data 00000004 __initcall_nand_base_init6
c08c96f0 l O .init.data 00000004 __initcall_msm_nand_driver_init6
c08c96f4 l O .init.data 00000004 __initcall_ubi_gluebi_init6
c08c96f8 l O .init.data 00000004 __initcall_spidev_init6
c08c96fc l O .init.data 00000004 __initcall_msm_spi_driver_init6
c08c9700 l O .init.data 00000004 __initcall_spi_qup_driver_init6
c08c9704 l O .init.data 00000004 __initcall_spmi_pmic_arb_driver_init6
c08c9708 l O .init.data 00000004 __initcall_net_olddevs_init6
c08c970c l O .init.data 00000004 __initcall_swconfig_init6
c08c9710 l O .init.data 00000004 __initcall_mdio_gpio_driver_init6
c08c9714 l O .init.data 00000004 __initcall_ipq40xx_mdio_driver_init6
c08c9718 l O .init.data 00000004 __initcall_i2c_dev_init6
c08c971c l O .init.data 00000004 __initcall_qup_i2c_driver_init6
c08c9720 l O .init.data 00000004 __initcall_pca9575_init6
c08c9724 l O .init.data 00000004 __initcall_tlc59208f_init6
c08c9728 l O .init.data 00000004 __initcall_msm_restart_init6
c08c972c l O .init.data 00000004 __initcall_tsens_tm_driver_init6
c08c9730 l O .init.data 00000004 __initcall_msm_thermal_device_driver_init6
c08c9734 l O .init.data 00000004 __initcall_qcom_watchdog_driver_init6
c08c9738 l O .init.data 00000004 __initcall_cpufreq_stats_init6
c08c973c l O .init.data 00000004 __initcall_cpufreq_gov_powersave_init6
c08c9740 l O .init.data 00000004 __initcall_cpufreq_gov_userspace_init6
c08c9744 l O .init.data 00000004 __initcall_cpufreq_gov_dbs_init6
c08c9748 l O .init.data 00000004 __initcall_cpufreq_gov_dbs_init6
c08c974c l O .init.data 00000004 __initcall_krait_cpufreq_platdrv_init6
c08c9750 l O .init.data 00000004 __initcall_qcom_cpufreq_driver_init6
c08c9754 l O .init.data 00000004 __initcall_qca_ipq40xx_cpufreq_platdrv_init6
c08c9758 l O .init.data 00000004 __initcall_ipq40xx_led_driver_init6
c08c975c l O .init.data 00000004 __initcall_timer_trig_init6
c08c9760 l O .init.data 00000004 __initcall_defon_trig_init6
c08c9764 l O .init.data 00000004 __initcall_netdev_trig_init6
c08c9768 l O .init.data 00000004 __initcall_staging_init6
c08c976c l O .init.data 00000004 __initcall_timed_output_init6
c08c9770 l O .init.data 00000004 __initcall_spinand_driver_init6
c08c9774 l O .init.data 00000004 __initcall_mmcc_apq8084_driver_init6
c08c9778 l O .init.data 00000004 __initcall_nss_ipq806x_init6
c08c977c l O .init.data 00000004 __initcall_mmcc_msm8960_driver_init6
c08c9780 l O .init.data 00000004 __initcall_mmcc_msm8974_driver_init6
c08c9784 l O .init.data 00000004 __initcall_kpss_xcc_driver_init6
c08c9788 l O .init.data 00000004 __initcall_qcom_hfpll_driver_init6
c08c978c l O .init.data 00000004 __initcall_krait_cc_driver_init6
c08c9790 l O .init.data 00000004 __initcall_alsa_timer_init6
c08c9794 l O .init.data 00000004 __initcall_alsa_pcm_init6
c08c9798 l O .init.data 00000004 __initcall_snd_compress_init6
c08c979c l O .init.data 00000004 __initcall_snd_soc_init6
c08c97a0 l O .init.data 00000004 __initcall_ipq40xx_audio_driver_init6
c08c97a4 l O .init.data 00000004 __initcall_ipq40xx_pcm_i2s_driver_init6
c08c97a8 l O .init.data 00000004 __initcall_ipq40xx_pcm_tdm_driver_init6
c08c97ac l O .init.data 00000004 __initcall_ipq40xx_pcm_spdif_driver_init6
c08c97b0 l O .init.data 00000004 __initcall_ipq40xx_dai_driver_init6
c08c97b4 l O .init.data 00000004 __initcall_ipq40xx_mbox_driver_init6
c08c97b8 l O .init.data 00000004 __initcall_ipq40xx_audio_adss_driver_init6
c08c97bc l O .init.data 00000004 __initcall_ipq40xx_audio_stereo_driver_init6
c08c97c0 l O .init.data 00000004 __initcall_ipq40xx_pcm_raw_driver_init6
c08c97c4 l O .init.data 00000004 __initcall_ipq40xx_pcm_raw_driver_test_init6
c08c97c8 l O .init.data 00000004 __initcall_flow_cache_init_global6
c08c97cc l O .init.data 00000004 __initcall_llc_init6
c08c97d0 l O .init.data 00000004 __initcall_snap_init6
c08c97d4 l O .init.data 00000004 __initcall_blackhole_module_init6
c08c97d8 l O .init.data 00000004 __initcall_fq_codel_module_init6
c08c97dc l O .init.data 00000004 __initcall_xt_init6
c08c97e0 l O .init.data 00000004 __initcall_tcpudp_mt_init6
c08c97e4 l O .init.data 00000004 __initcall_gre_offload_init6
c08c97e8 l O .init.data 00000004 __initcall_sysctl_ipv4_init6
c08c97ec l O .init.data 00000004 __initcall_ipv4_netfilter_init6
c08c97f0 l O .init.data 00000004 __initcall_cubictcp_register6
c08c97f4 l O .init.data 00000004 __initcall_inet6_init6
c08c97f8 l O .init.data 00000004 __initcall_packet_init6
c08c97fc l O .init.data 00000004 __initcall_br_init6
c08c9800 l O .init.data 00000004 __initcall_ebtables_init6
c08c9804 l O .init.data 00000004 __initcall_ebtable_broute_init6
c08c9808 l O .init.data 00000004 __initcall_ebtable_filter_init6
c08c980c l O .init.data 00000004 __initcall_ebtable_nat_init6
c08c9810 l O .init.data 00000004 __initcall_ebt_802_3_init6
c08c9814 l O .init.data 00000004 __initcall_ebt_among_init6
c08c9818 l O .init.data 00000004 __initcall_ebt_ip_init6
c08c981c l O .init.data 00000004 __initcall_ebt_mark_m_init6
c08c9820 l O .init.data 00000004 __initcall_ebt_pkttype_init6
c08c9824 l O .init.data 00000004 __initcall_vlan_proto_init6
c08c9828 g .init.data 00000000 __initcall7_start
c08c9828 l O .init.data 00000004 __initcall_init_machine_late7
c08c982c l O .init.data 00000004 __initcall_swp_emulation_init7
c08c9830 l O .init.data 00000004 __initcall_init_oops_id7
c08c9834 l O .init.data 00000004 __initcall_pm_qos_power_init7
c08c9838 l O .init.data 00000004 __initcall_pm_debugfs_init7
c08c983c l O .init.data 00000004 __initcall_printk_late_init7
c08c9840 l O .init.data 00000004 __initcall_tk_debug_sleep_time_init7
c08c9844 l O .init.data 00000004 __initcall_ubifs_init7
c08c9848 l O .init.data 00000004 __initcall_init_root_keyring7
c08c984c l O .init.data 00000004 __initcall_prandom_reseed7
c08c9850 l O .init.data 00000004 __initcall_pci_resource_alignment_sysfs_init7
c08c9854 l O .init.data 00000004 __initcall_pci_sysfs_init7
c08c9858 l O .init.data 00000004 __initcall_regulator_init_complete7
c08c985c l O .init.data 00000004 __initcall_deferred_probe_initcall7
c08c9860 l O .init.data 00000004 __initcall_ubi_init7
c08c9864 l O .init.data 00000004 __initcall_rtc_hctosys7
c08c9868 l O .init.data 00000004 __initcall_sync_debugfs_init7
c08c986c l O .init.data 00000004 __initcall_msm_bus_debugfs_init7
c08c9870 l O .init.data 00000004 __initcall_clk_debug_init7
c08c9874 l O .init.data 00000004 __initcall_fab_scaling_ipq806x_init7
c08c9878 l O .init.data 00000004 __initcall_tcp_congestion_default7
c08c987c l O .init.data 00000004 __initcall_clk_disable_unused7s
c08c9880 l O .init.data 00000004 __initcall_alsa_sound_last_init7s
c08c9884 g .init.data 00000000 __initcall_end
c08c9884 l O .init.data 00000004 __initcall_serial8250_console_init
要对这份输出信息做一个说明:第一列是所有符号的装入地址;第二列表示符号的全局性和可读写性, l 表示 local ,凡是用 static 修饰的都是这种属性,g表示global ,内核源代码中全局变量属于这一类, 还有用 EXPORT_SYMBOL (这个宏在 linux/module.h 中定义)修饰的变量和函数也都是属于 global 。
w 表示 writable ;第三列表示此符号的本质是什么, O 表示是变量(一般是全局变量), F 表示函数, d 表示 可执行文件中的 section ;
第四列和第五列比较复杂,如果符号属于 d ,那么第五列表示该 section 缺省值, 一般都为 0 ,如果属于 O 或 F ,那么第四列表示符号所属的 section ,
第五列则表示该符号所占用的内存 大小;还有一类最特殊,就是用 ABS 修饰的符号, * ABS* 表示绝对 (absolute) ,这意味着不能将该值更 改为其他的连接,我们关注
的 __initcall_start 和 __initcall_end 就属于这一类。 所以 do_initcalls 就是用来调 用所有使用 __initcall 标记过的函数。
在内核中,将这些section按块进行了划分:
static initcall_t *initcall_levels[] __initdata = {
__initcall0_start,
__initcall1_start,
__initcall2_start,
__initcall3_start,
__initcall4_start,
__initcall5_start,
__initcall6_start,
__initcall7_start,
__initcall_end,
};
启动的时候按顺序一个一个初始化,下面是和网络相关的一些初始化,现在我们重点是讨论网络协议栈,所以先分析和协议栈相关的初始化,其他协议相关的初始化后面再分析。
c08c9354 l O .init.data 00000004 __initcall_sock_init1
c08c9358 l O .init.data 00000004 __initcall_netlink_proto_init1
c08c9370 l O .init.data 00000004 __initcall_pcibus_class_init2
c08c9374 l O .init.data 00000004 __initcall_pci_driver_init2
c08c9488 l O .init.data 00000004 __initcall_proto_init4
c08c948c l O .init.data 00000004 __initcall_net_dev_init4
c08c9490 l O .init.data 00000004 __initcall_neigh_init4
c08c9494 l O .init.data 00000004 __initcall_fib_rules_init4
c08c951c l O .init.data 00000004 __initcall_inet_init5
c08c97f4 l O .init.data 00000004 __initcall_inet6_init6 //IPv6的初始化
c08c97f8 l O .init.data 00000004 __initcall_packet_init6
c08c97fc l O .init.data 00000004 __initcall_br_init6
c08c9800 l O .init.data 00000004 __initcall_ebtables_init6
c08c9804 l O .init.data 00000004 __initcall_ebtable_broute_init6
c08c9808 l O .init.data 00000004 __initcall_ebtable_filter_init6
c08c980c l O .init.data 00000004 __initcall_ebtable_nat_init6
c08c9810 l O .init.data 00000004 __initcall_ebt_802_3_init6
c08c9814 l O .init.data 00000004 __initcall_ebt_among_init6
c08c9818 l O .init.data 00000004 __initcall_ebt_ip_init6
c08c981c l O .init.data 00000004 __initcall_ebt_mark_m_init6
c08c9820 l O .init.data 00000004 __initcall_ebt_pkttype_init6
c08c9824 l O .init.data 00000004 __initcall_vlan_proto_init6
接下来着重分析三个初始化函数: sock_init, proto_init 和 inet_init