找回密码
 注册
关于网站域名变更的通知
查看: 263|回复: 1
打印 上一主题 下一主题

便于阅读的linux内核代码预处理

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-2-6 09:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x

3 O" @3 q9 Y4 q* a0 Tlinux 内核庞大而复杂。内核代码阅读的时候,有没有遇到因为宏定义或者inline层次太深而不知道到底代码是什么样子。代码预处理可以解决这个难题。1 B: f9 c/ S7 a8 Y5 w

2 ?' Q* p! G. p% W& D% g平台:linux 3.4.5 ARM,PC linux上类似,更简单些。
+ J" f5 B$ u3 B7 E7 {, ^
! N1 H$ a& W$ {5 L1 p6 O6 \加V=1重新编译内核1 H/ r4 H1 ]7 m0 J# S) }
  L5 q& Y' c3 q( S% |4 R+ n
make内核增加V=1选项,会详细打印编译过程,-B是要求重新编译内核所有模块。' G# R* i5 r  D) m
5 i! s1 W, q% C' m; _/ B) I
  • cd linux-3.4.5 && make ARCH=arm defconfig && make ARCH=arm CROSS_COMPILE=arm-buildroot-linux-uclibcgnueabi- EXTRAVERSION=- -B V=1 uImage
    , B% E  B& C6 I& G+ H" p+ H8 a
1 ~! `4 L( I3 q& \
编译内核并保存编译log到文件,搜索你要预编译的文件,如mm/slab.c,会找到如下编译命令:; X0 u6 Y* y2 w) T
$ ?8 H; Y7 ]- y: M+ x
  • arm-buildroot-linux-uclibcgnueabi-gcc -Wp,-MD,mm/.slab.o.d  -nostdinc -isystem /home/test/build/gcc-4.9.8/build_arm/staging_dir/usr/bin/../lib/gcc/arm-buildroot-linux-uclibcgnueabi/4.9.8/include -I/home/test/linux/kernels/linux-3.4.5/arch/arm/include -Iarch/arm/include/generated -Iinclude  -include /home/test/linux/kernels/linux-3.4.5/include/linux/kconfig.h -D__KERNEL__ -mlittle-endian -Iarch/arm/mach-zx297510/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -marm -fno-dwaRF2-cfi-asm -mabi=aapcs-linux -mno-thumb-interwork -funwind-tables -D__LINUX_ARM_ARCH__=7 -march=armv7-a -msoft-float -Uarm -Wframe-larger-than=1024 -fno-stack-protector -Wno-unused-but-set-variable -fomit-frame-pointer -g -fno-inline-functions-called-once -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fconserve-stack -DCC_HAVE_ASM_GOTO    -D"KBUILD_STR(s)=#s" -D"KBUILD_BASENAME=KBUILD_STR(slab)"  -D"KBUILD_MODNAME=KBUILD_STR(slab)" -c -o mm/.tmp_slab.o mm/slab.c9 ?4 Q& w% n1 e+ p
4 F7 ]0 H4 x5 @0 f0 E
编译预处理指定文件$ Q( H) W, A) u- H/ c" k1 o& q" x
. F  _8 B( v0 F7 P) B6 A( J
把编译命令修改成预处理命令:-c -o mm/.tmp_slab.o修改成-E -o mm/slab.E mm/slab.c,在内核目录linux-3.4.5直接执行。如果是交叉编译链,可能需要把arm-buildroot-linux-uclibcgnueabi-gcc所在路径加入到环境变量PATH里。
4 A5 H% p! y2 g1 l( f% |5 a" d  A# p; Q2 m
  • arm-buildroot-linux-uclibcgnueabi-gcc -Wp,-MD,mm/.slab.o.d  -nostdinc -isystem /home/test/build/gcc-4.9.8/build_arm/staging_dir/usr/bin/../lib/gcc/arm-buildroot-linux-uclibcgnueabi/4.9.8/include -I/home/test/linux/kernels/linux-3.4.5/arch/arm/include -Iarch/arm/include/generated -Iinclude  -include /home/test/linux/kernels/linux-3.4.5/include/linux/kconfig.h -D__KERNEL__ -mlittle-endian -Iarch/arm/mach-zx297510/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -marm -fno-dwarf2-cfi-asm -mabi=aapcs-linux -mno-thumb-interwork -funwind-tables -D__LINUX_ARM_ARCH__=7 -march=armv7-a -msoft-float -Uarm -Wframe-larger-than=1024 -fno-stack-protector -Wno-unused-but-set-variable -fomit-frame-pointer -g -fno-inline-functions-called-once -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fconserve-stack -DCC_HAVE_ASM_GOTO    -D"KBUILD_STR(s)=#s" -D"KBUILD_BASENAME=KBUILD_STR(slab)"  -D"KBUILD_MODNAME=KBUILD_STR(slab)" -E -o mm/slab.E mm/slab.c
    1 H* N6 `  I! a7 h* A% l; M; n
6 z5 y3 M. Q+ ^
执行完命令,在内核的mm目录就能看到slab.c的预处理后文件slab.E文件了。看一下kmalloc函数代码,是不是清晰很多了。
5 D! D( k# x4 d- |7 w4 X& s1 B. U4 `% p, N- K, Q: ]4 M
slab_def.h里的原始kmalloc5 {  R' g0 i! y( v8 R3 W' |! f% A! \

3 A' `: X+ V0 ?' q* I
  • static __always_inline void *kmalloc(size_t size, gfp_t flags)
  • {
  •         struct kmem_cache *cachep;
  •         void *ret;
  •         if (__builtin_constant_p(size)) {
  •                 int i = 0;
  •                 if (!size)
  •                         return ZERO_SIZE_PTR;
  • #define CACHE(x) \
  •                 if (size <= x) \
  •                         goto found; \
  •                 else \
  •                         i++;
  • #include <linux/kmalloc_sizes.h>
  • #undef CACHE
  •                 return NULL;
  • found:
  • #ifdef CONFIG_ZONE_DMA
  •                 if (flags & GFP_DMA)
  •                         cachep = malloc_sizes.cs_dmacachep;
  •                 else
  • #endif
  •                         cachep = malloc_sizes.cs_cachep;
  •                 ret = kmem_cache_alloc_trace(size, cachep, flags);
  •                 return ret;
  •         }
  •         return __kmalloc(size, flags);
  • }
    - ~6 l( |, c( b6 S
     + y% g& e  v9 |. R
预处理后的kmalloc,流程是不是清晰多了。& ?% S/ R& a! L5 E

  e( _  k; c' j
  • static inline __attribute__((always_inline)) __attribute__((always_inline)) void *kmalloc(size_t size, gfp_t flags)
  • {
  • struct kmem_cache *cachep;
  • void *ret;
  • if (__builtin_constant_p(size)) {
  •   int i = 0;
  •   if (!size)
  •    return ((void *)16);
  • # 1 "include/linux/kmalloc_sizes.h" 1
  • if (size <= 32) goto found; else i++;
  • if (size <= 64) goto found; else i++;
  • if (size <= 128) goto found; else i++;
  • if (size <= 192) goto found; else i++;
  • if (size <= 256) goto found; else i++;
  • if (size <= 512) goto found; else i++;
  • if (size <= 1024) goto found; else i++;
  • if (size <= 2048) goto found; else i++;
  • if (size <= 4096) goto found; else i++;
  • if (size <= 8192) goto found; else i++;
  • if (size <= 16384) goto found; else i++;
  • if (size <= 32768) goto found; else i++;
  • if (size <= 65536) goto found; else i++;
  • if (size <= 131072) goto found; else i++;
  • if (size <= 262144) goto found; else i++;
  • if (size <= 524288) goto found; else i++;
  • if (size <= 1048576) goto found; else i++;
  • if (size <= 2097152) goto found; else i++;
  • if (size <= 4194304) goto found; else i++;
  • # 145 "include/linux/slab_def.h" 2
  •   return ((void *)0);
  • found:
  •    cachep = malloc_sizes.cs_cachep;
  •   ret = kmem_cache_alloc_trace(size, cachep, flags);
  •   return ret;
  • }
  • return __kmalloc(size, flags);
  • }) p2 L6 e0 b  b8 F
      
  • TA的每日心情

    2019-11-29 15:37
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
    发表于 2020-2-6 19:09 | 只看该作者
    便于阅读的linux内核代码预处理
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-11-24 07:38 , Processed in 0.156250 second(s), 23 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表