执行阶段段修饰符号,查看执行流程

2014-12-20日,该脚本弃用,因为在分析ftrace时,得到的结果有误:

version one:

include/linux/init.h

看I2C驱动的时候,感觉有点乱,服务器挂了,没法编译,不好打桩;Makefile和Kconfig都看了下, 依据内核的头文件写了个脚本,方便查看函数执行流程。
执行 postseq `pwd`
输出 执行阶段的修饰符   函数名   文件名+行号
 1 #! /bin/bash
 2 
 3 file_one=/tmp/Jerry.post0.$$$$
 4 file_two=/tmp/Jerry.post1.$$$$
 5  
 6 #对于所有的被查看函数,默认以__init修饰段属性。
 7 for name in `grep __init ./* -rn | sed -n -e 's/.*init[[:blank:]]\{1\}\([a-zA-Z].*\)/\1/p' | sed -n -e 's/\([a-zA-Z0-9_]*\).*/\1/p'`
   #对__init修饰的函数名,查看执行阶段的修饰服
   #此处执行阶段的段修饰符有:
   #early_initcall    pure_initcall    core_initcall     core_initcall_sync
   #postcore_initcall post_inicall_sync  arch_initcall   arch_initcall_sync
   #subsys_initcall   subsys_initcall_sync  fs_initcall   fs_initcall_sync
   #rootfs_initcall
   #module_init   __initcall  device_initcall  device_initcall_sync
   #late_initcall  late_initcall_sync
 8 do
 9     grep $name `pwd`/* -rn  | sed -n -e '/early_initcall/p' -e '/pure_initcall/p' -e '/core_initcall/p' -e '/core_initcall_sync/p' -e '/postcore_initcall/p' -e '/postcore_initcall_sync/p' -e '/arch_initcall/p' -e '/arch_initcall_sync/p' -e '/subsys_initcall/p' -e '/subsys_initcall_sync/p' -e '/fs_initcall/p' -e '/fs_initcall_sync/p' -e '/rootfs_initcall/p' -e'/module_init/p' -e '/__initcall/p' -e '/device_initcall/p' -e '/device_initcall_sync/p' -e '/late_initcall/p' -e '/late_initcall_sync/p'  >> $file_one
10 done
11 
12 echo `sed -n -e 'p'  $file_one` | sed -n -e 's/;*[[:blank:]]\{1\}/;\n/gp' | sed -n -e 's,'${PWD}'/,,p' >> $file_two
13 
14 echo `sed -n -e 'p' $file_two` | sed -n -e 's/;[[:blank:]]*/\n/gp' | sed -n -e 's/\(.*\):\([0-9]*\):\(.*\)[[:blank:]]*([[:blank:]]*\(.*\)[[:blank:]]*)$/\3  \4  \1 +\2/p' | awk '{printf "%-20s %-30s\t%s %s\n", $1, $2, $3, $4}' | sort -d -k1 | uniq 
15 
16 rm $file_one
17 rm $file_two

在sound下试了,列举出来的太多,做了删除,大概只有10几个module_init,根据脚本运行的结果,结合makefile,可以断定一个驱动文件夹下的函数执行流程,
在makefile中靠前编译生成的文件,在链接时位于参数列表中的位置也靠前,因此位于同一个section的位置也靠前,因此对于module_init之类的根据section来启动的流程模块,其必定被先执行。

 

2014-12-20 重新写了个脚本,修正错误+引入__setup

version_two:

#! /bin/bash                                                                                                                      

file_one=/tmp/Jerry.post0.$$
file_two=/tmp/Jerry.post1.$$

find $1 -name "*.c" -o -name "*.h" | cut -d '/' -f 2- | xargs -I '{}' grep "^ *\(early_initcall\|pure_initcall\|core_initcall\|core_initcall_sync\|postcore_initcall\|postcore_initcall_sync\|arch_initcall\|arch_initcall_sync\|subsys_initcall\|subsys_initcall_sync\|fs_initcall\|fs_initcall_sync\|rootfs_initcall\|module_init\|__initcall\|device_initcall\|device_initcall_sync\|late_initcall\|late_initcall_sync\|__setup(\)" '{}' -rnH | awk 'BEGIN{FS=":";OFS="****"}{print $1, $2, $3}' | sort -k1 -d | awk 'BEGIN{FS="****"} {print $3, $1, $2}' | awk 'BEGIN{FS=";"}{print $1, $2}' | awk 'BEGIN{FS="("}{printf "%-25s %-50s\n", $1,$2}' | awk 'BEGIN{FS=")"}{printf "%-75s %-50s\n", $1, $2}' > ${file_one}

search_string="__setup \
               early_initcall \
               pure_initcall \
               core_initcall \
               core_initcall_sync \
               postcore_initcall \
               postcore_initcall_sync \
               arch_initcall \
               arch_initcall_sync \
               subsys_initcall \
               subsys_initcall_sync \
               fs_initcall \
               fs_initcall_sync \
               rootfs_initcall \
               module_init \
               __initcall \
               device_initcall \
               device_initcall_sync \
               late_initcall \
               late_initcall_sync"

search_array=(${search_string})
search_size=${#search_array[@]}
search_index=0
while [ ${search_index} -ne ${search_size} ]
do
    search_string=${search_array[search_index]}
    grep "^${search_string}"  ${file_one} >> ${file_two}
    search_index=$((${search_index}+1))
done

cat ${file_two}
rm -f ${file_one} ${file_two}

 

 

posted on 2013-02-03 14:17  阿加  阅读(369)  评论(0)    收藏  举报

导航