1、sysctl_init
root_table行程一张大链表
2、helper_init
helper_wq初始化这个工作队列,workqueue_struct,name为kthread
3、init_jiffies_clocksource
初始化jiffies时钟源
4、ksysfs_init
生成/sys/kernel
5、filelock_init
生成filelock_cache的内存cache
6、init_script_binfmt
将script_format添加至formats中
7、init_elf_binfmt
将elf_format添加至formats中
8、random32_init
随机机制初始化,net_rand_state
9、 sock_init
生成sockfs以及一些slab三链cache
10、netlink_proto_init
sock_register(&netlink_family_ops);//将netlink_family_ops注册至sockfs, add a socket protocol handler protocol :协议
net_families[16]为现所注册的
NET: Registered protocol family 16
rtnetlink_init():rtnl,rtnetlink_links[0]和[16]初始化
rtnetlink_dev_notifier注册至netdev_chain
11、 tty_class_init
将tty注册至sys/class
12、onu_platform_init
初始化sys/device/platform各种链表(flash、fe)。
fe与flash有差异,fe还有一个资源注册至一个全局变量
platform_add另开文分析。
13、 frame_info_init
schedule_mfi初始化
14、 topology_init
15、 param_sysfs_init
生成sys/module/xxxx/parameters
16、 init_bio
函数用于建立和分配bvec_slabs中的slab对象,以及为bio和bio_vec建立内存池
fs_bio_set、bio_split_pool
17、genhd_device_init
生成/sys/block
blk_dev_init:kblockd_workqueue、request_cachep、requestq_cachep、iocontext_cachep,打开BLOCK_SOFTIRQ软中断,注册blk_cpu_notifier至cpu_chain
18、misc_init
生成/proc/misc
注册/sys/class
注册misc字符设备
19、 spi_init
bus、class注册
20、 proto_init
/* register /proc/net/protocols */ 各种网络协议
21、net_dev_init
net_dma_client初始化,并做一个平衡
22、genl_init
genl_sock和family_ht,以及genl_ctrl
23、 clocksource_done_booting
finished_booting=1
24、init_pipe_fs
创建pipefs文件系统
25、chr_dev_init
注册字符设备mem,设备号MEM_MAJOR(1).字符设备注册见注释register_chrdev
注册class/mem
<6>Time: MIPS clocksource has been installed. //timer_interrupt中断里面更新的信息
26、inet_init
网络协议的初始化
sock_register(&netlink_family_ops);//注册PF_INET的消息句柄,inet_create
NET: Registered protocol family 2(在sock_register的打印信息)
linux路由表初始化
IP route cache hash table entries: 1024 (order: 0, 4096 bytes) //alloc_large_system_hash在这个函数里打印
alloc_large_system_hash函数能够根据机器物理内存的大小灵活地分配散列表的存储空间
并且注册了tcp ,udp ,raw三种网络协议
TCP bind hash table entries: 1024 (order: 0, 4096 bytes)
TCP: Hash tables configured (established 1024 bind 1024)
TCP reno registered
27、populate_rootfs
调用了do_name挂载压缩在内核文件中的文件
link_path_walk函数重点
28、create_proc_profile
29、ioresources_init
/proc/iomem /proc/ioports
30、timekeeping_init_device
/sys/devices/system/timekeeping/
31、 uid_cache_init
root_user插入uidhash_table的表中
32、 init_posix_timers
33、init_posix_cpu_timers
34、latency_init
35、init_clocksource_sysfs
/sys/devices/system/clocksource
36、init_timer_list_procfs
/proc/ timer_list
Calling initcall 0x80288474: init+0x0/0x90()
38、kallsyms_init
/proc/kallsyms
39、 ikconfig_init
/proc/config.gz 内核配置 需要用zcat
40、 utsname_sysctl_init
41、init_per_zone_pages_min
这几个用于判断是否需要回收page的阀值pages_min,pages_low,pages_high随内存的大小而非线性增长。
42、 pdflush_init
pdflush的作用是同步内存和磁盘
kthread_run(pdflush, NULL, "pdflush"); //生成线程
43、kswapd_init
pgdat->kswapd = kthread_run(kswapd, pgdat, "kswapd%d", nid);//生成线程
kswap的作用是管理内存
44、procswaps_init
create_proc_entry("swaps", 0, NULL);
/proc/swaps
45、 init_tmpfs
挂载tmpfs文件系统
shm_mnt
46、 cpucache_init
Initiate the reap timer running on the target CPU. We run at around 1 to 2Hz via the workqueue/eventd.
reap_work = &per_cpu(reap_work, cpu),这个初始化
47、 fasync_init
fasync_cache空间分配
48、 aio_setup
生成aio_wq = create_workqueue("aio"); 工作队列
49、eventpoll_init
挂载eventpollfs文件系统
50、 init_devpts_fs
挂载devpts文件系统
51、init_ramfs_fs
挂载ramfs
52、 init_nfs_fs
挂载nfs以及nfs的一些条件变量的初始化
53、 init_nlm
初始化nlm_sysctl_table
54、 ipc_init
/**
* ipc_init - initialise IPC subsystem
*
* The various system5 IPC resources (semaphores, messages and shared
* memory) are initialised
*/
init_ipc_ns、init_shm_ids、init_msg_ids、 init_sem_ids初始化 proc/sysvipc/sem msg shm
55、 ipc_sysctl_init
注册ipc_root_table 的sysctl
56、 noop_init
elv_register(&elevator_noop);
io scheduler noop registered
57、 deadline_init
return elv_register(&iosched_deadline);
io scheduler deadline registered (default)
58、cfq_init
ret = elv_register(&iosched_cfq);
io scheduler cfq registered
59、 rand_initialize
input_pool、blocking_pool、nonblocking_pool
60、 tty_init
/dev/tty
/dev/console
/dev/ptmx
注册者三个字符设备,三个设备主设备号一样为5
61、pty_init
if (tty_register_driver(ptm_driver))
if (tty_register_driver(pts_driver))
这两个注册至tty
Serial: 8250/16550 driver $Revision: 1.90 $ 4 ports, IRQ sharing disabled
******232 mode reg addr= 0xbf900020 value 0x0
******cs2 address = 0xbf003028 value = 0x1f900
******cs1 address = 0xbf003024 value = 0x1f800
Serial: optrann serial driver $Revision: 1.0
uart_register_driver finished
ttyS0 at MMIO map 0xbf001800 mem 0xbf001800 (irq = 23) is a UART 0
uart add one port done
ttyS1 at MMIO map 0xbf001c00 mem 0xbf001c00 (irq = 24) is a UART 1
uart add one port done
添加设备文件/dev/ttyS0 /dev/ttyS1
RAMDISK driver initialized: 16 RAM disks of 1846049K size 1024 blocksize
/*
* This is the registration and initialization section of the RAM disk driver
*/
ramdisk块设备初始化,注册
65、net_olddevs_init
66、 loopback_init
注册loopback网络设备
register_netdevice(dev) //这个函数,将设备dev添加到dev_base
PPP generic driver version 2.4.2
register_chrdev()注册字符设备,设备号108
68、 ppp_async_init
tty_register_ldisc(N_PPP, &ppp_ldisc);//注册tty a line discipline
69、ppp_sync_init
tty_register_ldisc(N_SYNC_PPP, &ppp_sync_ldisc);
NET: Registered protocol family 24
sock_register(&pppox_proto_family);//增加//增加net_families的消息句柄,这回是24
71、 pppoe_init
pppoe_proc_init();
register_netdevice_notifier(&pppoe_notifier);
72、onu_fe_init
网卡初始化
onu_fe_ether Ethernet driver, V1.00FE:dmac_regs =0xbf01c000, irq=26
alloc dma done:vaddr=0xa06c0000,dma=0xa06c0000,size=262144
FE MAC: 00:00:6f:cc:cc:cc
onu_fe_ether Ethernet driver, V1.00
FE:dmac_regs =0xbf01c000, irq=26
FE MAC: 00:00:6f:cc:cc:cc
onu_fe_ether Ethernet driver, V1.00
FE:dmac_regs =0xbf01c000, irq=26
FE MAC: 00:00:6f:cc:cc:cc
onu_fe_ether Ethernet driver, V1.00
FE:dmac_regs =0xbf018000, irq=25
alloc dma done:vaddr=0xa0740000,dma=0xa0740000,size=262144
FE MAC: 00:00:6f:cc:cc:cc
onu_fe_ether Ethernet driver, V1.00
FE:dmac_regs =0xbf018000, irq=25
FE MAC: 00:00:6f:cc:cc:cc
onu_fe_ether Ethernet driver, V1.00
FE:dmac_regs =0xbf018000, irq=25
FE MAC: 00:00:6f:cc:cc:cc
73、 init_mtd
proc_mtd->read_proc = mtd_read_proc;
74、 init_mtdchar
注册mtd字符设备,并且初始化mtd_class
Calling initcall 0x8028e570: cfi_probe_init+0x0/0x24()
Calling initcall 0x8018b8b8: opconn_spi_drv_init+0x0/0xc()
Opulan-flash Opulan-flash.0: found mx26, expected at26df321
Opulan-flash Opulan-flash.0: at26df321 (8192 Kbytes)
partitions[0] = {.name = Config, .offset = 0x00050000, .size = 0x00010000 (64K) }
partitions[1] = {.name = alarm1, .offset = 0x00060000, .size = 0x00010000 (64K) }
partitions[2] = {.name = alarm2, .offset = 0x00070000, .size = 0x00010000 (64K) }
partitions[3] = {.name = OS 1, .offset = 0x00080000, .size = 0x003c0000 (3840K) }
partitions[4] = {.name = OS 2, .offset = 0x00440000, .size = 0x003c0000 (3840K) }
Creating 5 MTD partitions on "f23_flash":
0x00050000-0x00060000 : "Config"
0x00060000-0x00070000 : "alarm1"
0x00070000-0x00080000 : "alarm2"
0x00080000-0x00440000 : "OS 1"
0x00440000-0x00800000 : "OS 2"
Calling initcall 0x80291158: cubictcp_register+0x0/0xec()
TCP cubic registered
Calling initcall 0x80291244: af_unix_init+0x0/0x98()
NET: Registered protocol family 1
Calling initcall 0x802912dc: packet_init+0x0/0x80()
NET: Registered protocol family 17
Calling initcall 0x8029135c: init_sunrpc+0x0/0x74()
Calling initcall 0x8028c7c0: random32_reseed+0x0/0x38()
Calling initcall 0x8028c8cc: seqgen_init+0x0/0x20()
Calling initcall 0x8028fbbc: tcp_congestion_default+0x0/0xc()
Calling initcall 0x80290a60: ip_auto_config+0x0/0x6f8()
ps:
函数: int inflate_dynamic()
功能: 用动态的Huffman编码压缩的数据
1) 读入5位的值HLIT,算出nl = 257+HLIT。这是需要编码的最大值。
2) 读入5位的值HDIST,算出nd = 1+HDIST。这是distance的最大值。
3) 读入4位的值HCLEN,算出nb = 4+HCLEN。说明有多少种编码长度。
4) 再读入3*nb位,每三位的值表示用多少位来表示所对应的编码长度。
5) 调用huft_build()建造编码长度的Huffman树。
6) 利用这个Huffman树,对接下来的若干位解码出nl+nd个值,这些值依次是0~nl-1
的编码长度(对于文字/length平说),及0~nd-1的编码长度(对于distance来说)。
7) 利用上面解码出的两组长度值,两次调用huft_build()函数,建造两个Huffman树
(一个是为文字/length,另一个是为distance)。
8) 调用函数inflate_codes()进行解码。