Linux
-
인터럽트 후반부 처리 / 워크큐Linux/Linux Kernel 2020. 9. 13. 13:29
워크큐 구성요소 워크 워크(워크 핸들러)는 실행단위다. 워커 스레드(워커 스레드 핸들러; woker_thread())가 워크를 실행한다. 워커 스레드 워커 스레드(워커 스레드 핸들러; woker_thread())가 워크(워크 핸들러)를 실행한다. 워커 풀 워크를 큐잉한 워크 리스트를 관리한다. 워커 스레드를 생성하면서 관리한다. 그래서 큐잉된 워크의 개수나 실행 중인 워커 스레드의 개수를 워커 풀로 부터 알 수 있다. 풀워크큐 풀워크큐는 워커 풀을 통해 워크와 워커 스레드를 관리한다. 워크큐 안에 *per_cpu 포인터 구조체 필드인 풀워크큐가 있고 풀워크큐안에 포인터 구조체 필드인 워커풀이 있고 워커풀안에 워크를 관리할 연결리스트 구조체 필드와 워커 스레드를 관리할 연결리스트 구조체 필드가 있다. ※ ..
-
디바이스 드라이버 / 디바이스의 제어Linux/Linux Device Driver 2020. 9. 1. 22:55
하드웨어에 데이터를 써넣을 때는 write() 함수를, 반대로 하드웨어에서 발생한 데이터를 읽을 때는 read() 함수를 이용한다. 하지만 read와 write만으로 하드웨어를 제어할 수 없는 경우도 종종 발생한다. 그래서 리눅스 커널은 ioctl이라는 방식을 제공한다. ioctl() 함수는 디바이스 파일 이외에는 사용할 수 없는 디바이스 파일 전용 함수이므로 각 디바이스다마다 고유하게 선언하여 사용한다. 그래서 read()함수와 write() 함수 같이 정형화된 형태를 기본적으로 유지하지만 사용 방법은 다비아스마다 모두 다르다. 개념적인 xxx_ioctl 구성 static long xxx_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { ..
-
디바이스 드라이버 / 인터럽트 처리Linux/Linux Device Driver 2020. 9. 1. 12:46
/dev/mem 등 디바이스 파일을 이용하면 root 권한을 갖는 응용 프로그램에서도 하드웨어를 제어할 수 있지만, 인터럽트 만큼은 디바이스 드라이버를 이용해야 한다. 인터럽트 서비스 함수의 형식 #include // 커널 디렉터리/include/linux/interrupt.h irqreturn_t (*irq_handler_t)(int, void *) // 인터럽트 서비스 함수 인터럽트 서비스 함수의 반환값 #include // 커널 디렉터리/include/linux/irqreturn.h enum irqreturn{ IRQ_NONE // intterupt was not from this device or was not handled IRQ_HANDLED // interrupt was handled by ..
-
디바이스 드라이버 / 시간 처리와 커널 타이머Linux/Linux Device Driver 2020. 9. 1. 12:45
디바이스 드라이버를 작성하다 보면 시간에 따른 여러 가지 처리가 필요하다. 커널은 이런 시간에 따른 처리를 하기 위해 jiffies라는 전역 변수를 여러 시간의 기준이 되는 시간값으로 사용하고 있다. 디바이스 드라이버는 이 기준값을 이용하여 상대적인 시간의 흐름을 측정하고, 그에 따라 하드웨어를 제어하게 된다. HZ: 1초당 발생되는 타이머 인터럽트 횟수 USER_HZ: HZ값을 보정하는 수 jiffies: 초당 HZ 만큼 증가하는 전역 변수 jiffies_64: 초당 HZ 만큼 증가하는 전역 변수 get_giffies_64(): jiffies_64를 참조하기 위한 함수 #include : 커널 디렉터리/include/linux/jiffies.h u64 get_jiffies_64(void) +#inclu..