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

ARMv9 아키텍처 진화와 실행 모델

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

ARMv9라는 이름만으로 특정 명령을 지금 실행할 수 있다고 판단할 수는 없습니다. CPU 구현, 여러 CPU가 공유할 수 있는 기능, 커널 설정, 사용자 ABI를 순서대로 확인해야 합니다. 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행입니다. 아래에 이 범위의 원문과 각 줄의 설명을 실었습니다. 주제 전체의 흐름과 다른 경로는 기존 분석에서 함께 읽으실 수 있습니다.

먼저 알아둘 개념

아키텍처와 구현

아키텍처는 명령과 상태의 규칙이고 CPU 제품은 그 규칙과 선택 기능을 실제로 구현한 것입니다.

HWCAP

커널이 사용자 프로그램에 공개하는 기능 비트입니다. CPU 이름을 문자열로 추측하는 방법보다 ABI에 맞게 판단할 수 있습니다.

시스템 공통 기능

이질적인 CPU 사이를 task가 이동할 수 있으므로 한 CPU의 기능과 시스템에서 안전하게 공개할 기능은 다를 수 있습니다.

처음 읽을 때

규격·CPU·커널·프로그램을 네 줄로 나누어 어떤 층이 무엇을 보장하는지 설명하십시오.

더 깊이 살펴볼 때

CPU hotplug와 기능 검증 시점, system capability와 ELF HWCAP의 차이를 검토하십시오.

그림으로 보는 변화

ARMv9 아키텍처 진화와 실행 모델의 단계별 개념 그림
각 단계에 화살표 의미와 생략 범위를 표시했습니다. 주소·숫자 예제는 실제 장치 값을 뜻하지 않습니다.
1단계 설명

1단계 고정

GIF 원본 열기

1. CPU 기능 수집

커널이 기능 레지스터와 플랫폼 정보를 확인합니다.

화살표는 기능 정보 수집입니다.

2. 시스템 정책 결정

공개할 기능 비트를 elf_hwcap에 기록합니다.

이 단계는 명령 실행이 아니라 사용 가능성의 표명입니다.

3. 프로그램에 제공

HWCAP 조회로 프로그램이 알맞은 구현을 선택합니다.

프로그램이 CPU 이름 대신 ABI를 사용하도록 연결합니다.

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가 담당합니다.

함께 생각해 볼 질문

ARMv9 CPU면 모든 ARMv9 문서 기능이 있습니까?

아닙니다. 세부 버전과 선택 기능, 구현을 확인해야 합니다.

컴파일러가 명령을 만들면 커널도 지원합니까?

별개 조건입니다. 하드웨어와 운영체제의 상태 관리·ABI 지원을 확인해야 합니다.

이 소스가 ARMv9.7 전체 지원을 증명합니까?

아닙니다. v6.18.37에서 실제 구현된 기능 공개 경로의 예입니다.

출처와 읽은 범위

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

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

맨 위로 ↑