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의 매개 변수에 포인터를 가져야하는지 궁금합니다)
감사합니다!
"일반"'g ++ '가 Windows 객체 파일을 빌드하도록 설정된 Windows에 있습니까? 32 비트 x86 코드를 만들기 위해 gcc의 특별한 'i686' 버전이 필요 없기 때문에 처음에는 혼란 스러웠습니다. –
@PeterCordes 저는 macOS에 있고 g ++는 clang ++ 9.0.0입니다. 진실을 말하기 위해, 내가 시작했을 때 나는 내가하고있는 일에 대해 전혀 몰랐다. 그래서 OSDev [http://help.osdev.org/GCC_Cross-Compiler#OS_X_Users]의 튜토리얼을 따라 갔다. 그러나 만약 내가 gcc에 대한 접두사 값을 설정하지 않으면 대상 아키텍처 (그리고 내 경우에는 그것이 i686 - elf는 tutoriel 때문이지만 그럴 필요는 없다) – Adrien
@PeterCordes : 나는 (인터럽트 지시어를 사용하여) OS 개발을하고 크로스 컴파일러를 사용한다고 가정했다. (예전의 OSDev 위키에서는 몇몇 배포판이 libgcc를 묶어서 일부 호스트 OS 기능을 사용하기 때문에). 또한, OS/X에서 _LD_는 OS Dev (그래서 GNU Binutils는 훨씬 더 손쉬운)를 허용하는 링커 스크립트와 같은 많은 옵션을 지원하지 않습니다. –