4.9 Linuxカーネルのソースコードでは、PageWritebackはどこで定義されていますか?

4.9 Linuxカーネルのソースコードでは、PageWritebackはどこで定義されていますか?

4.9でPageWritebackを検索する結果は「未定義の識別子」ですが、 2.6.25の検索ページの書き込み保存そこに定義されていることを示してください。

4.9で使用されていますが、なぜPageWriteback定義が見つかりませんか?

答え1

これは(他の多くのPageXXXエントリと共に)で定義されていますが、include/linux/page-flags.hマクロの使用によりその定義があいまいになりました。TESTPAGEFLAG上記のファイルのマクロを参照してください。

特に、TESTPAGEFLAG マクロ定義:

#define TESTPAGEFLAG(uname, lname, policy)              \
static __always_inline int Page##uname(struct page *page)       \
    { return test_bit(PG_##lname, &policy(page, 0)->flags); }

これと組み合わせる書き込み保存パラメータを使用したTESTPAGEFLAG呼び出し:

TESTPAGEFLAG(Writeback, writeback, PF_NO_COMPOUND)

答え2

この一般的な質問が私を悩ませていたので、Linuxカーネルでランダムな識別子を見つける方法に答えを追加したいと思いました。

カーネルソースバージョンをダウンロードし(またはディストリビューションのlinux-kernelソースパッケージをインストールして)、解凍します。

wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.9.39.tar.xz
tar xf linux-4.9.39.tar.xz
cd linux-4.9.39

コンパイル可能なカーネルを作成するために、最小限の.configを作成します。

make menuconfig # just exit and save

主なステップ:カーネルのコンパイル-save-temps中間プリプロセッサフ​​ァイルを保存するには、gccフラグを使用してください。

make KCFLAGS=-save-temps

コンパイルプロセスは*.iファイルを現在のディレクトリに配置します。比較のために、その識別子が定義されているファイルを見つけます。ここでは同じ識別子を選択しましたが、ファイル名が好きなので、他の識別子に対してもプロセスが機能します。

grep PageWriteback *.i
...
zbud.i:static inline __attribute__((no_instrument_function)) __attribute__((always_inline)) int PageWriteback(struct page *page) { return (__builtin_constant_p((PG_writeback)) ? constant_test_bit((PG_writeback), (&({ ((void)(sizeof(( long)(0 && PageCompound(page))))); page;})->flags)) : variable_test_bit((PG_writeback), (&({ ((void)(sizeof(( long)(0 && PageCompound(page))))); page;})->flags))); }
...

確認するファイルを開き、問題の識別子までスクロールし、次にファイルから始まる行を上下に検索して、定義がどこから来たかを確認します#

# 255 "./include/linux/page-flags.h"

これは私たちに次のことを示します。Nickが以前に見つけたのと同じソースファイル

あるいは、識別子および/または識別子を含む行を検索して末尾の行を削除すると、出力の最後の行が識別子を定義するファイルになります。

grep -E '^# |PageWriteback' zbud.i | sed '/PageWriteback/,$d' | tail -n 1
...
# 74 "./include/linux/page-flags.h"
# 108 "./include/linux/page-flags.h"
# 255 "./include/linux/page-flags.h"

関連情報