最近,我正在查看 JOS Kernel 的代码(在 MIT 开发,主要是为了帮助像我这样的初学者)并提出了一个小疑问,我认为这可能是微不足道的,但无法弄清楚,所以在这里发帖寻求帮助。 .
这是来自“.c”文件的一小段代码:-
if(n>0)
{
nextfree = ROUNDUP((char *) nextfree, PGSIZE);
result=nextfree;
nextfree+=n;
PADDR(nextfree);
}
对应的“.h”文件:-
/* This macro takes a kernel virtual address -- an address that points above
* KERNBASE, where the machine's maximum 256MB of physical memory is mapped --
* and returns the corresponding physical address. It panics if you pass it a
* non-kernel virtual address.
*/
#define PADDR(kva) \
({ \
physaddr_t __m_kva = (physaddr_t) (kva); \
if (__m_kva < KERNBASE) \
panic("PADDR called with invalid kva %08lx", __m_kva);\
__m_kva - KERNBASE; \
})
现在我对上述结构有两个问题-
我们不应该
PADDR(nextfree)
为某个变量赋值,var=PADDR(nextfree)
而不是像上面那样直接调用它。它将如何运作?为什么有人更愿意在头文件中编写如此小而复杂的定义,而不是为指定任务创建一个易于掌握的函数。