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"

관련 정보