Guillermo Austin Kim
Posts
998 posts[Linux][Kernel] current 매크로 (2)
[Linux][Kernel] current 매크로 (1) 에서 계속...http://rousalome.egloos.com/9976442 그럼 current란 코드의 정체를 조금 더 알아볼까요?이번에도 패치 코드 하나를 소개할게요. 다음 루틴은 Wait Queue 관련 함수들인데요.diff --git a/kernel/sched/wait.c b/kernel/sched/wait.cindex 9453efe..a1371a9 100644--- a/kernel/sched/wait.c2+++ b/kernel/sched/wait.c@@ -76,6 +76,16 @@ static void __wake_up_common(wait_queue_head_t *q, unsigned int mode, } } 1 +void
[Linux][Kernel] current 매크로 (1)
리눅스 커널 코드를 읽다가 current란 매크로를 보신 적이 있나요? 아직 없다고요? 그럼 조금 코드를 읽다 보면 만나게 될 겁니다. 왜냐면 리눅스 커널 코드 구석구석 이 매크로를 쓰고 있거든요. 그럼 current 매크로는 어떤 동작을 할까요? current란 매크로는 현재 구동 중인 프로세스의 태스크 디스크립터 정보를 담고 있습니다. 그럼 current 매크로가 포함된 코드를 열어 볼까요? 다음 파일 디스크립터를 할당하는 get_unused_fd_flags 함수를 잠깐 볼게요.1 int get_unused_fd_flags(unsigned flags)2 {3 return __alloc_fd(current->files, 0, rlimit(RLIMIT_NOFILE), flags);4 }5 EXPO
[Linux][Kernel] BUG 매크로
BUG 매크로는 보통 소프트웨어적으로 심각한 오류 상태라 더는 실행할 수 없다고 판단할 때 호출 합니다. 혹시 소프트웨어 공학에서 ASSERT란 단어 들어 보신 적 있나요? 보통 포인터가 NULL일 때 ASSERT를 호출하죠. 예제 코드는 다음과 같습니다.void trace_kernel_process_name(void *param){ if( !param ) ASSERT(1); printk(“ process name: %s pid: %d \n”, current->comm, current->pid)} 리눅스 커널에서는 ASSERT 대신 BUG()를 씁니다. 그리고 panic이란 함수도 비슷한 역할을 수행합니다.BUG나 panic이란 함수를 호출하면 커널 크래시가 발생하는 것이지요.
[Linux][Kernel] WARN 매크로
WARN 매크로는 코드 흐름에 소프트웨어적인 오류가 있을 때 실행합니다. 그래서 소스 코드를 보다가 WARN() 매크로를 보면 뭔가 논리적인 오류가 있는 조건이라고 봐야겠죠. WARN 매크로를 어떤 함수에서 실행되면 시스템 정보를 커널 로그로 출력합니다.1. 콜스택2. 현재 수행 중인 프로세스 정보: CPU번호, 프로세스 이름, pid3. 함수 이름과 라인 정보 하지만 커널 시스템에 심각한 오류가 있는 상태가 아니라 판단해서 에러 메시지만 출력하고 시스템을 계속 구동시킵니다. 그럼 새로운 드라이버 코드를 짰는데 WARN 매크로가 실행되면 어떻게 해야 할까요? 시스템에 치명적인 에러는 아니라 그냥 둬야 할까요? 그렇지 않습니다. WARN 매크로는 시스템에 뭔가 논리적인 오류가 있는 상태이므로 반드시 잡아
[Linux][Kernel] container_of 매크로
이번에는 container_of란 매크로를 배워볼게요. 커널 코드에서 current 매크로 못지않게 많이 활용하는 매크로이니 잘 알아야겠죠. 그럼 다음 샘플 코드를 함께 보면서 container_of란 매크로을 어떻게 활용하는지 살펴볼까요? 다음 wq_barrier_func 함수를 예를 들까요? container_of를 써서 struct wq_barrier *barr 로컬 변수에 어떤 값을 대입하고 있죠.static struct workqueue_struct *dev_to_wq(struct device *dev){ struct wq_device *wq_dev = container_of(dev, struct wq_device, dev); return wq_dev->wq;} 위 코드를 읽기 전에 우

