왜 일부 운영 체제 이벤트 처리가 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.