API
API(Application Programming Interface): 소스코드에서 어떤 기능을 어떻게 호출해야하는지 정해둔 규약
API는 다른 코드나 프로그램이 어떤 기능을 사용할 수 있도록 정해둔 사용 규칙이다.
어떤 기능이 내부에서 어떻게 구현되어 있는지 몰라도 정해진 방식대로 요청하면 그 기능을 사용할 수 있게 해주는 것이다.
만약 간단한 덧셈 기능을 만든다면
function add(a, b) {
return a + b;
}
이렇게 작성한다면 다른 개발자가 이걸 이용할 떄는
add(3, 5)
처럼 작성해서 사용할 수 있다.
여기서 add 함수는 API라고 볼 수 있다.
이렇듯 API는 기능을 가져다 쓰기 위한 규칙이다.
ABI
ABI(Application Binary Interface): 컴파일된 바이너리 코드끼리 서로 맞춰야하는 규칙
API가 소스코드 레벨에서의 규약이라면 ABI는 컴파일된 바이너리 레벨에서의 규약이다.
예를 들어서 함수 인자를 어느 레지스터에 넣는지, 반환값을 어디에 담는지, 구조체 메모리 배치는 어떻게 되는지 등등이 있다.
ABI는 소스코드를 다시 컴파일하지 않고도 바이너리가 계속 동작하려면 유지되어야한다.
Android 커널에서
특히 Android Kernel에서 ABI가 중요한 이유는 Kernel Module 때문이다.
Android GKI 구조에는 Google에서 관리하는 GKI core kernel이 있고 SoC vendor이 제공하는 vendor kernel module이 따로 올라간다.
여기서 vendor module는 이미 컴파일된 .ko 바이너리인데 이 모듈이 GKI Kernel 내부 함수나 구조체를 참조한다. 근데 커널 업데이트 후에 ABI가 깨지면 모듈이 로드가 안되거나 런타임에서 오작동할 가능성이 있다.
그래서 커널 업데이트 후에도 바이너리 인터페이스가 유지되어야 기존의 vendor module이 계속 잘 돌아간다. 이때 커널과 모듈 사이의 바이너리 규약을 Android에서는 보통 KMI(Kernel Module Interface)라고 한다.
'DevSec' 카테고리의 다른 글
| PCB (0) | 2026.06.14 |
|---|---|
| TLB-Hit Model (0) | 2026.06.13 |
| eBPF for Windows (0) | 2026.06.11 |
| eBPF (0) | 2026.06.10 |
| BPF (0) | 2026.06.10 |