Linux 커널 이미지를 빌드할 때 값을 설정합니다 HZ
. 리눅스 커널에는 기본값이 있습니다 HZ
. 커널이 실행되는 소프트웨어 클럭 주파수이며 1/HZ (=jiffies)
스케줄러 간격의 단위입니다. 물론, 이는 HZ
인터럽트를 생성하는 실제 하드웨어 타이머에서 나와야 합니다. 그래서 내 질문은 다음과 같습니다. HZ
커널 이미지를 빌드할 때 설정할 수 있지만 이 타이머 인터럽트를 생성하는 실제 클럭 주파수를 적용하려면 어떤 CONFIG 값을 변경해야 합니까(특히 arm64의 경우)? 일부 FPGA 보드는 더 낮은 클럭 주파수에서 실행될 수 있고 이는 하드웨어 설계에 따라 다르기 때문에 CONFIG 값이 있어야 한다고 생각합니다. 이 구성 값이 올바르지 않으면 250MHz는 실제 250MHz가 아닙니다. 어떤 CONFIG 값을 변경해야 합니까?
답변1
정반대입니다. 인터럽트 속도는 CONFIG_HZ 값을 기반으로 시스템에 의해 프로그래밍됩니다.
HZ는 주파수입니다.시스템 타이머하드웨어는 코어를 중단하도록 프로그래밍되어 있습니다.
팔 활에,ARM 글로벌 타이머이 목적으로 사용됩니다. 비교기에 의해 주어진 결과에 따라 인터럽트를 트리거합니다. 그 시계는 다음과 같이 구성되어 있습니다주변시계하지만 고마워요타이머 프레임워크, 그러면 HZ 값과 동기화할 필요가 없습니다(또는 추가 값도).
답변2
변경해야 HZ
하지만 100Hz, 250Hz, 300Hz 또는 1kHz를 원하지 않으면 땜질해야 합니다.kernel/Kconfig.hz
다른 값도 허용됩니다. , 또는 HZ
에서 파생된 현재 커널 구성의 경우 다른 값 을 수동으로 지정하면 빌드에서 이 네 가지 값 중 하나를 선택해야 합니다.HZ_100
HZ_250
HZ_300
HZ_1000
답변3
예, 다른 사람들이 답변했듯이 타이머는 커널 구성의 HZ 값을 기반으로 필요한 인터럽트(또는 더 높은 해상도)를 생성하도록 프로그래밍되어 있습니다. 하지만 내 질문은 카운터의 실제 클럭 주파수를 전달하는 방법입니다. 예를 들어, 클록 주파수가 25MHz이고 코어가 HZ_250으로 설정된 경우 클록은 100,000 클록마다 실행되도록 프로그래밍됩니다(25MHz/250Hz = 100,000이기 때문). 그러나 클럭 주파수가 20Mhz인 경우 80,000 클럭마다 트리거(인터럽트 만료 및 생성)하도록 프로그래밍해야 합니다.
커널 소스 코드를 살펴본 결과 장치 트리가 실제 클럭 주파수(보드마다 또는 칩마다 다름)를 제공하는 경우 커널은 dtb(장치 트리 blob)에서 제공한 값을 사용한다는 것을 발견했습니다. 호환성 문자열) "arm, armv8-timer"가 카운터인 것 같습니다). 그렇지 않은 경우 커널은 시스템 레지스터 cntfreq_el0 레지스터를 읽고 u-boot 프로그램이 u-boot 프로그래머가 제공한 값을 설정하는 것을 확인합니다(구성 헤더 파일에서 이는 보드에 완전히 종속되므로). start_kernel()의 time_init() 함수가 이 작업을 수행하는 것 같습니다. time_init() 이전에는 타이머 소프트 인터럽트를 등록하기 위한 Tick_init() 및 init_timers() 함수가 있습니다. (타이머의 실제 설정은 나중에?) 잘 모르겠지만 이것이 내 원래 질문에 대한 답인 것 같습니다.