강좌 & 팁
글 수 2,412
2012.10.07 16:39:06 (*.52.177.29)
43226
이번 길은 EABI와 시스템 콜간의 관계에 대한 산책길입니다.
EABI는 Embedded Application Binary Interface 의 약자입니다.
즉 임베디드용 ABI 입니다.
ABI 에 대한 설명을 하기 위해서 위키백과의 글을 살짝 빌리면
응용 프로그램과 운영 체제
또는 응용 프로그램과 해당 라이브러리,
마지막으로 응용 프로그램의 구성요소 간에서 사용되는 낮은 수준의 인터페이스라고 합니다.
인터페이스는 소프트웨어 함수간의 호출 규격이죠
이 규격을 따르면 다른 컴파일러가 생성한 라이브러리들간에 호환성을 유지하게 됩니다.
즉 동일한 프로세서 명령군이면 함수를 호출해서 수행할 수 있다는 것이죠
어쨌든 좋은 겁니다. ^^
예전 방식의 ABI를 OABI 라고도 하는데
ARM 프로세스와 커널에서 2.6 초중반대에서 EABI 방식으로 정격적으로 전환했고
이전 방식의 ABI와 구별하기 위해서
이전것을 Old 즉 옛날거라는 의미를 부여해 OABI라고 하고
현재 쓰고 있는 방식을 EABI라고 지칭합니다.
현재 ARM 계열의 세계에서는 EABI 가 대세여서 굳이 설명안하면 EABI 방식이라고 생각하시면 됩니다.
EABI 는 여러가지를 규정하고 있습니다.
주로 고정 소수점 연산 명령 처리에 대한 규정도 있고
함수 호출 전달 파라메터 규정에 대한 것도 있고
오늘 다룰 시스템 콜 호출 규정에 대한 것도 있습니다.
웃긴것은
예전에 ABI 규정에는
부동소수점 처리 규정이 FPU 가 있는 것을 가정하고 규정되었다는 겁니다.
실제로 생산된 ARM 프로세서에 FPU가 없어서 다들 고생하고 있었는데 말이죠...
그래서 가상 프로세서를 에뮬레이션 해서 지원하는 비 효율적인 방법을 사용했죠..
이런 부분을 개선한 것이 현재 EABI 입니다.
뭐 다른 부분은 필요할 때 찾는 것으로 하고
시스템 콜과 연관된 EABI 부분에 대하여 살펴 보죠..
EABI 에서 시스템 콜을 다루는 부분은
함수의 전달 인자 매계변수 처리 부분중 64비트 데이터 매계변수 처리 부분과
시스템 콜 인덱스를 전달하는 매계변수 처리 부분이 있습니다.
함수의 전달 인자 부분도 다음 산책에서 다루기로 하고 ..
지금은 시스템 콜 인덱스를 전달하는 부분만 살펴 보죠..
이전 산책길에서 살짝 언급 했듯이
EABI 호출 방식에서는
R7 레지스터에 시스템 콜 인덱스를 넣고
항상 SWI 0 방식으로 호출 합니다.
open() 시스템 콜을 호출한다면 다음과 같은 방식입니다
mov r7, #1
swi 0
OABI 라면 다음과 같이 합니다.
swi __NR_SYSCALL_BASE(==0x900000)+1
그래서 리눅스 커널에서는
SWI 명령 코드가 swi 0 형식의 코드 인가를 보고
그렇다면 EABI 호출 처리를 하고
그렇지 않다면 OABI 호출 처리를 합니다.
이렇게 해서 예전 방식의 호출도 처리하게 하는데
실제로는 여러가지 이유로 조금 문제가 있어 절대로 권장하지 않습니다.
EABI 형식으로 응용 프로그램이나 커널을 컴파일 하는 것이 개발자 수명연장에 도움이 됩니다.
뭐 어찌되었든
응용 프로그램에서 시스템 콜을 호출하면
커널은 R7 값만 보면 됩니다.
해당 값이 함수 테이블의 인덱스로 취급하면 되죠
즉 커널에서는 처리 할때 번잡한 것이 없어지는 거죠...
오늘길은 짧군요...
전 이런 길이 좋아요 헤헤...