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"