学习Linux-4.12内核网路协议栈(1.1)——系统的初始化(do_initcalls)

来源:互联网 发布:淘宝代销如何看进价 编辑:程序博客网 时间:2024/05/23 13:05

我们知道,不管在什么样的平台上启动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 |sortc08c9294 g       .init.data00000000 __initcall_startc08c9294 l     O .init.data00000004 __initcall_cpu_suspend_alloc_spearlyc08c9298 l     O .init.data00000004 __initcall_init_static_idmapearlyc08c929c l     O .init.data00000004 __initcall_spawn_ksoftirqdearlyc08c92a0 l     O .init.data00000004 __initcall_init_workqueuesearlyc08c92a4 l     O .init.data00000004 __initcall_migration_initearlyc08c92a8 l     O .init.data00000004 __initcall_check_cpu_stall_initearlyc08c92ac l     O .init.data00000004 __initcall_rcu_scheduler_really_startedearlyc08c92b0 l     O .init.data00000004 __initcall_rcu_spawn_gp_kthreadearlyc08c92b4 l     O .init.data00000004 __initcall_cpu_stop_initearlyc08c92b8 l     O .init.data00000004 __initcall_hashlib_initearlyc08c92bc l     O .init.data00000004 __initcall_dynamic_debug_initearlyc08c92c0 l     O .init.data00000004 __initcall_rand_initializeearlyc08c92c4 g       .init.data00000000 __initcall0_startc08c92c4 l     O .init.data00000004 __initcall_ipc_ns_init0c08c92c8 l     O .init.data00000004 __initcall_init_mmap_min_addr0c08c92cc l     O .init.data00000004 __initcall_init_cpufreq_transition_notifier_list0c08c92d0 l     O .init.data00000004 __initcall_net_ns_init0c08c92d4 g       .init.data00000000 __initcall1_startc08c92d4 l     O .init.data00000004 __initcall_vfp_init1c08c92d8 l     O .init.data00000004 __initcall_ptrace_break_init1c08c92dc l     O .init.data00000004 __initcall_register_cpufreq_notifier1c08c92e0 l     O .init.data00000004 __initcall_v6_userpage_init1c08c92e4 l     O .init.data00000004 __initcall_qcom_atomic_pool_size_set1c08c92e8 l     O .init.data00000004 __initcall_cpu_hotplug_pm_sync_init1c08c92ec l     O .init.data00000004 __initcall_alloc_frozen_cpus1c08c92f0 l     O .init.data00000004 __initcall_wq_sysfs_init1c08c92f4 l     O .init.data00000004 __initcall_ksysfs_init1c08c92f8 l     O .init.data00000004 __initcall_pm_init1c08c92fc l     O .init.data00000004 __initcall_init_jiffies_clocksource1c08c9300 l     O .init.data00000004 __initcall_cpu_pm_init1c08c9304 l     O .init.data00000004 __initcall_init_zero_pfn1c08c9308 l     O .init.data00000004 __initcall_fsnotify_init1c08c930c l     O .init.data00000004 __initcall_filelock_init1c08c9310 l     O .init.data00000004 __initcall_init_script_binfmt1c08c9314 l     O .init.data00000004 __initcall_init_elf_binfmt1c08c9318 l     O .init.data00000004 __initcall_debugfs_init1c08c931c l     O .init.data00000004 __initcall_prandom_init1c08c9320 l     O .init.data00000004 __initcall_pinctrl_init1c08c9324 l     O .init.data00000004 __initcall_regulator_init1c08c9328 l     O .init.data00000004 __initcall_cpufreq_core_init1c08c932c l     O .init.data00000004 __initcall_cpuidle_init1c08c9330 l     O .init.data00000004 __initcall_rpm_clk_init1c08c9334 l     O .init.data00000004 __initcall_gcc_apq8084_init1c08c9338 l     O .init.data00000004 __initcall_gcc_ipq806x_init1c08c933c l     O .init.data00000004 __initcall_gcc_msm8660_init1c08c9340 l     O .init.data00000004 __initcall_gcc_msm8960_init1c08c9344 l     O .init.data00000004 __initcall_gcc_msm8974_init1c08c9348 l     O .init.data00000004 __initcall_gcc_ipq40xx_init1c08c934c l     O .init.data00000004 __initcall_adcc_ipq40xx_init1c08c9350 l     O .init.data00000004 __initcall_gcc_dummy_init1c08c9354 l     O .init.data00000004 __initcall_sock_init1c08c9358 l     O .init.data00000004 __initcall_netlink_proto_init1c08c935c g       .init.data00000000 __initcall2_startc08c935c l     O .init.data00000004 __initcall_atomic_pool_init2c08c9360 l     O .init.data00000004 __initcall_bdi_class_init2c08c9364 l     O .init.data00000004 __initcall_mm_sysfs_init2c08c9368 l     O .init.data00000004 __initcall_kobject_uevent_init2c08c936c l     O .init.data00000004 __initcall_gpiolib_sysfs_init2c08c9370 l     O .init.data00000004 __initcall_pcibus_class_init2c08c9374 l     O .init.data00000004 __initcall_pci_driver_init2c08c9378 l     O .init.data00000004 __initcall_backlight_class_init2c08c937c l     O .init.data00000004 __initcall_amba_init2c08c9380 l     O .init.data00000004 __initcall_tty_class_init2c08c9384 l     O .init.data00000004 __initcall_wakeup_sources_debugfs_init2c08c9388 l     O .init.data00000004 __initcall_regmap_initcall2c08c938c l     O .init.data00000004 __initcall_syscon_init2c08c9390 l     O .init.data00000004 __initcall_spi_init2c08c9394 l     O .init.data00000004 __initcall_spmi_init2c08c9398 l     O .init.data00000004 __initcall_i2c_init2c08c939c l     O .init.data00000004 __initcall_init_ladder2c08c93a0 l     O .init.data00000004 __initcall_init_menu2c08c93a4 l     O .init.data00000004 __initcall_msm_bus_init2c08c93a8 g       .init.data00000000 __initcall3_startc08c93a8 l     O .init.data00000004 __initcall_gate_vma_init3c08c93ac l     O .init.data00000004 __initcall_customize_machine3c08c93b0 l     O .init.data00000004 __initcall_arch_hw_breakpoint_init3c08c93b4 l     O .init.data00000004 __initcall_exceptions_init3c08c93b8 l     O .init.data00000004 __initcall_qfprom_init3c08c93bc l     O .init.data00000004 __initcall_apq8064_pinctrl_init3c08c93c0 l     O .init.data00000004 __initcall_apq8084_pinctrl_init3c08c93c4 l     O .init.data00000004 __initcall_ipq8064_pinctrl_init3c08c93c8 l     O .init.data00000004 __initcall_msm8960_pinctrl_init3c08c93cc l     O .init.data00000004 __initcall_msm8x74_pinctrl_init3c08c93d0 l     O .init.data00000004 __initcall_ipq40xx_pinctrl_init3c08c93d4 l     O .init.data00000004 __initcall_dma_bus_init3c08c93d8 l     O .init.data00000004 __initcall_dma_channel_table_init3c08c93dc l     O .init.data00000004 __initcall_msm_init_datamover3c08c93e0 l     O .init.data00000004 __initcall_qcom_rpm_init3c08c93e4 l     O .init.data00000004 __initcall_i2c_msm_init3c08c93e8 l     O .init.data00000004 __initcall_sps_init3c08c93ec g       .init.data00000000 __initcall4_startc08c93ec l     O .init.data00000004 __initcall_topology_init4c08c93f0 l     O .init.data00000004 __initcall_param_sysfs_init4c08c93f4 l     O .init.data00000004 __initcall_pm_sysrq_init4c08c93f8 l     O .init.data00000004 __initcall_default_bdi_init4c08c93fc l     O .init.data00000004 __initcall_init_reserve_notifier4c08c9400 l     O .init.data00000004 __initcall_init_admin_reserve4c08c9404 l     O .init.data00000004 __initcall_init_user_reserve4c08c9408 l     O .init.data00000004 __initcall_init_bio4c08c940c l     O .init.data00000004 __initcall_crypto_wq_init4c08c9410 l     O .init.data00000004 __initcall_cryptomgr_init4c08c9414 l     O .init.data00000004 __initcall_blk_settings_init4c08c9418 l     O .init.data00000004 __initcall_blk_ioc_init4c08c941c l     O .init.data00000004 __initcall_blk_softirq_init4c08c9420 l     O .init.data00000004 __initcall_blk_iopoll_setup4c08c9424 l     O .init.data00000004 __initcall_blk_mq_init4c08c9428 l     O .init.data00000004 __initcall_genhd_device_init4c08c942c l     O .init.data00000004 __initcall_gpiolib_debugfs_init4c08c9430 l     O .init.data00000004 __initcall_pwm_debugfs_init4c08c9434 l     O .init.data00000004 __initcall_pwm_sysfs_init4c08c9438 l     O .init.data00000004 __initcall_pci_slot_init4c08c943c l     O .init.data00000004 __initcall_qcom_pcie_init4c08c9440 l     O .init.data00000004 __initcall_fbmem_init4c08c9444 l     O .init.data00000004 __initcall_regulator_fixed_voltage_init4c08c9448 l     O .init.data00000004 __initcall_gpio_regulator_init4c08c944c l     O .init.data00000004 __initcall_rpm_reg_init4c08c9450 l     O .init.data00000004 __initcall_ipq40xx_regulator_init4c08c9454 l     O .init.data00000004 __initcall_misc_init4c08c9458 l     O .init.data00000004 __initcall_init_scsi4c08c945c l     O .init.data00000004 __initcall_ata_init4c08c9460 l     O .init.data00000004 __initcall_mtdsplit_squashfs_init4c08c9464 l     O .init.data00000004 __initcall_phy_init4c08c9468 l     O .init.data00000004 __initcall_rtc_init4c08c946c l     O .init.data00000004 __initcall_power_supply_class_init4c08c9470 l     O .init.data00000004 __initcall_hwmon_init4c08c9474 l     O .init.data00000004 __initcall_watchdog_init4c08c9478 l     O .init.data00000004 __initcall_leds_init4c08c947c l     O .init.data00000004 __initcall_msm_bus_device_init_driver4c08c9480 l     O .init.data00000004 __initcall_init_soundcore4c08c9484 l     O .init.data00000004 __initcall_alsa_sound_init4c08c9488 l     O .init.data00000004 __initcall_proto_init4c08c948c l     O .init.data00000004 __initcall_net_dev_init4c08c9490 l     O .init.data00000004 __initcall_neigh_init4c08c9494 l     O .init.data00000004 __initcall_fib_rules_init4c08c9498 l     O .init.data00000004 __initcall_pktsched_init4c08c949c l     O .init.data00000004 __initcall_tc_filter_init4c08c94a0 l     O .init.data00000004 __initcall_tc_action_init4c08c94a4 l     O .init.data00000004 __initcall_genl_init4c08c94a8 l     O .init.data00000004 __initcall_wireless_nlevent_init4c08c94ac l     O .init.data00000004 __initcall_pcie_init4sc08c94b0 g       .init.data00000000 __initcall5_startc08c94b0 l     O .init.data00000004 __initcall_proc_cpu_init5c08c94b4 l     O .init.data00000004 __initcall_dma_debug_do_init5c08c94b8 l     O .init.data00000004 __initcall_alignment_init5c08c94bc l     O .init.data00000004 __initcall_clocksource_done_booting5c08c94c0 l     O .init.data00000004 __initcall_init_pipe_fs5c08c94c4 l     O .init.data00000004 __initcall_eventpoll_init5c08c94c8 l     O .init.data00000004 __initcall_anon_inode_init5c08c94cc l     O .init.data00000004 __initcall_proc_cmdline_init5c08c94d0 l     O .init.data00000004 __initcall_proc_consoles_init5c08c94d4 l     O .init.data00000004 __initcall_proc_cpuinfo_init5c08c94d8 l     O .init.data00000004 __initcall_proc_devices_init5c08c94dc l     O .init.data00000004 __initcall_proc_interrupts_init5c08c94e0 l     O .init.data00000004 __initcall_proc_loadavg_init5c08c94e4 l     O .init.data00000004 __initcall_proc_meminfo_init5c08c94e8 l     O .init.data00000004 __initcall_proc_stat_init5c08c94ec l     O .init.data00000004 __initcall_proc_uptime_init5c08c94f0 l     O .init.data00000004 __initcall_proc_version_init5c08c94f4 l     O .init.data00000004 __initcall_proc_softirqs_init5c08c94f8 l     O .init.data00000004 __initcall_proc_kmsg_init5c08c94fc l     O .init.data00000004 __initcall_init_ramfs_fs5c08c9500 l     O .init.data00000004 __initcall_blk_scsi_ioctl_init5c08c9504 l     O .init.data00000004 __initcall_dynamic_debug_init_debugfs5c08c9508 l     O .init.data00000004 __initcall_chr_dev_init5c08c950c l     O .init.data00000004 __initcall_firmware_class_init5c08c9510 l     O .init.data00000004 __initcall_thermal_init5c08c9514 l     O .init.data00000004 __initcall_cpufreq_gov_performance_init5c08c9518 l     O .init.data00000004 __initcall_sysctl_core_init5c08c951c l     O .init.data00000004 __initcall_inet_init5c08c9520 l     O .init.data00000004 __initcall_ipv4_offload_init5c08c9524 l     O .init.data00000004 __initcall_af_unix_init5c08c9528 l     O .init.data00000004 __initcall_ipv6_offload_init5c08c952c l     O .init.data00000004 __initcall_pci_apply_final_quirks5sc08c9530 g       .init.data00000000 __initcallrootfs_startc08c9530 l     O .init.data00000004 __initcall_populate_rootfsrootfsc08c9534 g       .init.data00000000 __initcall6_startc08c9534 l     O .init.data00000004 __initcall_register_pmu_driver6c08c9538 l     O .init.data00000004 __initcall_msm_rpm_log_driver_init6c08c953c l     O .init.data00000004 __initcall_proc_execdomains_init6c08c9540 l     O .init.data00000004 __initcall_ioresources_init6c08c9544 l     O .init.data00000004 __initcall_uid_cache_init6c08c9548 l     O .init.data00000004 __initcall_init_posix_timers6c08c954c l     O .init.data00000004 __initcall_init_posix_cpu_timers6c08c9550 l     O .init.data00000004 __initcall_irq_pm_init_ops6c08c9554 l     O .init.data00000004 __initcall_timekeeping_init_ops6c08c9558 l     O .init.data00000004 __initcall_init_clocksource_sysfs6c08c955c l     O .init.data00000004 __initcall_init_timer_list_procfs6c08c9560 l     O .init.data00000004 __initcall_alarmtimer_init6c08c9564 l     O .init.data00000004 __initcall_clockevents_init_sysfs6c08c9568 l     O .init.data00000004 __initcall_sched_clock_syscore_init6c08c956c l     O .init.data00000004 __initcall_futex_init6c08c9570 l     O .init.data00000004 __initcall_proc_modules_init6c08c9574 l     O .init.data00000004 __initcall_kallsyms_init6c08c9578 l     O .init.data00000004 __initcall_ikconfig_init6c08c957c l     O .init.data00000004 __initcall_utsname_sysctl_init6c08c9580 l     O .init.data00000004 __initcall_irq_work_init_cpu_notifier6c08c9584 l     O .init.data00000004 __initcall_perf_event_sysfs_init6c08c9588 l     O .init.data00000004 __initcall_init_per_zone_wmark_min6c08c958c l     O .init.data00000004 __initcall_kswapd_init6c08c9590 l     O .init.data00000004 __initcall_setup_vmstat6c08c9594 l     O .init.data00000004 __initcall_mm_compute_batch_init6c08c9598 l     O .init.data00000004 __initcall_proc_vmalloc_init6c08c959c l     O .init.data00000004 __initcall_memblock_init_debugfs6c08c95a0 l     O .init.data00000004 __initcall_init_emergency_pool6c08c95a4 l     O .init.data00000004 __initcall_slab_sysfs_init6c08c95a8 l     O .init.data00000004 __initcall_init_cleancache6c08c95ac l     O .init.data00000004 __initcall_fcntl_init6c08c95b0 l     O .init.data00000004 __initcall_proc_filesystems_init6c08c95b4 l     O .init.data00000004 __initcall_dio_init6c08c95b8 l     O .init.data00000004 __initcall_fsnotify_mark_init6c08c95bc l     O .init.data00000004 __initcall_inotify_user_setup6c08c95c0 l     O .init.data00000004 __initcall_proc_locks_init6c08c95c4 l     O .init.data00000004 __initcall_init_mbcache6c08c95c8 l     O .init.data00000004 __initcall_init_devpts_fs6c08c95cc l     O .init.data00000004 __initcall_ext4_init_fs6c08c95d0 l     O .init.data00000004 __initcall_journal_init6c08c95d4 l     O .init.data00000004 __initcall_init_squashfs_fs6c08c95d8 l     O .init.data00000004 __initcall_init_hfsplus_fs6c08c95dc l     O .init.data00000004 __initcall_init_hfs_fs6c08c95e0 l     O .init.data00000004 __initcall_init_nls_utf86c08c95e4 l     O .init.data00000004 __initcall_init_jffs2_fs6c08c95e8 l     O .init.data00000004 __initcall_ovl_init6c08c95ec l     O .init.data00000004 __initcall_init_xfs_fs6c08c95f0 l     O .init.data00000004 __initcall_ipc_init6c08c95f4 l     O .init.data00000004 __initcall_ipc_sysctl_init6c08c95f8 l     O .init.data00000004 __initcall_key_proc_init6c08c95fc l     O .init.data00000004 __initcall_crypto_algapi_init6c08c9600 l     O .init.data00000004 __initcall_chainiv_module_init6c08c9604 l     O .init.data00000004 __initcall_eseqiv_module_init6c08c9608 l     O .init.data00000004 __initcall_seqiv_module_init6c08c960c l     O .init.data00000004 __initcall_crypto_null_mod_init6c08c9610 l     O .init.data00000004 __initcall_sha256_generic_mod_init6c08c9614 l     O .init.data00000004 __initcall_crypto_ctr_module_init6c08c9618 l     O .init.data00000004 __initcall_crypto_gcm_module_init6c08c961c l     O .init.data00000004 __initcall_crypto_ccm_module_init6c08c9620 l     O .init.data00000004 __initcall_aes_init6c08c9624 l     O .init.data00000004 __initcall_arc4_init6c08c9628 l     O .init.data00000004 __initcall_deflate_mod_init6c08c962c l     O .init.data00000004 __initcall_crc32c_mod_init6c08c9630 l     O .init.data00000004 __initcall_lzo_mod_init6c08c9634 l     O .init.data00000004 __initcall_crypto_xz_mod_init6c08c9638 l     O .init.data00000004 __initcall_krng_mod_init6c08c963c l     O .init.data00000004 __initcall_ghash_mod_init6c08c9640 l     O .init.data00000004 __initcall_asymmetric_key_init6c08c9644 l     O .init.data00000004 __initcall_x509_key_init6c08c9648 l     O .init.data00000004 __initcall_proc_genhd_init6c08c964c l     O .init.data00000004 __initcall_noop_init6c08c9650 l     O .init.data00000004 __initcall_deadline_init6c08c9654 l     O .init.data00000004 __initcall_libcrc32c_mod_init6c08c9658 l     O .init.data00000004 __initcall_percpu_counter_startup6c08c965c l     O .init.data00000004 __initcall_phy_core_init6c08c9660 l     O .init.data00000004 __initcall_qcom_apq8064_sata_phy_driver_init6c08c9664 l     O .init.data00000004 __initcall_qcom_ipq806x_sata_phy_driver_init6c08c9668 l     O .init.data00000004 __initcall_pcs_driver_init6c08c966c l     O .init.data00000004 __initcall_ipq4019_pwm_driver_init6c08c9670 l     O .init.data00000004 __initcall_pci_proc_init6c08c9674 l     O .init.data00000004 __initcall_genericbl_driver_init6c08c9678 l     O .init.data00000004 __initcall_mdss_qpic_driver_init6c08c967c l     O .init.data00000004 __initcall_mdss_fb_init6c08c9680 l     O .init.data00000004 __initcall_mdss_qpic_panel_init6c08c9684 l     O .init.data00000004 __initcall_bam_dma_driver_init6c08c9688 l     O .init.data00000004 __initcall_gsbi_driver_init6c08c968c l     O .init.data00000004 __initcall_tcsr_driver_init6c08c9690 l     O .init.data00000004 __initcall_qcom_restart_reason_driver_init6c08c9694 l     O .init.data00000004 __initcall_scm_restart_reason_driver_init6c08c9698 l     O .init.data00000004 __initcall_qcom_cache_dump_driver_init6c08c969c l     O .init.data00000004 __initcall_init_tz_log6c08c96a0 l     O .init.data00000004 __initcall_pty_init6c08c96a4 l     O .init.data00000004 __initcall_sysrq_init6c08c96a8 l     O .init.data00000004 __initcall_serial8250_init6c08c96ac l     O .init.data00000004 __initcall_msm_serial_hsl_init6c08c96b0 l     O .init.data00000004 __initcall_msm_serial_hs_init6c08c96b4 l     O .init.data00000004 __initcall_qca_serial_hs_init6c08c96b8 l     O .init.data00000004 __initcall_msm_rng_driver_init6c08c96bc l     O .init.data00000004 __initcall_topology_sysfs_init6c08c96c0 l     O .init.data00000004 __initcall_at24_init6c08c96c4 l     O .init.data00000004 __initcall_ahci_pci_driver_init6c08c96c8 l     O .init.data00000004 __initcall_ipq_ahci_driver_init6c08c96cc l     O .init.data00000004 __initcall_init_mtd6c08c96d0 l     O .init.data00000004 __initcall_ofpart_parser_init6c08c96d4 l     O .init.data00000004 __initcall_cmdline_parser_init6c08c96d8 l     O .init.data00000004 __initcall_init_mtdblock6c08c96dc l     O .init.data00000004 __initcall_cfi_probe_init6c08c96e0 l     O .init.data00000004 __initcall_of_flash_driver_init6c08c96e4 l     O .init.data00000004 __initcall_msm_nand_driver_init6c08c96e8 l     O .init.data00000004 __initcall_m25p80_driver_init6c08c96ec l     O .init.data00000004 __initcall_nand_base_init6c08c96f0 l     O .init.data00000004 __initcall_msm_nand_driver_init6c08c96f4 l     O .init.data00000004 __initcall_ubi_gluebi_init6c08c96f8 l     O .init.data00000004 __initcall_spidev_init6c08c96fc l     O .init.data00000004 __initcall_msm_spi_driver_init6c08c9700 l     O .init.data00000004 __initcall_spi_qup_driver_init6c08c9704 l     O .init.data00000004 __initcall_spmi_pmic_arb_driver_init6c08c9708 l     O .init.data00000004 __initcall_net_olddevs_init6c08c970c l     O .init.data00000004 __initcall_swconfig_init6c08c9710 l     O .init.data00000004 __initcall_mdio_gpio_driver_init6c08c9714 l     O .init.data00000004 __initcall_ipq40xx_mdio_driver_init6c08c9718 l     O .init.data00000004 __initcall_i2c_dev_init6c08c971c l     O .init.data00000004 __initcall_qup_i2c_driver_init6c08c9720 l     O .init.data00000004 __initcall_pca9575_init6c08c9724 l     O .init.data00000004 __initcall_tlc59208f_init6c08c9728 l     O .init.data00000004 __initcall_msm_restart_init6c08c972c l     O .init.data00000004 __initcall_tsens_tm_driver_init6c08c9730 l     O .init.data00000004 __initcall_msm_thermal_device_driver_init6c08c9734 l     O .init.data00000004 __initcall_qcom_watchdog_driver_init6c08c9738 l     O .init.data00000004 __initcall_cpufreq_stats_init6c08c973c l     O .init.data00000004 __initcall_cpufreq_gov_powersave_init6c08c9740 l     O .init.data00000004 __initcall_cpufreq_gov_userspace_init6c08c9744 l     O .init.data00000004 __initcall_cpufreq_gov_dbs_init6c08c9748 l     O .init.data00000004 __initcall_cpufreq_gov_dbs_init6c08c974c l     O .init.data00000004 __initcall_krait_cpufreq_platdrv_init6c08c9750 l     O .init.data00000004 __initcall_qcom_cpufreq_driver_init6c08c9754 l     O .init.data00000004 __initcall_qca_ipq40xx_cpufreq_platdrv_init6c08c9758 l     O .init.data00000004 __initcall_ipq40xx_led_driver_init6c08c975c l     O .init.data00000004 __initcall_timer_trig_init6c08c9760 l     O .init.data00000004 __initcall_defon_trig_init6c08c9764 l     O .init.data00000004 __initcall_netdev_trig_init6c08c9768 l     O .init.data00000004 __initcall_staging_init6c08c976c l     O .init.data00000004 __initcall_timed_output_init6c08c9770 l     O .init.data00000004 __initcall_spinand_driver_init6c08c9774 l     O .init.data00000004 __initcall_mmcc_apq8084_driver_init6c08c9778 l     O .init.data00000004 __initcall_nss_ipq806x_init6c08c977c l     O .init.data00000004 __initcall_mmcc_msm8960_driver_init6c08c9780 l     O .init.data00000004 __initcall_mmcc_msm8974_driver_init6c08c9784 l     O .init.data00000004 __initcall_kpss_xcc_driver_init6c08c9788 l     O .init.data00000004 __initcall_qcom_hfpll_driver_init6c08c978c l     O .init.data00000004 __initcall_krait_cc_driver_init6c08c9790 l     O .init.data00000004 __initcall_alsa_timer_init6c08c9794 l     O .init.data00000004 __initcall_alsa_pcm_init6c08c9798 l     O .init.data00000004 __initcall_snd_compress_init6c08c979c l     O .init.data00000004 __initcall_snd_soc_init6c08c97a0 l     O .init.data00000004 __initcall_ipq40xx_audio_driver_init6c08c97a4 l     O .init.data00000004 __initcall_ipq40xx_pcm_i2s_driver_init6c08c97a8 l     O .init.data00000004 __initcall_ipq40xx_pcm_tdm_driver_init6c08c97ac l     O .init.data00000004 __initcall_ipq40xx_pcm_spdif_driver_init6c08c97b0 l     O .init.data00000004 __initcall_ipq40xx_dai_driver_init6c08c97b4 l     O .init.data00000004 __initcall_ipq40xx_mbox_driver_init6c08c97b8 l     O .init.data00000004 __initcall_ipq40xx_audio_adss_driver_init6c08c97bc l     O .init.data00000004 __initcall_ipq40xx_audio_stereo_driver_init6c08c97c0 l     O .init.data00000004 __initcall_ipq40xx_pcm_raw_driver_init6c08c97c4 l     O .init.data00000004 __initcall_ipq40xx_pcm_raw_driver_test_init6c08c97c8 l     O .init.data00000004 __initcall_flow_cache_init_global6c08c97cc l     O .init.data00000004 __initcall_llc_init6c08c97d0 l     O .init.data00000004 __initcall_snap_init6c08c97d4 l     O .init.data00000004 __initcall_blackhole_module_init6c08c97d8 l     O .init.data00000004 __initcall_fq_codel_module_init6c08c97dc l     O .init.data00000004 __initcall_xt_init6c08c97e0 l     O .init.data00000004 __initcall_tcpudp_mt_init6c08c97e4 l     O .init.data00000004 __initcall_gre_offload_init6c08c97e8 l     O .init.data00000004 __initcall_sysctl_ipv4_init6c08c97ec l     O .init.data00000004 __initcall_ipv4_netfilter_init6c08c97f0 l     O .init.data00000004 __initcall_cubictcp_register6c08c97f4 l     O .init.data00000004 __initcall_inet6_init6c08c97f8 l     O .init.data00000004 __initcall_packet_init6c08c97fc l     O .init.data00000004 __initcall_br_init6c08c9800 l     O .init.data00000004 __initcall_ebtables_init6c08c9804 l     O .init.data00000004 __initcall_ebtable_broute_init6c08c9808 l     O .init.data00000004 __initcall_ebtable_filter_init6c08c980c l     O .init.data00000004 __initcall_ebtable_nat_init6c08c9810 l     O .init.data00000004 __initcall_ebt_802_3_init6c08c9814 l     O .init.data00000004 __initcall_ebt_among_init6c08c9818 l     O .init.data00000004 __initcall_ebt_ip_init6c08c981c l     O .init.data00000004 __initcall_ebt_mark_m_init6c08c9820 l     O .init.data00000004 __initcall_ebt_pkttype_init6c08c9824 l     O .init.data00000004 __initcall_vlan_proto_init6c08c9828 g       .init.data00000000 __initcall7_startc08c9828 l     O .init.data00000004 __initcall_init_machine_late7c08c982c l     O .init.data00000004 __initcall_swp_emulation_init7c08c9830 l     O .init.data00000004 __initcall_init_oops_id7c08c9834 l     O .init.data00000004 __initcall_pm_qos_power_init7c08c9838 l     O .init.data00000004 __initcall_pm_debugfs_init7c08c983c l     O .init.data00000004 __initcall_printk_late_init7c08c9840 l     O .init.data00000004 __initcall_tk_debug_sleep_time_init7c08c9844 l     O .init.data00000004 __initcall_ubifs_init7c08c9848 l     O .init.data00000004 __initcall_init_root_keyring7c08c984c l     O .init.data00000004 __initcall_prandom_reseed7c08c9850 l     O .init.data00000004 __initcall_pci_resource_alignment_sysfs_init7c08c9854 l     O .init.data00000004 __initcall_pci_sysfs_init7c08c9858 l     O .init.data00000004 __initcall_regulator_init_complete7c08c985c l     O .init.data00000004 __initcall_deferred_probe_initcall7c08c9860 l     O .init.data00000004 __initcall_ubi_init7c08c9864 l     O .init.data00000004 __initcall_rtc_hctosys7c08c9868 l     O .init.data00000004 __initcall_sync_debugfs_init7c08c986c l     O .init.data00000004 __initcall_msm_bus_debugfs_init7c08c9870 l     O .init.data00000004 __initcall_clk_debug_init7c08c9874 l     O .init.data00000004 __initcall_fab_scaling_ipq806x_init7c08c9878 l     O .init.data00000004 __initcall_tcp_congestion_default7c08c987c l     O .init.data00000004 __initcall_clk_disable_unused7sc08c9880 l     O .init.data00000004 __initcall_alsa_sound_last_init7sc08c9884 g       .init.data00000000 __initcall_endc08c9884 l     O .init.data00000004 __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.data00000004 __initcall_sock_init1c08c9358 l     O .init.data00000004 __initcall_netlink_proto_init1c08c9370 l     O .init.data00000004 __initcall_pcibus_class_init2c08c9374 l     O .init.data00000004 __initcall_pci_driver_init2c08c9488 l     O .init.data00000004 __initcall_proto_init4c08c948c l     O .init.data00000004 __initcall_net_dev_init4c08c9490 l     O .init.data00000004 __initcall_neigh_init4c08c9494 l     O .init.data00000004 __initcall_fib_rules_init4c08c951c l     O .init.data00000004 __initcall_inet_init5c08c97f4 l     O .init.data00000004 __initcall_inet6_init6  //IPv6的初始化c08c97f8 l     O .init.data00000004 __initcall_packet_init6c08c97fc l     O .init.data00000004 __initcall_br_init6c08c9800 l     O .init.data00000004 __initcall_ebtables_init6c08c9804 l     O .init.data00000004 __initcall_ebtable_broute_init6c08c9808 l     O .init.data00000004 __initcall_ebtable_filter_init6c08c980c l     O .init.data00000004 __initcall_ebtable_nat_init6c08c9810 l     O .init.data00000004 __initcall_ebt_802_3_init6c08c9814 l     O .init.data00000004 __initcall_ebt_among_init6c08c9818 l     O .init.data00000004 __initcall_ebt_ip_init6c08c981c l     O .init.data00000004 __initcall_ebt_mark_m_init6c08c9820 l     O .init.data00000004 __initcall_ebt_pkttype_init6c08c9824 l     O .init.data00000004 __initcall_vlan_proto_init6

接下来着重分析三个初始化函数: sock_init, proto_init 和 inet_init


阅读全文
0 0