왜 일부 운영 체제 이벤트 처리가 c 대신 asm으로 작성됩니까? 운영 체제 이벤트 처리가 C와

내 질문은 오늘날 커널 자체가 주로 C로 작성 될 때 일부 운영 체제 이벤트 처리가 C와 같은 고급 언어 대신 어셈블리 언어로 작성된 이유는 무엇입니까?



답변

이 언어는 CPU 레지스터에 대한 액세스를 추상화하고 이벤트를 처리 할 때 OS가 컨텍스트를 저장해야하므로 이벤트 시점에 레지스터에 액세스해야하므로 C 스펙을 깨뜨립니다.


답변

C는 머신에서 실행되는 머신 코드에서 추출한 것입니다 (대부분의 다른 언어보다 훨씬 가깝지만).

이러한 것들에 대해서는 C로 표현할 수없는 기계어 코드 문 그리고 아마도 C 컴파일러 어셈블리가 제공하지 않는 추가적인 최적화를 위해 대부분 인라인 어셈블러 형태로 사용됩니다 .

커널 소스 코드 트리에서이 아래에 저장됩니다 arch/<arch>include/asm-<arch>위치를 <arch>특정 아키텍처 이름입니다. 실제로 완전한 커널 소스의 작은 부분 일뿐입니다.


답변

C에서는 이것을 할 수 없습니다 🙂

lgdt[xxxx]
mov eax, cr0
or al, 0x01
mov cr0, eax

x86 보호 모드로 들어 가려고합니다. 분명히 나는 ​​원시 기계 코드를 “방출”함으로써 여전히 C 에서이 작업을 수행 할 수 있지만 여전히 정확한 Offets에 액세스 해야하는 경우-나는 운이 좋지 않습니다.

두 번째 예는 BootLoader입니다. x86 시스템에서는 기존 부팅 코드의 길이가 정확히 512 바이트이고 마지막 두 바이트의 길이가 각각 0xAA 및 0x55 (또는 정확히 55AA) 여야합니다. 환상적인 방법으로 일하십시오.

어셈블리가 선호되는 것이 아니라 유일한 방법 인 경우가 더 많습니다.


답변

asm은 일반적으로 라이브러리 등으로 가득 찬 C보다 얇고 일반적으로 훨씬 빠르며 OS는 항상 많은 이벤트를 처리합니다. 이 기능을 위해 슬림하고 빠른 것을 원합니다.


답변