BPF LRU per-CPU hash map
·
DevSec
BPF LRU per-CPU hash mapBPF LRU per-CPU hash map(BPF_MAP_TYPE_LRU_PERCPU_HASH): Hash map 구조에 LRU eviction 과 per-CPU value 저장 방식을 함께 적용한 BPF mapBPF program 은 커널 내부에서 실행되기 때문에 일반적인 userspace 자료구조를 그대로 사용할 수 없다.그렇기 때문에 BPF program 에서 상태를 저장하거나, user space 와 데이터를 공유하거나, 반복적으로 조회되는 값을 캐싱하기 위해서는 BPF map 을 사용해야 한다.BPF_MAP_TYPE_LRU_PERCPU_HASH 는 key-value 형태로 데이터를 저장하지만, value 를 CPU 별로 분리해서 저장하고 map 이 가..
API와 ABI
·
DevSec
APIAPI(Application Programming Interface): 소스코드에서 어떤 기능을 어떻게 호출해야하는지 정해둔 규약API는 다른 코드나 프로그램이 어떤 기능을 사용할 수 있도록 정해둔 사용 규칙이다.어떤 기능이 내부에서 어떻게 구현되어 있는지 몰라도 정해진 방식대로 요청하면 그 기능을 사용할 수 있게 해주는 것이다.만약 간단한 덧셈 기능을 만든다면function add(a, b) { return a + b;}이렇게 작성한다면 다른 개발자가 이걸 이용할 떄는add(3, 5)처럼 작성해서 사용할 수 있다.여기서 add 함수는 API라고 볼 수 있다.이렇듯 API는 기능을 가져다 쓰기 위한 규칙이다.ABIABI(Application Binary Interface): 컴파일된 바이너리 코드끼..
PCB
·
DevSec
PCBPCB(Process Control Block): 운영체제가 프로세스를 관리하기 위해 사용하는 커널 내부 자료구조프로그램은 디스크에 저장된 실행 파일이고, 프로세스는 메모리에 올라와 실행 중인 프로그램이다.프로세스가 실행되려면 CPU, 메모리, 파일, 입출력 장치 같은 자원이 필요하다.운영체제는 여러 프로세스가 동시에 실행되는 것처럼 보이도록 CPU 시간을 나눠서 할당한다.이때 각 프로세스가 어떤 상태인지, 어디까지 실행되었는지, 어떤 자원을 사용 중인지 저장해두어야 한다.PCB 는 이러한 프로세스의 실행 정보를 저장하는 자료구조이다.Process프로세스(Process)는 실행 중인 프로그램이다.예를 들어 사용자가 어떤 프로그램을 실행하면, 운영체제는 해당 실행 파일을 메모리에 적재하고 프로세스를 ..
TLB-Hit Model
·
DevSec
TLB-Hit ModelTLB-Hit Model: 자주 사용되는 변환 결과나 정책 판단 결과를 빠른 경로에 저장해두고, 같은 요청이 다시 들어왔을 때 복잡한 판단 과정을 생략하는 성능 모델TLB 는 Translation Lookaside Buffer 의 약자로, CPU 가 가상 주소를 물리 주소로 변환할 때 최근에 사용한 주소 변환 결과를 캐싱하는 구조이다.CPU 가 메모리에 접근할 때 매번 Page Table 을 순차적으로 탐색하면 비용이 크다. 그래서 최근에 사용한 주소 변환 결과를 TLB 에 저장해두고, 같은 주소 영역에 다시 접근하면 TLB 에서 바로 변환 결과를 가져온다.TLB-Hit Model 은 이러한 TLB 의 동작 방식을 일반적인 시스템 성능 최적화 모델로 확장한 것이다.즉, 반복적으로 ..
eBPF for Windows
·
DevSec
eBPF for WindowseBPF for Windows: Linux 환경에서 사용되던 eBPF 생태계의 Toolchain 과 API 를 Windows 위에서 사용할 수 있도록 만든 프로젝트기존 eBPF 는 주로 Linux Kernel 에서 사용되었지만, eBPF for Windows 는 Windows Kernel 에서도 eBPF Program 을 로드하고 실행할 수 있도록 중간 계층을 제공한다.즉, 개발자는 기존처럼 C 로 eBPF Program 을 작성하고 Clang 으로 eBPF Bytecode 를 생성할 수 있다.그 후 Windows 환경에서는 해당 Bytecode 를 검증하고, Windows Kernel 에서 실행 가능한 형태로 변환하거나 로드해서 사용한다.eBPF for Windows 는 W..
eBPF
·
DevSec
eBPFeBPF(extended Berkeley Packet Filter): Linux Kernel 내부에서 안전하게 실행되는 작은 프로그램을 이용해서 커널의 동작을 확장하는 기술eBPF 는 커널 소스코드를 직접 수정하거나 Kernel Module 을 새로 로드하지 않고도 Kernel 내부의 특정 지점에 프로그램을 붙여서 실행할 수 있게 해준다.예를 들어 시스템 콜, 네트워크 패킷 처리 지점, 파일 접근 지점, 프로세스 실행 지점, 커널 함수 호출 지점 등에 eBPF Program 을 연결하면 해당 이벤트가 발생했을 때 eBPF Program 이 실행된다.eBPF 는 단순히 패킷 필터링만을 위한 기술이 아니라, 현대 Linux 환경에서 Observability, Networking, Security, T..
BPF
·
DevSec
BPFBPF(Berkeley Packet Filter): Kernel space 에서 packet 을 효율적으로 필터링하기 위한사한 뒤 필터링하면 성능적으로 비효율적이다.패킷은 매우 빠른 속도로 들어오고, 대부분의 경우 사용자가 보고 싶은 패킷은 전체 패킷 중 일부이다.그래서 BPF 는 User space 로 패킷을 넘기기 전에 Kernel space 에서 먼저 필터링을 수행한다.BPF 는 작은 필터 프로그램을 커널 안에서 실행하고, 그 결과에 따라 해당 패킷을 User space 로 전달할지 결정한다.현재는 기존 BPF 를 eBPF 와 구분하기 위해 Classic BPF 또는 cBPF 라고 부르기도 한다.BPF 가 필요한 이유패킷 캡쳐 도구는 네트워크 인터페이스로 들어오는 패킷을 확인해야 한다.예를 들..
Mutual Exclusion
·
DevSec
Mutual Exclusion상호 배제(Mutual Exclusion): 여러 프로세스나 스레드가 공유 자원에 동시에 접근하지 못하도록 제한하는 동기화 기법.Mutual Exclusion 기법Mutual Exclusion은 여러 실행 흐름이 같은 공유 자원에 접근할 때 한번에 하나의 실행 흐름만 해당 자원을 사용할 수 있도록 보장해주는 기법이다.여러 스레드가 동시에 같은 변수, 파일, 메모리 영역, 커널 객체 등에 접근하면 실행 순서에 따라 결과가 달라질 수 있다.이러한 문제를 Race Condition이라고 한다.Mutual Exclusion은 Race Condition을 막기 위해 공유 자원에 접근하는 코드 영역을 보호한다.이때 공유 자원에 접근하는 코드 영역을 Critical Section이라고 한..
Critical Section
·
DevSec
Critical Section임계 구역(Critical Section): 여러 프로세스 또는 스레드가 공유 자원에 접근하는 코드 구간 중에 동시에 실행되면 데이터 불일치가 발생할 수 있는 영역.Critical Section 보호여러 실행 흐름이 같은 변수, 파일, 자료구조, 장치 상태 등에 동시에 접근하면 Race Condition이 발생할 수 있다.이때 Critical Section 앞뒤에 Lock, Mutex, Semaphore, Spinlock 같은 동기화 기법을 배치해서 한 번에 하나의 실행 흐름만 공유 자원에 접근하도록 만들어야한다.int counter = 0;counter++;위의 C언어 코드는 단순히 counter 값을 1 증가시키는 코드처럼 보이는데 실제로는 메모리에서 값을 읽고, 레지스터..
Busy Waiting
·
DevSec
Busy Waiting?바쁜 대기(Busy Waiting)는 말그대로 CPU를 바쁘게 쓰면서 기다린다는 뜻이다.어떤 스레드에서 공유 자원을 쓰려할때 다른 스레드가 이미 락(Lock)을 쥐고 있을 때 Sleep 하는 대신 무한 루프를 돌면서 락이 풀렸는지 계속 확인하는 방식이다.예시 코드volatile int lock = 0;void critical_section(){ while (lock == 1) { } lock = 1; lock = 0;}이런식으로 구현된다.왜 씀?굳이 Sleep 시키지 않고 무한 루프를 돌면서 CPU를 낭비해가면서 이걸 쓰는 이유가 있다.속도가 빠르다: 조건이 만족되었을 때는 속도가 빠르다. 뮤텍스(Mutex)같은 방식은 락을 못 얻으면 Sleep시키고 락이 풀..