workqueue 예제

이렇게 하려면 워크큐를 사용하여 alloc_io()를 호출할 수 있습니다. 타이머 처리기에서 작업 항목을 예약 작업 처리기에서 작업 처리기 (프로세스 컨텍스트에서 실행) alloc_io()를 호출 합니다. 스켈레톤에서 TODO 3로 표시된 섹션을 따르고 필요한 경우 작업 대기열 섹션을 검토합니다. 타이머를 사용하는 데 자주 실수는 타이머를 끄는 것을 잊어 버린다는 것입니다. 예를 들어 모듈을 제거하기 전에 모듈을 제거한 후 타이머가 만료되면 처리기 함수가 더 이상 커널에 로드되지 않고 커널 oops가 생성되므로 타이머를 중지해야 합니다. 나는 이전 인터럽트 예제 자습서에서 소스 코드를했다. 그 소스 코드에서, 우리는 /dev / etx_device 인터럽트를 읽을 때 (리눅스에서 인터럽트를 이해하려면이 튜토리얼로 이동). 인터럽트 안타가 나을 때마다 작업 대기열로 작업을 예약합니다. 그것은 튜토리얼 게시물이기 때문에 인터럽트 처리기 및 워크 큐 함수 모두에서 작업을 수행하지 않을 것입니다. 그러나 실제 작업 대기열에서는 이 함수를 사용하여 예약해야 하는 모든 작업을 수행할 수 있습니다. [11213.943071] 주요 = 246 마이너 = 0 [11213.945181] 장치 드라이버 삽입… 수행!!! [11217.255727] 장치 파일 열기…!!! [11217.255747] 읽기 기능 [11217.255783] 공유 IRQ: 인터럽트 발생 [11217.255845] 작업 대기열 기능 실행 [11217.255860] 장치 파일 닫힘…!!! Linux 커널에서 Workqueue를 구현하는 방법에는 두 가지가 있습니다.

작업 큐는 프로세스 컨텍스트에서 실행되도록 작업을 예약하는 데 사용됩니다. 작업하는 기본 단위를 작업이라고 합니다. 두 가지 유형의 작업이 있습니다: 다음은 cancel_work_sync https://github.com/cirosantilli/linux-kernel-module-cheat/blob/ad077d3943f79c0f6481dab929970613c33c31a7/kernel_module/workqueue_cheat.c 커널 스레드를 사용하는 최소한의 작업 예제입니다. 이 함수로 생성됩니다(TASK_INTERRUPTible 상태). 커널 스레드를 시작하려면 wake_up_process(): schedule_delayed_work()를 호출하여 지정된 지연으로 실행을 위한 작업 항목을 계획할 수 있습니다. 지연 시간 단위는 jiffies입니다. 당신은 생명의 은인, arxchruncher, 나는 내 커널이 추락 이유를 알아 내려고 한 시간을 보냈다. 커널 맨테인은 jiffies 전역 변수 또는 매크로를 통해 액세스할 수 있는 마지막 부팅 이후의 jiffies 수를 포함하는 카운터를 맨테인합니다.

나중에 타이머에 대한 시간을 계산하는 데 사용할 수 있습니다: 다음 시퀀스는 추가 작업 큐를 선언하고 초기화하고 작업 항목을 선언하고 초기화하고 큐에 추가합니다. 커널 스레드는 워크큐 메커니즘의 기초입니다. 기본적으로 스레드 커널은 커널 모드에서만 실행되며 사용자 주소 공간이나 다른 사용자 특성이 없는 스레드입니다. 이를 사용하기 전에 작업 항목을 초기화해야 합니다.

Comments are closed