내 질문은 오늘날 커널 자체가 주로 C로 작성 될 때 일부 운영 체제 이벤트 처리가 C와 같은 고급 언어 대신 어셈블리 언어로 작성된 이유는 무엇입니까?
foobar()
인라인 어셈블리를 사용하여 하나의 플랫폼에서 다른 방법으로 정의 할 것입니다. 이것은 asm의 사용을 최소한으로 유지하지만 완전히 피할 수는 없습니다.
내 질문은 오늘날 커널 자체가 주로 C로 작성 될 때 일부 운영 체제 이벤트 처리가 C와 같은 고급 언어 대신 어셈블리 언어로 작성된 이유는 무엇입니까?
foobar()
인라인 어셈블리를 사용하여 하나의 플랫폼에서 다른 방법으로 정의 할 것입니다. 이것은 asm의 사용을 최소한으로 유지하지만 완전히 피할 수는 없습니다.
답변:
이 언어는 CPU 레지스터에 대한 액세스를 추상화하고 이벤트를 처리 할 때 OS가 컨텍스트를 저장해야하므로 이벤트 시점에 레지스터에 액세스해야하므로 C 스펙을 깨뜨립니다.
C에서는 이것을 할 수 없습니다 :)
lgdt[xxxx]
mov eax, cr0
or al, 0x01
mov cr0, eax
x86 보호 모드로 들어 가려고합니다. 분명히 나는 원시 기계 코드를 "방출"함으로써 여전히 C 에서이 작업을 수행 할 수 있지만 여전히 정확한 Offets에 액세스 해야하는 경우-나는 운이 좋지 않습니다.
두 번째 예는 BootLoader입니다. x86 시스템에서는 기존 부팅 코드의 길이가 정확히 512 바이트이고 마지막 두 바이트의 길이가 각각 0xAA 및 0x55 (또는 정확히 55AA) 여야합니다. 환상적인 방법으로 일하십시오.
어셈블리가 선호되는 것이 아니라 유일한 방법 인 경우가 더 많습니다.