2017-10-29 5 views
2

CPU 작동 방식에 대해 자세히 알고 싶었 기 때문에 인텔 IA-64 및 32 설명서를 다운로드했습니다. 그래서 나는 책을 읽고 몇 가지 물건을 짜기 시작했습니다. 나는 IDT를 활성화하고 내가 인터럽트 핸들러를 프로그램 할 때 그 코드를 가지고 :gcc의 크로스 플랫폼 버전이 내 함수의 attribute 태그 __attribute __ ((interrupt))를 무시합니다.

extern "C" __attribute__((interrupt)) void test (void* ptr) 
{ 

} 

int main (void) 
{ 
    return 0; 
} 

내가 i686-elf-g++ -Wall -Wextra -O2 -c -m32 main.cpp 컴파일 나는 다음과 같은 경고했다 : 나는 g++ -Wall -Wextra -O2 -c -m32 main.cpp로 컴파일 할 때 컴파일 그냥 잘 작동 main.cpp:6:60: warning: 'interrupt' attribute directive ignored을하지만, 및 그것이 끝에 IRET 명령으로해야한다 같이 생성 된 코드는 (그리고 그게 내가 원하는거야) : 나는 GCC 내 크로스 플랫폼 버전이 경고를 왜

Disassembly of section __TEXT,__text: 
_test: 
     0:  55  push ebp 
     1:  89 e5 mov  ebp, esp 
     3:  fc  cld 
     4:  5d  pop  ebp 
     5:  cf  iretd 
     6:  66 2e 0f 1f 84 00 00 00 00 00 nop  word ptr cs:[eax + eax] 

는 사람이 어떤 생각을 가지고 있습니까? (왜 나는 인터럽트 처리기가 gcc의 매개 변수에 포인터를 가져야하는지 궁금합니다)

감사합니다!

+0

"일반"'g ++ '가 Windows 객체 파일을 빌드하도록 설정된 Windows에 있습니까? 32 비트 x86 코드를 만들기 위해 gcc의 특별한 'i686' 버전이 필요 없기 때문에 처음에는 혼란 스러웠습니다. –

+0

@PeterCordes 저는 macOS에 있고 g ++는 clang ++ 9.0.0입니다. 진실을 말하기 위해, 내가 시작했을 때 나는 내가하고있는 일에 대해 전혀 몰랐다. 그래서 OSDev [http://help.osdev.org/GCC_Cross-Compiler#OS_X_Users]의 튜토리얼을 따라 갔다. 그러나 만약 내가 gcc에 대한 접두사 값을 설정하지 않으면 대상 아키텍처 (그리고 내 경우에는 그것이 i686 - elf는 tutoriel 때문이지만 그럴 필요는 없다) – Adrien

+2

@PeterCordes : 나는 (인터럽트 지시어를 사용하여) OS 개발을하고 크로스 컴파일러를 사용한다고 가정했다. (예전의 OSDev 위키에서는 몇몇 배포판이 libgcc를 묶어서 일부 호스트 OS 기능을 사용하기 때문에). 또한, OS/X에서 _LD_는 OS Dev (그래서 GNU Binutils는 훨씬 더 손쉬운)를 허용하는 링커 스크립트와 같은 많은 옵션을 지원하지 않습니다. –

답변

2

interrupt 속성은 G ++ 만 최근 추가 86/x86-64에 아키텍처를 목표로하고 G ++에서 사용할 수 7.0, 나중에 보자는 i686-elf-g++ 크로스 컴파일러가 이전의 7.0 호스트입니다 추측 것 컴파일러 g++은 7.0 이상입니다. i686 크로스 컴파일러를 최신 버전으로 업그레이드해야합니다.

+0

정말요? g ++의 나의 정규 버전은 clang ++ 9.0.0 (나는 MacOS에있다)이고 나의 i686-elf-g ++ 버전은 6.3.0이다. 나는 g ++의 6.3.0 문서에서 검색 할 때 인터럽트 속성을 만들었습니다. 현재 존재하지 않는 기능을 문서화하는 것은 좀 이상합니다. – Adrien

+1

애플의 Clang/LLVM은 버전 9 이후로'interrupt' 속성을 지원했을 것 같습니다 x86/x86-64. ARM 및 MIPS와 같은 다른 타겟을위한 함수에 대한 인터럽트 속성을 훨씬 오래 지원했습니다. –

+1

@Adrien : GCC와 CLANG은 다른 프로젝트입니다. 그리고 애플은 나중의 XCode 릴리스와 함께 자체 버전의 CLANG/LLVM을 가지고 있습니다. 'interrupt' 속성은 잠시 동안 있었지만 ARM과 MIPS와 같은 아키텍처에 대해서만 적절하게 구현되었습니다. 최근에는 GCC/CLANG/Apple CLANG (2016 년 이후)에서만 사용되었습니다. x86 및 x86-64 플랫폼 용. –