리눅스커널

포스트: 154|조회수: 0|TERM
Items

Posts

154 posts

[리눅스커널][Arm64] 유저 공간(EL0)에서 시스템 콜 번호는 어떻게 지정할까?

Guillermo Austin Kim|2021년 8월 21일

이번에는 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 레지스터에 시

[리눅스커널] Arm64: VMEMMAP_START, vmemmap, PAGE_OFFSET 위치 조정(v5.4)

Guillermo Austin Kim|2021년 8월 8일

리눅스 커널 v5.4 버전부터 가상 주소 맵이 약간 변경됐습니다.그 중 대표적인 속성은 아래 정보입니다. VMEMMAP_START: 0xfffffffeffe00000PAGE_OFFSET: 0xffffff8000000000 이 정보를 직접 어셈블리 코드로 확인해보겠습니다. 관련 코드는 참고로 다음과 같습니다. vmemmap ((struct page *)VMEMMAP_START - (memstart_addr >> PAGE_SHIFT)) 패치 코드 먼저 다음과 같은 패치 코드를 작성합시다. diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.cindex 9af647d..3000332 100644--- a/arch/arm64/mm/

[리눅스커널] 메모리: kcalloc() 함수와 kmalloc_array() 함수의 차이점

Guillermo Austin Kim|2021년 6월 9일

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인자의 정체

Guillermo Austin Kim|2020년 12월 10일

리눅스 커널의 슬럽 관련 디버깅 피쳐를 켜 놓으면, 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