最近、私は JOS カーネル (私のような初心者を支援するために主に学習目的で 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; \
})
上記の構造に関して 2 つの質問があります。
PADDR(nextfree)
上記のように変数をvar=PADDR(nextfree)
直接呼び出すのではなく、変数に値を割り当てるべきではありませんか。それはどのようにうまくいくでしょうか?把握しやすい指定されたタスクの関数を作成するよりも、ヘッダー ファイルにそのような小さくて複雑な定義を記述することを好む人がいるでしょうか。