内核源码中遇到不会解析的宏怎么办?

本文涉及的产品
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
简介: 内核源码中遇到不会解析的宏怎么办?

在分析内核源码的时候,会碰到各种奇怪的宏定义,凭自己脑子分析,感觉完全转不过来,不得不感叹C语言确实强大。

废话少说,下面给出一个实例

分析uboot的时候,遇到这种宏,完全懵逼

下面给出具体的解决过程

1、找到在哪里引用这个宏的

2、将宏定义和引用宏的代码放到一个C文件

3、gcc xxx.c -E -o xxx.i进行预处理

 

源码是这样的

/*
遇到不会解析的宏如何做?
*/
 
struct cmd_tbl_s {
  char    *name;    /* Command Name     */
  int   maxargs;  /* maximum number of arguments  */
  int   repeatable; /* autorepeat allowed?    */
          /* Implementation function  */
  int   (*cmd)(struct cmd_tbl_s *, int, int, char *[]);
  char    *usage;   /* Usage message  (short) */
  char    *help;    /* Help  message  (long)  */
 
  /* do auto completion on the arguments */
  int   (*complete)(int argc, char *argv[], char last_char, int maxv, char *cmdv[]);
 
};
 
typedef struct cmd_tbl_s  cmd_tbl_t;
 
#define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) \
cmd_tbl_t __u_boot_cmd_##name Struct_Section = {#name, maxargs, rep, cmd, usage, help}
 
 
 
int do_bootd (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
  int rcode = 0;
 
  if (run_command (getenv ("bootcmd"), flag) < 0) rcode = 1;
 
  if (parse_string_outer(getenv("bootcmd"),
    FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP) != 0 ) rcode = 1;
 
  return rcode;
}
 
U_BOOT_CMD(
  boot, 1,  1,  do_bootd,
  "boot    - boot default, i.e., run 'bootcmd'\n",
  NULL
);
 
 
int main(void)
{
  return 0;
}

预处理之后的代码

# 1 "test.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "test.c"
 
 
 
 
struct cmd_tbl_s {
 char *name;
 int maxargs;
 int repeatable;
 
 int (*cmd)(struct cmd_tbl_s *, int, int, char *[]);
 char *usage;
 char *help;
 
 int (*complete)(int argc, char *argv[], char last_char, int maxv, char *cmdv[]);
 
};
 
typedef struct cmd_tbl_s cmd_tbl_t;
 
 
 
 
 
 
int do_bootd (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
 int rcode = 0;
 
 if (run_command (getenv ("bootcmd"), flag) < 0) rcode = 1;
 
 if (parse_string_outer(getenv("bootcmd"),
  FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP) != 0 ) rcode = 1;
 
 return rcode;
}
 
cmd_tbl_t __u_boot_cmd_boot Struct_Section = {"boot", 1, 1, do_bootd, "boot    - boot default, i.e., run 'bootcmd'\n", NULL}
 
 
 
 ;
 
 
int main(void)
{
 return 0;
}


相关文章
|
5天前
|
存储 物联网 调度
操作系统的心脏:内核深度解析
在数字世界的构建中,操作系统扮演着基石的角色,而其核心—内核,则是这一复杂系统的灵魂。本文将深入探讨操作系统内核的工作原理,揭示它是如何管理硬件资源、运行程序以及提供系统服务的。通过理解内核的结构和功能,我们可以更好地把握计算机系统的运作机制,进而优化和创新我们的技术实践。
|
3天前
|
算法 Linux 定位技术
Linux内核中的进程调度算法解析####
【10月更文挑战第29天】 本文深入剖析了Linux操作系统的心脏——内核中至关重要的组成部分之一,即进程调度机制。不同于传统的摘要概述,我们将通过一段引人入胜的故事线来揭开进程调度算法的神秘面纱,展现其背后的精妙设计与复杂逻辑,让读者仿佛跟随一位虚拟的“进程侦探”,一步步探索Linux如何高效、公平地管理众多进程,确保系统资源的最优分配与利用。 ####
24 4
|
4天前
|
缓存 负载均衡 算法
Linux内核中的进程调度算法解析####
本文深入探讨了Linux操作系统核心组件之一——进程调度器,着重分析了其采用的CFS(完全公平调度器)算法。不同于传统摘要对研究背景、方法、结果和结论的概述,本文摘要将直接揭示CFS算法的核心优势及其在现代多核处理器环境下如何实现高效、公平的资源分配,同时简要提及该算法如何优化系统响应时间和吞吐量,为读者快速构建对Linux进程调度机制的认知框架。 ####
|
7天前
|
消息中间件 缓存 安全
Future与FutureTask源码解析,接口阻塞问题及解决方案
【11月更文挑战第5天】在Java开发中,多线程编程是提高系统并发性能和资源利用率的重要手段。然而,多线程编程也带来了诸如线程安全、死锁、接口阻塞等一系列复杂问题。本文将深度剖析多线程优化技巧、Future与FutureTask的源码、接口阻塞问题及解决方案,并通过具体业务场景和Java代码示例进行实战演示。
26 3
|
24天前
|
存储
让星星⭐月亮告诉你,HashMap的put方法源码解析及其中两种会触发扩容的场景(足够详尽,有问题欢迎指正~)
`HashMap`的`put`方法通过调用`putVal`实现,主要涉及两个场景下的扩容操作:1. 初始化时,链表数组的初始容量设为16,阈值设为12;2. 当存储的元素个数超过阈值时,链表数组的容量和阈值均翻倍。`putVal`方法处理键值对的插入,包括链表和红黑树的转换,确保高效的数据存取。
50 5
|
26天前
|
Java Spring
Spring底层架构源码解析(三)
Spring底层架构源码解析(三)
|
26天前
|
XML Java 数据格式
Spring底层架构源码解析(二)
Spring底层架构源码解析(二)
|
26天前
|
算法 Java 程序员
Map - TreeSet & TreeMap 源码解析
Map - TreeSet & TreeMap 源码解析
31 0
|
26天前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
60 0
|
26天前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
49 0

推荐镜像

更多