다음 이전 차례

4. 컨벤션 부르기

4.1 4.1 Linux

GCC로 링크하기

32비트 인자는 32비트 near리턴 어드레스위로 스택상에 푸쉬된다. %ebp, %esi, %edi, %ebx 가 저장된다. %eax에 결과가 담기거나 %edx:%eax에 64비트 결과가 담긴다. GCC는 저장된 레지스터에 의해 호출되는 컨벤션을 변경할 수 있는 옵션을 가지고 있으며, 레지스터에 인자를 가지고 있으나 FPU를 생각하지 않는다. i386 인포 페이지를 체크하라. GCC가 이러한 표준 컨벤션을 제공할려면 함수를 위해 asmlinkage attribute를 선언해야 한다. (나는 어떻게 그것이 컨벤션을 불러서 변경하는 지를 알지 못한다.)

ELF vs a.out 문제들

어떤 C 컴파일러는 모든 심볼 전에 강조를 준비한다. 특별히, 리눅스 a.out GCC 는 리눅스 ELF GCC가 없을 동안 그러한 준비를 한다. 리눅스 소스 트리가 그것을 어떻게 관리하는 지를 보라. (linux/include/linux/linkage.h). 여러분들은 C->asm 이름 변경을 다음과 같은 기술을 삽입함으로써 뛰어넘을 수 있다. void foo asm("bar") (void); foo 함수를 확실히 하기 위해서는 어셈블리에서 bar를 호출해야 한다. binutils 패키지안의 objcopy 유틸리티는 a.out 목적파일은 ELF 목적파일로 만들수 있으며 반대의 경우도 가끔 가능 할 것이다.

직접적인 리눅스 시스템 콜

이것은 재명명할 수 없다. 왜냐하면 이것은 바뀌면 호환성이 없어지기 때문이다. 그리고 이것은 libc의 고정적인 것들과 확장된 것들을 방해한다. 정석으로 하자면, 리눅스 시스템 서비스 콜을 재명명하는 것은 libc를 통해서 한다. 이제, libc로 링크를 시키는 것을 원하지 않을 것이다. 아래에서 linux-eforth- 1.0c.tgz 을 보라. ftp.forth.org/pub/Forth/Linux/ 리눅스 소스가 따라올 것이다. 어떻게 시스템 콜을 사용할 것인지를 설명하는 asm/unistd.h 헤더파일도 따라온다. 기본적으로 여러분들은 %eax에 __NR_syscallname 번호를 넣고, 파라메타를 %ebx, %ecx, %edx, %esi, %edi에 각각 넣고 int $0x80을 사용 할 수 있을 것이다. 결과는 %eax에 리턴되고, 에러시에는 libc가 errno를 세팅하는 것에 해당하는 결과를 음수로 %eax에 놓는다. 사용자 스텍은 건더리지 않는데, 시스템 콜이 불리워 지는 동안 별다는 것이 필 요하지 않을 것이다.

4.2 도스

최근의 도스 익스텐더들에는 도스서비스를 위한 인터페이스가 따라온다. 그에 대한 doc파일들을 읽어보라. 보통은 int 0x21을 흉내내는데, 따라서 리얼모드를 사용할 수 있게 된다. (나는 그것들이, 필요할 때 32비트 작동자를 사용하여 16비트 도스 서비스를 호출함으로써 작업을 할 수 있으리라고는 생각치 않는다.) DPMI에 관한 doc은 다음에서 찾을 수 있다. ftp.oulu.fi/pub/msdos/programming/ DJGPP 에는 자체의 (제한된) 교체된 libc가 따라온다. 이것은 리눅스에서 도스로 크로스컴파일이 가능하다. 그러나 현재 있는 패치는 a.out GCC용이며 최근의 ELF GCC는 패치가 필요없을 것이다. 만일 그것들이 새로운 패치를 필요로 한다면 난모르겠다..

4.3 여러분들의 OS

[어셈블리 프로그래머들이 많이 그것에 대해 이야기 하고 있는 것이다.]

부트 로더 코드와 32비트 모드로 들어가기

프로텍션의 기초

인터럽트 다루기

16비트 시스템 서비스를 사용하는 V86/R86 모드

이것들에 대한 정보를 어디서 얻을 것인가

[다른 문서에 이부분들에 대한 안내표시를 보태주기 바란다] 정보의 중요한 소스는 OS에 존재하고 있다. 많은 안내표시들이 아래의 WWW 페이지에 있다. www.eleves.ens.fr:8080/home/rideau/Tunes/Review/OSes.html


다음 이전 차례