내 질문은 요즘 일부 운영 체제 이벤트 처리가 여전히 C와 같은 고급 언어 대신 어셈블리 언어로 작성되는 반면 커널 자체는 대부분 C로 작성되는 이유입니다.
답변1
언어는 CPU 레지스터에 대한 액세스를 추상화하고 운영 체제는 이벤트를 처리할 때 컨텍스트를 저장해야 하므로 이벤트가 발생할 때 레지스터에 액세스해야 하므로 C 사양을 위반합니다.
답변2
C는 기계에서 실행되는 기계 코드의 추상화입니다(비록 대부분의 다른 언어보다 가깝지만).
C 언어로 표현할 수 없고 C 컴파일러 어셈블리에서 제공하지 않는 추가 최적화를 사용할 수 있는 기계어 명령문의 경우 주로 다음 형식을 사용합니다.인라인 어셈블러.
커널 소스 트리에서는 특정 아키텍처 이름으로 저장됩니다 arch/<arch>
. 실제로는 전체 커널 소스 코드의 작은 부분일 뿐입니다.include/asm-<arch>
<arch>
답변3
C에서는 이것을 할 수 없습니다 :)
lgdt[xxxx]
mov eax, cr0
or al, 0x01
mov cr0, eax
x86 보호 모드로 들어가려고 합니다. 분명히 원시 기계 코드를 "내보냄"으로써 C에서 이 작업을 수행할 수 있지만 여전히 정확한 오프셋에 액세스해야 하는 경우를 대비해 대부분 운이 좋지 않습니다.
두 번째 예는 BootLoader입니다. x86 시스템에서 기존 부팅 코드의 길이는 정확히 512바이트여야 하며 마지막 2바이트는 0xAA 및 0x55(또는 정확히 55 AA)입니다... C 컴파일러가 이러한 것을 구현하도록 보장하는 것은 악몽입니다. , 그리고 어셈블러는 이를 훌륭한 방법으로 수행해야 합니다.
이러한 경우 대부분의 경우 리깅은 첫 번째 선택일 뿐만 아니라 유일한 수단입니다.
답변4
asm은 C 라이브러리와 같은 쓰레기보다 일반적으로 더 얇고 일반적으로 훨씬 빠르며 운영 체제는 항상 많은 이벤트를 처리합니다. 이를 위해서는 얇고 빠른 것이 필요합니다.