Linux 커널의 코드 대부분이 C로 작성되었지만 해당 코드의 일부는 여전히 실행중인 플랫폼에 따라 다르며이를 처리해야합니다.
이 중 하나의 특정 예는 대부분의 아키텍처 (페이지 테이블의 계층 구조)에서 유사한 방식으로 작동하지만 각 아키텍처에 대한 특정 세부 사항 (예 : 각 아키텍처의 레벨 수)이있는 가상 메모리이며 x86에서도 증가하고 있습니다. 리눅스 커널 코드는 페이지 테이블 레벨이 더 적은 아키텍처 (컴파일러는 C로 작성되지만 아키텍처의 세부 사항은 고려.)
다른 많은 영역은 각 아키텍처에 따라 매우 다르며 아치 별 코드로 처리해야합니다. 그러나 대부분은 어셈블리 언어의 코드와 관련이 있습니다. 예를 들면 다음과 같습니다.
컨텍스트 전환 : 컨텍스트 전환은 전환중인 프로세스에 대한 모든 레지스터의 값을 저장하고 CPU에 예약 된 저장된 프로세스 세트에서 레지스터를 복원합니다. 레지스터의 수와 세트조차도 각 아키텍처에 따라 매우 다릅니다. 이 코드는 일반적으로 어셈블리에 구현되어 레지스터에 대한 전체 액세스를 허용하고 컨텍스트 전환 성능이 시스템에 중요하기 때문에 가능한 빨리 실행되도록합니다.
시스템 호출 : 사용자 공간 코드가 시스템 호출을 트리거 할 수있는 메커니즘은 일반적으로 아키텍처에 따라 다릅니다 (그리고 때로는 특정 CPU 모델, 예를 들어 인텔과 AMD에서 다른 명령을 도입 했으므로 이전 CPU에는 해당 명령이 없을 수 있음) 그것들은 여전히 독특 할 것입니다.)
인터럽트 처리기 : 인터럽트 (하드웨어 인터럽트)를 처리하는 방법에 대한 자세한 내용은 일반적으로 플랫폼별로 다르며 일반적으로 플랫폼에 사용되는 특정 호출 규칙을 처리하기 위해 어셈블리 수준의 접착제가 필요합니다. 또한 인터럽트를 활성화 / 비활성화하기위한 프리미티브는 일반적으로 플랫폼에 따라 다르며 어셈블리 코드도 필요합니다.
초기화 : 초기화 방법에 대한 세부 사항에는 일반적으로 플랫폼에 특정한 세부 사항이 포함되며 종종 커널의 진입 점을 처리하기 위해 일부 어셈블리 코드가 필요합니다. 다중 CPU (SMP)가있는 플랫폼에서 다른 CPU를 온라인 상태로 만드는 방법에 대한 자세한 내용은 일반적으로 플랫폼마다 다릅니다.
잠금 프리미티브 (Locking Primitives) : 잠금 프리미티브 (스핀 록과 같은)의 구현에는 일반적으로 플랫폼 별 세부 사항도 포함됩니다. 일부 아키텍처는이를 효율적으로 구현하기 위해 다른 CPU 명령을 제공하거나 선호하기 때문입니다. 일부는 원자 연산을 구현하고 일부는 원자 적으로 테스트 / 업데이트 할 수있는 cmpxchg를 제공하지만 (다른 기록기가 먼저 들어 오면 실패) 다른 명령은 CPU 명령에 대한 "잠금"수정자를 포함합니다. 여기에는 종종 어셈블리 코드 작성이 포함됩니다.
플랫폼에 또는 아키텍처 특정 코드가 커널에 필요한 아마 다른 지역 (특히, 또는 리눅스 커널에서.)이있다 커널 소스 트리를 보면, 아래 아키텍처 특정 하위 트리가 arch/
이하 include/arch/
더 찾을 수있는 곳이 이것의 예.
예를 들어, 각 아키텍처에서 사용 가능한 시스템 호출 수가 다르고 일부 시스템 호출은 다른 아키텍처가 아닌 일부 아키텍처에 존재한다는 것을 알 수 있습니다. x86에서도 syscall 목록은 32 비트와 64 비트 커널간에 다릅니다.
요컨대, 플랫폼에 특정한 커널을 알고 있어야하는 경우가 많이 있습니다. 리눅스 커널은 이들 대부분을 추상화하려고 시도하므로, 메모리 관리 및 스케줄링 작동 방식과 같은 고급 알고리즘을 C로 구현하고 모든 아키텍처에서 동일하게 (또는 대부분 동일하게) 작동 할 수 있습니다.