인터럽트 벡터 테이블에만 추가되지 않고 시스템 호출 테이블이 있는 이유는 무엇입니까? 여기서 디자인 선택을 이해하지 못합니다. 이벤트 구별 성능이 향상된다면 시스템 호출은 왜 안 될까요?
답변1
나는 몇 가지 이유로 i386의 시스템 호출에 단일 인터럽트(0x80)를 사용하는 역사적 배경을 조사하지 않았습니다.아니요각 시스템 호출에 대해 별도의 소프트웨어 인터럽트를 사용하십시오.
- 소프트웨어 인터럽트 수가 제한되어 시스템 호출 수가 제한됩니다(x86에서는 다른 목적을 위해 많은 인터럽트 설명자 테이블 항목이 필요합니다). 이제 소프트웨어 인터럽트를 사용하는 대부분의 아키텍처가 지원할 수 있는 것보다 더 많은 시스템 호출이 있습니다.
- 상당수의 아키텍처에는 소프트웨어 인터럽트(또는 이에 상응하는 항목)를 사용하지 않는 전용 시스템 호출 명령어가 있습니다. 여기에는 x86-64가 포함됩니다.전용
SYSCALL
명령어가 소프트웨어 인터럽트보다 더 빠른 시스템 호출 액세스를 제공하는 경우.man 2 syscall
각 아키텍처에 대한 시스템 호출 규칙에 대한 세부 정보가 제공됩니다.
ARM/OABI 아키텍처의 세부 사항을 살펴보면 시스템 호출 번호가 명령어에 인코딩되어 있기 때문에 인터럽트 테이블이 사용된다고 생각할 수 있습니다.해당 지침고정된 소프트웨어 인터럽트가 실행되고 인코딩된 숫자는 무시되며 시스템 호출 처리기는 명령어 자체에서 숫자를 검색합니다. EABI는 캐시 오염을 초래했기 때문에 이 접근 방식을 포기했습니다(최신 ARM CPU에는 별도의 명령어와 데이터 캐시가 있음).
답변2
먼저 x86(-64)을 지원합니다.256개 항목 인터럽트 테이블, 그 중 일부는 실제 하드웨어 인터럽트에 사용됩니다. 처음부터 계산매뉴얼 페이지는 syscalls(2)
여기에 있습니다, Linux에는 400개 이상의 다양한 시스템 호출이 있습니다. 모든 아키텍처에 존재하는 것은 아니지만다른 목록, x86-64에는 314개의 서로 다른 시스템 호출(0~313)이 있습니다. 따라서 적어도 x86 기반 Linux의 경우 각 시스템 호출에 대해 서로 다른 인터럽트 번호를 예약할 방법이 없는 것 같습니다.
물론 x86이 유일한 아키텍처는 아닙니다. 다른 것들은 사용 가능한 소프트웨어 인터럽트가 더 적거나 하드웨어 인터럽트와 별도로 시스템 호출 경로가 완전히 다를 수 있습니다. 실제로 최신 x86(-64)에는 이미 다음과 같은 별도의 경로가 있습니다.SYSCALL 및 SYSENTER 명령어:
SYSENTER/SYSEXIT 명령(및 AMD의 동등한 SYSCALL/SYSRET)은 커널에 대한 빠른 액세스를 제공하여 인터럽트 오버헤드를 방지합니다.
커널에 대한 단일 진입점만 사용하는 또 다른 가능한 이유는 특정 시스템 호출과 관계없이 사용자 공간/커널 전환과 관련된 강제 배열 때문입니다. 일부 상태를 저장해야 하거나 스택을 전환해야 할 수도 있습니다. 이러한 작업은 아키텍처 및 시스템 설계의 특정 기능에 따라 달라지지만, 이러한 작업을 수행해야 하는 경우 한 곳에서 완료하는 것이 더 쉬울 수 있습니다. (특히 이러한 낮은 수준의 작업은 새 컨텍스트에서 함수 호출이 이루어지기 전에 가장 먼저 수행되어야 할 수 있기 때문입니다.)
위 내용의 대부분은 추측에 불과합니다. 저는 x86 이외의 아키텍처(범용 운영 체제를 실행하지 않는 일부 아키텍처 제외)에 전혀 익숙하지 않으며 Linux 시스템도 본 적이 없습니다. 호출은 매우 엄격하게 구현되었으며 다른 작업 시스템은 말할 것도 없습니다. 더 낮은 수준의 세부 정보가 필요하면 다른 사람이 제공할 수 있기를 바랍니다.