Linux v6.18.37 · 개념과 코드 읽기

ARMv9 CPU 문서·Toolchain·Linux 실전

이 코드는 어떤 문제를 푸나요?

컴파일 옵션은 어떤 명령을 만들어도 되는지를 정하지만 실제 실행 가능성을 대신 확인하지는 않습니다. 아래에서는 Linux v6.18.37가 HWCAP 비트를 보관하고 조회하는 경로를 읽습니다. 컴파일러 타깃 선택과 런타임 기능 분기를 서로 다른 단계로 설명하기 위한 예입니다.

읽을 범위: v6.18.37 · arch/arm64/kernel/cpufeature.c · cpu_set_feature / cpu_have_feature / cpu_get_elf_hwcap 3781–3800행입니다. 아래에 이 범위의 원문과 각 줄의 설명을 실었습니다. 주제 전체의 흐름과 다른 경로는 기존 분석에서 함께 읽으실 수 있습니다.

먼저 알아둘 개념

-march와 -mcpu

명령 집합 허용 범위와 CPU별 선택·최적화에 관련된 옵션입니다. 생성한 코드가 실행할 모든 기기에서 허용되는지 따져야 합니다.

런타임 분기

프로그램이 HWCAP을 보고 일반 구현 또는 선택 기능 구현을 호출하는 방식입니다.

검증 가능한 기록

커널 버전, CPU revision, 컴파일 옵션, 실제 disassembly와 HWCAP을 함께 남기면 결과를 재현할 수 있습니다.

처음 읽을 때

한 바이너리가 일반 루프와 벡터 루프를 둘 다 갖고 HWCAP으로 선택하는 예를 설명하십시오.

더 깊이 살펴볼 때

기능을 확인하기 전에 고급 명령이 실행되는 정적 초기화·인라이닝 문제도 점검하십시오.

그림으로 보는 변화

ARMv9 CPU 문서·Toolchain·Linux 실전의 단계별 개념 그림
각 단계에 화살표 의미와 생략 범위를 표시했습니다. 주소·숫자 예제는 실제 장치 값을 뜻하지 않습니다.
1단계 설명

1단계 고정

GIF 원본 열기

1. 기능 비트 기록

커널이 검증한 기능을 elf_hwcap에 설정합니다.

화살표는 커널의 기능 정보 등록입니다.

2. ABI 값 읽기

HWCAP 조회 함수가 해당 비트 묶음을 반환합니다.

이 값은 CPU 클럭이나 벡터 길이 자체가 아닙니다.

3. 코드 경로 선택

사용자 프로그램이 해당 기능용 함수를 선택합니다.

선택 화살표는 지원 조건을 만족한 뒤에만 고급 명령으로 이어집니다.

cpu_set_feature / cpu_have_feature / cpu_get_elf_hwcap를 한 줄씩 읽기

줄 번호는 v6.18.37 원문 기준입니다. 주석·빈 줄을 포함한 함수 전체를 먼저 보고, 그 아래에서 각 줄을 설명합니다.

void cpu_set_feature(unsigned int num)
{
	set_bit(num, elf_hwcap);
}

bool cpu_have_feature(unsigned int num)
{
	return test_bit(num, elf_hwcap);
}
EXPORT_SYMBOL_GPL(cpu_have_feature);

unsigned long cpu_get_elf_hwcap(void)
{
	/*
	 * We currently only populate the first 32 bits of AT_HWCAP. Please
	 * note that for userspace compatibility we guarantee that bits 62
	 * and 63 will always be returned as 0.
	 */
	return elf_hwcap[0];
}
void cpu_set_feature(unsigned int num)

커널의 사용자 기능 비트 집합에 특정 기능 번호를 등록하는 함수입니다. 기능 판별 자체는 이 함수를 부르는 경로에서 이루어집니다.

	set_bit(num, elf_hwcap);

elf_hwcap 비트 배열에서 num 위치를 1로 만듭니다. num을 하드웨어 시스템 레지스터 주소로 사용하는 것이 아닙니다.

bool cpu_have_feature(unsigned int num)

이미 등록한 기능 비트를 조회하는 커널 내부 함수를 선언합니다.

	return test_bit(num, elf_hwcap);

해당 비트의 참·거짓을 돌려줍니다. 이 조회는 실행 시마다 모든 CPU의 ID 레지스터를 새로 검사하는 동작이 아닙니다.

EXPORT_SYMBOL_GPL(cpu_have_feature);

GPL 모듈에서 cpu_have_feature 기호를 사용할 수 있도록 내보냅니다. CPU가 수행하는 일반 함수 호출은 아닙니다.

unsigned long cpu_get_elf_hwcap(void)

첫 번째 ELF HWCAP 묶음을 반환하는 함수입니다. 사용자 보조 벡터에 공개하는 경로와 연결됩니다.

	return elf_hwcap[0];

내부 비트 배열의 첫 unsigned long 값을 반환합니다. 두 번째·세 번째 묶음은 별도의 helper가 담당합니다.

함께 생각해 볼 질문

HWCAP 비트가 성능 점수입니까?

아닙니다. 기능 사용 가능성을 나타냅니다.

커널 cpu_have_feature와 libc getauxval은 같은 함수입니까?

아닙니다. 커널 내부 조회와 사용자 보조 벡터 조회라는 서로 다른 층입니다.

CPU 모델 이름만 비교해도 충분합니까?

기능·커널 ABI·배포 대상이 달라질 수 있으므로 충분하지 않습니다.

출처와 읽은 범위

Linux stable v6.18.37 · arch/arm64/kernel/cpufeature.c

해당 버전 원본 파일 · 기존 코드 분석 · 설명 원고

맨 위로 ↑