系统起来的一些初始化

时间:2022-08-06 19:44:55


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 established hash table entries: 1024 (order: 1, 8192 bytes)
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


62、 serial8250_init+0x0/0x210()
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 



63、serial_optrann_init
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


64、 rd_init

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 


67、 ppp_init

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);


70、pppox_init

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.00
FE: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 0x8028e564: init_mtdblock+0x0/0xc()
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()进行解码。