1. 首先修改kernel的bootargs,在bootargs中添加以下内容:
-
setenv printk.time y initcall_debug
-
这样kernel在启动时,将会打印出每个模块的启动耗时,将此log信息保存下来。
-
# dmesg > log_file.txt # kernel/scripts/show_delta log_file.txt > boot_time_info
-
这样脚本将会把具体的信息保存在boot_time_info中,其中每一行的前面显示了自启动到目前的耗时、以及加载本模块的耗时,可以很方便的分析Linux kernel的启动耗时情况
-
# cat boot.log | perl scripts/bootgraph.pl > kernel.svg
2. 具体耗时函数分析
static void __init do_initcalls(void)
{
initcall_t *fn;
for (fn = __early_initcall_end; fn < __initcall_end; fn++)
{
//add printk to debug
printk("===========now start servers :%p/n", fn);
//add end
do_one_initcall(*fn);
}
}
[ 0.300000] ===========now start servers :c0008414
[ 0.520000] ===========now start servers :c000859c
然后根据系统内核上面的映射表找到当前地址的函数(内核根目录下的System.map)
1 0000000c A cpu_arm926_suspend_size
2 c0004000 A swapper_pg_dir
3 c0008000 T _text
4 c0008000 T stext
5 c0008050 t __create_page_tables
6 c0008104 t __turn_mmu_on_loc
7 c0008110 t __enable_mmu
8 c0008140 t __fixup_pv_table
9 c0008180 t __vet_atags
10 c0008400 T __exception_text_start
11 c0008400 T _stext
12 c0008400 T asm_do_IRQ
13 c0008414 T do_undefinstr
14 c000859c T do_PrefetchAbort
15 c0008638 T do_DataAbort
16 c00086d4 T __exception_text_end
17 c00086d8 t __do_fixup_smp_on_up
18 c00086ec T fixup_smp
19 c0008704 t __fixup_a_pv_table
20 c0008728 T fixup_pv_table
21 c000874c T do_one_initcall
22 c00088c4 t run_init_process
23 c00088e8 t init_post
根据函数地址找到这两个函数中间的操作进行优化
3. 查看系统启动耗时:
root@tl:~# cat /proc/uptime
86.10 0.24 //系统启动时间, 系统空闲时间, 如果系统空间时间很大时也是可以通过优化空闲时间来提高系统启动时间的
root@tl:~#