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


17

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


5
"대부분 c"-나머지는 무엇인지 짐작하십니까? ;)
goldilocks

@ goldilocks 잘 조립되어 있습니다. 그러나 왜 다른 부분이 c에 있습니까?
MAKZ

4
나는 그것에 대해 전문가가 아니지만 C에서 수행 할 수없는 저수준 하드웨어 관련 사항이 있습니다. 이들은 일반적으로 아키텍처에 따라 다릅니다. "인라인 ASM"은 종종 C 코드에서 그러한 목적으로 사용되므로, 예를 들어 foobar()인라인 어셈블리를 사용하여 하나의 플랫폼에서 다른 방법으로 정의 할 것입니다. 이것은 asm의 사용을 최소한으로 유지하지만 완전히 피할 수는 없습니다.
goldilocks

C에서 Global Descriptor Table Pointer 레지스터를 어떻게 설정합니까?
user253751

답변:


24

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


이것이 실제로 주된 이유입니다. 일부 임베디드 C 컴파일러에는 레지스터를 처리 할 수있는 확장 기능이 있습니다 (일반적으로 사전 선언 된 전역 상수 / 변수를 통해). 하나의 아키텍처 만 대상으로하기 때문에이를 수행 할 수 있습니다. 그러나 범용 C 컴파일러는 너무 많은 다른 아키텍처를 대상으로하여 이러한 확장을 합리적으로 만듭니다. 따라서 그들은 일반적으로 asm 임베딩 메커니즘을 구현합니다 (비표준으로 만들 것입니다)
slebetman

18

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

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

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


6

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

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

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

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

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


-5

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


2
C 컴파일러 기술 최적화가 꽤 좋아졌습니다. asm이 일반적으로 C보다 훨씬 빠르다는 것은 신화입니다. 어쨌든 저수준 운영 체제 운영 체제가 asm을 사용하는 이유는 아닙니다. 그것은 주로 기억 장벽과 같이 C로 표현 될 수없고 C가 아닌 전화 회의 등을위한 춤을 등록하는 것과 관련이있다.
Celada
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.