유닉스는 실제로 하나의 Softirq(int 0x80)만 사용합니까? 왜?

유닉스는 실제로 하나의 Softirq(int 0x80)만 사용합니까? 왜?

x86(32비트) 시절(sysenter/sysexit/syscall 등 이전)에는 INT 0x80이 사용자 영역 프로세스에서 커널 작업을 호출하는 데 사용되었습니다. ~에 따르면https://stackoverflow.com/questions/1817577/what-does-int-0x80-mean-in-assemble-codeDOS는 같은 목적으로 INT 0x21을 사용합니다. 동일한 소스에 따르면 x86 CPU는 최대 256개의 Softirq(0x00 - 0xff)를 이해합니다. 운영 체제는 일부 Softirq가 특수 기능에 의해 차단되더라도 여러 개의 Softirq를 사용할 수 있어야 합니다. 그러나 어떤 운영 체제도 이를 수행하지 않는 것 같습니다. 하나만 사용하나요? 이 디자인 결정의 이유는 무엇입니까?

답변1

모든 시스템 호출에 대한 Softirq가 충분하지 않으므로 시스템 호출을 식별하는 매개변수가 필요합니다. 시스템 호출에 2차원 번호를 부여할 이유가 없습니다. 그럼에도 불구하고 모든 소프트웨어 인터럽트는 유사하며 특정 유형의 시스템 호출에 더 적합한 소프트웨어 인터럽트는 없습니다.

답변2

Linux를 기반으로 하는 Unix는 특별히 인터럽트를 사용하도록 설계되지 않았습니다.

x86 아키텍처에서 인터럽트를 호출하면 링 0에서 실행이 발생합니다. 실제로 시스템 호출은 실제로 기존 컨텍스트를 사용하고 시스템 호출의 첫 번째 레지스터(EAX)에 설정된 스레드 상태만 저장합니다. 다른 레지스터는 시스템 호출의 다른 피연산자입니다. 왜 휴대성이 좋은지 알게 될 것입니다.

이 단계를 건너뛰면 2~3개의 니모닉을 저장할 수 있습니다. 모든 시스템 호출을 인터럽트로 참조하면 코드를 이식할 수 없게 되며, 256개 이상의 시스템 호출이 필요한 경우에도 그러한 시스템을 사용해야 합니다. x86의 소프트웨어 인터럽트는 IVT(인터럽트 벡터 테이블)의 하드웨어 인터럽트 주소와 공유됩니다. 따라서 특히 특정 하드웨어 구성에서 이를 사용하는 아이디어는 전적으로 가능합니다.

여러 개의 Softirq를 추가하면 캐시 누락 가능성이 높아집니다. 대략 유사한 인터럽트 처리기 코드가 서로 다른 메모리 영역에서 로드되어야 하기 때문입니다.

관련 정보