[리눅스커널] 시스템 콜: 유저 공간에서 전달한 문자열 처리 방법
By Guillermo Austin Kim | 2019년 7월 12일 |
유저 공간에서 시스템 콜 아규먼트로 지정한 파일 이름은 커널 공간에 그대로 전달됩니다. 한 가지 예를 들어볼까요?[https://elixir.bootlin.com/linux/v4.19.30/source/fs/open.c]SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, umode_t, mode){ if (force_o_largefile()) flags |= O_LARGEFILE; return do_sys_open(AT_FDCWD, filename, flags, mode);} 위 sys_open() 함수 첫 번째 아규먼트로 filename이 전달됩니다.이번에는 다른 예시를 들겠습니다.[https://elixir.bootlin.com/l
[리눅스커널] 스케줄링/디버깅: ftrace: 스케줄링 실행 시 콜스택 파악하기
By Guillermo Austin Kim | 2019년 9월 15일 |
sched_switch와 sched_wakeup 이벤트는 각각 프로세스 스케줄링과 프로세스를 깨우는 동작을 트레이싱합니다. 이번에는 스케줄링이 실행할 때 콜스택을 점검해 보겠습니다. 커널에선 2가지 타입 스케줄링을 지원합니다. [그림 10.48] 2가지 스케줄링 종류과 동작 방식 스케줄링 종류 별로 어떤 콜스택인지 점검합시다. 먼저 ftrace 설정을 위한 다음 코드를 소개합니다.1 #!/bin/bash2 3 echo 0 > /sys/kernel/debug/tracing/tracing_on4 sleep 15 echo "tracing_off"67 echo 0 > /sys/kernel/debug/tracing/events/enable8 sleep 19 echo "events disabled"1
[리눅스커널] 동기화: 스핀락(spinlock)을 쓰는 예제 코드 살펴보기
By Guillermo Austin Kim | 2019년 9월 11일 |
스핀락을 표현하는 구조체를 확인했으니 스핀락을 어떤 방식으로 획득하고 해제하는지 살펴보겠습니다. 예제 코드를 보기 전에 spin_lock() 함수와 spin_unlock() 함수의 선언부를 소개합니다. 이번에는 스핀락을 획득할 때 쓰는 spin_lock()와 함수의 선언부를 보겠습니다.static __always_inline void spin_lock(spinlock_t *lock); 입력 인자는 포인터 타입 lock 변수이며 spinlock_t 구조체입니다. 함수 선언부가 void이니 반환 값은 없습니다. __always_inline 매크로로 선언했으니 커널 함수 내에서 자주 호출되는 함수임을 알 수 있습니다. 다음은 스핀락을 해제할 때 쓰는 spin_unlock()와 함수의 선언부를 봅시다
[리눅스커널] 시스템 콜: 시스템 콜의 특징 알아보기
By Guillermo Austin Kim | 2019년 9월 6일 |
이번 소절에서는 시스템 콜의 특징을 알아보겠습니다. 앞서 알아봤듯이 시스템 콜은 유저 모드에서 커널 모드로 진입하는 관문입니다. 소프트웨어 구조 관점으로 보면 시스템 콜은 유저 공간과 커널 공간 사이 가상 계층으로 볼 수도 있습니다. 이 계층은 다음과 같은 특징이 있습니다.1. 시스템 콜 계층으로 시스템 안정성과 보안을 지킬 수 있습니다. 유저모드에서 어플리케이션이 커널 공간에 아무런 제약 없이 접근한다고 가정합시다. 실수로 어플리케이션이 커널 코드 영역 메모리를 오염시키면 시스템은 오동작할 가능성이 높습니다. 그래서 유저 모드에서 시스템 콜로만 커널 모드에 진입해서 제한된 메모리 공간에 접근하는 것입니다. 2. 유저 어플리케이션에서 추상화된 하드웨어 인터페이스를 제공합니다. 유저 모드에서 구동 중인 어