LINUXKERNEL
Posts
40 posts[커널크래시] 인터럽트 컨텍스트에서 wake_up_interruptible 대신 wake_up_locked 사용
인터럽트 컨텍스트에서 슬립을 지원하는 커널 함수를 호출하면 어떻게 동작할까요? 커널 패닉이 유발됩니다.이번에는 인터럽트 컨텍스트에서 발생한 커널 패닉 이슈를 소개합니다. 먼저 커널 로그를 소개합니다. [1.538173] BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:973[1.577234] in_atomic(): 1, irqs_disabled(): 128, non_block: 0, pid: 0, name: swapper/3[1.578316] Preemption disabled at:[1.597859] CPU: 3 PID: 0 Comm: swapper/3 [1.617377] Hardware name: rpi[1.6
[리눅스커널][Arm64] 유저 공간(EL0)에서 시스템 콜 번호는 어떻게 지정할까?
이번에는 64비트 기반 리눅스 커널에서 구동되는 라즈비안에서 시스템 콜 번호를 확인해 보겠습니다. 이를 위해 바이너리 유틸리티를 활용해 libc 라이브러리를 어셈블리 명령어로 분석할 필요가 있습니다. root@raspberrypi:/usr# find . -name libc.a./lib/aarch64-linux-gnu/libc.aroot@raspberrypi:/usr# objdump -d ./lib/aarch64-linux-gnu/libc.a > code_libc.c 위 명령어로 '/usr/lib/aarch64-linux-gnu/libc.a' 라이브러리 파일을 어셈블리 코드로 변환하게 됩니다. x8 레지스터에서 시스템 콜 번호를 지정 __libc_write() 함수를 분석하면 x8 레지스터에 시
[리눅스커널] 메모리: kcalloc() 함수와 kmalloc_array() 함수의 차이점
kcalloc() 함수는 어떤 역할을 수행할까요? 구현부를 보겠습니다. inline void *kcalloc(size_t n, size_t size, gfp_t flags){ return kmalloc_array(n, size, flags | __GFP_ZERO);} kcalloc() 함수를 보니 자신에게 전달된 인자를 kmalloc_array() 함수에 그대로 전달하는데,마지막 인자의 속성을 변경합니다. flags에 __GFP_ZERO 플래그와 OR 비트 연산을 한 결과를 마지막 인자로 전달하는 것입니다. kmalloc_array() 함수를 호출해 메모리를 할당할 때 0으로 초기화해 달라는 의미죠. 이 점만 빼면 kcalloc() 함수는 kmalloc_array() 함수와 같은 역할을 수행합니다.
[리눅스커널] 슬럽 메모리: set_track() 함수에 전달되는 addr인자의 정체
리눅스 커널의 슬럽 관련 디버깅 피쳐를 켜 놓으면, struct track 구조체로 슬럽 오브젝트를 할당하거나 해제할 때의 콜 스택 정보를 저장합니다. 이를 처리하는 핵심 함수는 set_track() 함수인데, 이 함수에 마지막으로 전달되는 인자는 addr입니다. 다음은 set_track() 함수의 구현부인데, 볼드체로 표기된 부분을 봅시다. void set_track(struct kmem_cache *s, void *object, enum track_item alloc, unsigned long addr){ struct track *p = get_track(s, object, alloc); if (addr) {... p->addr = addr; p->cpu = smp_process



