执行阶段段修饰符号,查看执行流程
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}
浙公网安备 33010602011771号