* 소프트웨어나 하드웨어로 인해 발생하는, CPU의 처리가 필요한 이벤트를 CPU에 알려서 처리하도록 하는 기술 * 일종의 이벤트로, 발생하는 이벤트에 맞게 운영체제에서 처리 * 인터럽트를 실행하기 위한 opcode(명령 코드)는 int * 인터럽트는 컴퓨터 부팅 시 미리 정의되어 이벤트와 실행코드 주소가 IDT에 기록되어 있음. * 인터럽트는 CPU에 직접 전달되지 않는다. * PIC(Programmable Interrupt Controller)에 의해서 인터럽트 요청을 순차적으로 처리 * 최근에는 Advanced(고급) PIC를 활용하여 Local/I/O APIC로 나누어 활용 * I/O APIC: CPU 코어들 사이의 외부 Interrupt를 분산하기 위해 사용. * Local APIC: CPU 코어들 사이의 외부 Interrupt를 분산하기 위해 사용.
* 커널은 현재 프로세스의 실행을 중지(작업에 대한 선점)
* 인터럽트 핸들러와 인터럽트 전송 컨트롤러를 찾아서 핸들러 실행
* 인터럽트 핸들러의 동작이 완료된 이후 중지된 프로세스 실행 재개
IDT
- Interrupt들과 exception handler(예외 처리)의 엔트리 포인트(진입점)를 저장하는 구조체로, gate 형태(자료구조 중 하나)를 이루고 있음
- 서로 다른 권한 레벨의 Interrupt Handler 혹은 프로시저를 호출할 수 있도록 해주는 gateway 역할을 하는 구조체이다.
- IDT에 들어갈 수 있는 게이트의 종류는 Task Gate/Trap Gate/Interrupt Gate로 총 3가지가 있다.
- IDT는 최대 256개의 gate를 포함할 수 있고, 이 내부에는 다음과 같은 정보들이 포함되어 있다.
- Handler Offset: 인터럽트 혹은 Exception Handler의 엔트리 포인트
- Segment Selector : 인터럽트 혹은 Exception Handler 수행 시 코드 세그먼트를 교체해 동작에 필요한 권한으로 상승시킴
- Interrupt Stack Table: 동작 수행 시 생성되는 별도의 스택 공간. 스택 공간 부족 및 데이터 덮어쓰기 방지를 위한 장치
- Type: 어떤 IDT 게이트인지 설정해주는 비트로, 0110 - 인터럽트 게이트, 0111 - 트랩 게이트이다.
- Descriptor Privilege Level(DPL): 디스크립터 사용에 필요한 권한으로, 0~3(Ring)의 범위를 가지며 접근 권한을 제어
- P: 현재 사용하는 디스크립터가 유효한지(1) 혹은 유효하지 않은지(0)를 나타낸다.
[1]: 인터럽트 게이트로 Type이 세팅되면 핸들러 수행 도중 방해받지 않으며, 트랩 게이트로 설정 시 다른 인터럽트가 발생할 수 있다.
IST는 x86_64에서 새로 도입된 스택 스위칭 메커니즘이다. 인터럽트 혹은 exception 상황은 코드 수행 도중
IST x86_64에서 새로 도입된 스택 스위칭 매커니즘이다. 인터럽트 혹은 exception 상황은 코드 수행 도중 발생하는 것이므로, 이를 처리하기 위한 핸들러가 동작할 때의 스택 상태를 예측할 수 없다. 기존 스택이 다 할당된 상태에서 코드가 수행되면 다른 영역을 침범할 수 있으므로 이를 해결하기 위한 방식이 IST다. 다만 모든 인터럽트의 핸들링에 사용되는 것은 아니고, 일부 인터럽트에서 레거시 스택 스위칭 방식을 사용한다. IST 스택 전환 메커니즘을 위해서 TSS에서는 최대 7개의 IST 포인터를 제공하고, 이는 IDT의 인터럽트 게이트에 의해서 참조된다.
KASAN - 런타임 메모리 디버거디다.
https://hyeyoo.com/165
인터럽트 스택 - https://eclipsemode.tistory.com/73
IRET: 인터럽트 리턴
EP: 엔드 포인트
세그먼트 레지스터 - https://ezbeat.tistory.com/143
특권 레벨 - https://stdnstr.tistory.com/199
- Flag Register(플래그 레지스터)
: EFLAGS로 칭하며 32비트 크기이다.(접두사 E를 보기 바람)
: 각각의 비트마다 1 OR 0의 값을 갖는다(Boolean)
: 리버싱 입문에선, 3가지 정도만 이해하고 넘어가면 된다고함(ZF, OF, CF)
ZF (Zero Flag)
: 연산 명령 후에 결과 값이 0이 되면 ZF가 1로 세팅된다.
OF (Overflow Flag)
: 부호 있는 수(signed integer)의 오버플로우가 발생했을 때, 1로 세팅된다. 부호를 나타내는 비트, 즉 MSB도 변경되었을 때도 1.
CF (Carry Flag)
: 부호 없는 수(unsigned)의 오버플로우가 발생했을 때 1로 세팅된다.
Insturction Pointer
: CPU가 처리할 명령어의 주소를 나타내는 레지스터이다. (크기 32비트)
: 다른 레지스터와는 다르게, 직접 값을 변경할 수 없다.
EIP
: gdb로 디버깅할 때 많이 본 거. 다음 실행할 명령의 주소를 가리키고 있음.
- 포인터 레지스터 - https://yechoi.tistory.com/10
RSP(Extended Stack Pointer)
현재 스택 주소. 그러니까 스택 맨 윗쪽 주소. 스택에 있는 데이터의 주소를 지정. 계산, 데이터 전송에는 거의 사용되지 않는다
RIP
현재 명령 실행 주소