Articles of macros

在Linux内核中,头包含错误

当我在内核的源代码中包含“asm / xen / hypercall.h”时, 我收到了这个错误信息。 我该如何解决? include/linux/stddef.h:8:16: error: expected identifier or '(' before 'void' #define NULL ((void *)0) ^ ./arch/x86/include/asm/alternative.h:221:28: note: in expansion of macro 'NULL' #define __parainstructions NULL ^ ./arch/x86/include/asm/paravirt_types.h:703:35: note: in expansion of macro '__parainstructions' extern struct paravirt_patch_site __parainstructions[], ^ include/linux/stddef.h:8:23: error: expected ')' before numeric constant #define NULL ((void *)0) ^ […]

如何将macros应用于vim列表

让我们假设我想要应用存储在寄存器1上的macros:2,5,9,但是不需要在两者之间应用。 我看到你可以给出一个范围,但这不是我想要的。 我已经尝试了一些变化:2,5,9 @ 1没有成功

Linux内核中的IS_ALIGNEDmacros是做什么的?

我一直在试图读取一个内核模块的实现,而我正在绊倒这段代码。 unsigned long addr = (unsigned long) buf; if (!IS_ALIGNED(addr, 1 << 9)) { DMCRIT("@%s in %s is not sector-aligned. I/O buffer must be sector-aligned.", name, caller); BUG(); } IS_ALIGNEDmacros在内核源代码中定义如下: #define IS_ALIGNED(x, a) (((x) & ((typeof(x))(a) – 1)) == 0) 我知道数据必须按照数据types的大小alignment才能工作,但我仍然不明白代码的作用。 它左移1乘9,然后减1,得到111111111.然后111111111按位和用x。 为什么这个代码工作? 这是如何检查字节alignment?

将“getter”函数replace为macros查找

问题 我试图通过大型平台抽象库(PAL)将多个基于硬件的产品移植到资源有限(即千字节计数 )的小型embedded式系统中。 目前的PAL有一个简单的getRegister()函数,它返回一个特定产品的寄存器地址。 例如,假设产品名为coconut和pineapple ,代码将如下所示: #include "headers/Include/coconut.h" #include "headers/Include/pineapple.h" enum prodType { PROD_COCONUT = 0, PROD_PINEAPPLE, PROD_MAX, PROD_INVALID = (-1) }; uint64_t getRegister(enum prodType prod, int regName) { uint64_t r = 0; switch (prodType) { case PROD_COCONUT: switch (regName) { case REG_BASE: r = COCONUT_REG_BASE; break; case REG_CORE: r= COCONUT_REG_CORE; break; } break; case […]

从编译的二进制文件获得macros值(带debugging)

我需要确定二进制编译的特定macros的值。 该文件是一个Linux共享库文件。 可能吗?

Vim:如何使用.config来调暗未编译的行

当在Vim中读取linux内核源代码时,是否有任何方式告诉编辑器在某个位置有一个.config文件,并且是使macros保护内的线条变暗,导致它不被编译成内核? 如果不是的话,在阅读源代码时你会怎样解决这个问题呢? 我使用Vim,ctags和cscope,但是最终我没有注意到那些没有注意到macros保护的代码,这些代码并没有被编译到最终的二进制图像中。 有没有办法避免这种情况? [编辑] 作为一个例子, .config文件可以说我有以下configuration值。 … CONFIG_TEST_BLAH … 后来,在我有一个C文件中: – #ifdef CONFIG_TEST_BLAH void test () { … … } #else void test() { … … } #endif 在这种情况下,我希望#else块内的代码块的内容或颜色不同,以便我知道它没有被编译到最终的内核映像中。 [编辑2] 我相信像Visual Studio这样的编辑器允许这样的事情发生,我想知道是否有办法用vim来做到这一点。

在ACmacros中,“。”和“*”是什么意思?

从这里是什么. 和*意味着交streammacros? 583 #define INITCALLS \ 584 *(.initcallearly.init) \ 585 VMLINUX_SYMBOL(__early_initcall_end) = .; \ 586 *(.initcall0.init) \ 587 *(.initcall0s.init) \ 588 *(.initcall1.init) \ 589 *(.initcall1s.init) \ 590 *(.initcall2.init) \ 591 *(.initcall2s.init) \ 592 *(.initcall3.init) \ 593 *(.initcall3s.init) \ 594 *(.initcall4.init) \ 595 *(.initcall4s.init) \ 596 *(.initcall5.init) \ 597 *(.initcall5s.init) \ 598 *(.initcallrootfs.init) \ 599 *(.initcall6.init) […]

Linux内核FIELD_SIZEOFmacros的说明

我正在学习c99,在阅读了关于结构之后,我在Linux内核代码中发现了以下macros: #define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f)) 我..什么? 用法: #include <stdio.h> #define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f)) struct book { char title[100]; char author[100]; }; int main(void) { printf("%lu\n", FIELD_SIZEOF(struct book, title)); // prints 100 } 这是扩展(gcc -E) printf("%lu\n", (sizeof(((struct book*)0)->title))); 真让我困惑的是0 。 我用2 , +1 , -1 , +1 +999和'a'和"hello"取代了它, 它总是有效的 。 来源方面没有任何评论。 我知道->是用来通过指针访问一个结构成员,但是如何((struct book*)0)是一个指针? macros如何工作?

如何在linux C内联汇编中使用macros

我想调用一个由其他configuration结果决定的地址。 这个调用是在一个内联程序集中。 目前,它是这样的,是手动修改: asm volatile ("call 0xc0200c20\n\t"); 我的问题是我可以这样写吗? #define CALL_ADDR 0xC0200c20 asm volatile ("call CALL_ADDR\n\t"); 谢谢!

在C代码中,((t *)0) – > f)是做什么的?

我在C(Linux)代码中看到了以下奇怪types的macros: #define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f)) ((t*)0)->f)做什么? 它是如何工作的?