커널

포스트: 228|조회수: 0|CIVILIZATION
Items

Posts

228 posts

[리눅스커널][스케줄링] 선점 스케줄링 지연 함수 preempt_enable()/preempt_disable() 소개

Guillermo Austin Kim|2019년 2월 14일

선점 스케줄링 지연 함수 preempt_enable()/preempt_disable() 소개 리눅스 커널에서 선점 스케줄링을 동작을 잠시 지연할 수 있는 함수를 지원합니다. preempt_disable(): 선점 지연 활성화preempt_enable(): 선점 지연 비활성화 preempt_disable() 함수 이름은 "선점"을 의미하는 "preempt" 단어에 "불능"란 단어인 "disable"의 조합입니다.즉, preempt_disable() 함수를 실행하면 선점 스케줄을 지연할 수 있습니다. 마찬가지로 preempt_enable() 함수를 실행하면 선점 스케줄링을 활성화합니다. preempt_disable() 함수와 preempt_enable() 함수의 기본 원리를 알아보기 앞서 커널

[리눅스커널] 워크큐(workqueue): 딜레이 워크 실행는 어디서 실행을 시작할까?

Guillermo Austin Kim|2019년 2월 13일

딜레이 워크를 실행하려면 어떤 함수를 호출해야 할까요? schedule_delayed_work() 함수를 실행하면 됩니다. 먼저 딜레이 워크를 실행하는 드라이버 코드를 소개하겠습니다.[https://elixir.bootlin.com/linux/v4.14.43/source/drivers/mmc/host/bcm2835.c]1 static2 bool bcm2835_send_command(struct bcm2835_host *host, struct mmc_command *cmd)3 {...3 if (!cmd->data && cmd->busy_timeout > 9000)4 timeout = DIV_ROUND_UP(cmd->busy_timeout, 1000) * HZ + HZ;5

[리눅스커널] 인터럽트 후반부 처리: setup_irq_thread() 함수 분석

Guillermo Austin Kim|2019년 2월 12일

이어서 IRQ 스레드를 생성 역할을 수행하는 setup_irq_thread() 함수를 분석하겠습니다.1 static int2 setup_irq_thread(struct irqaction *new, unsigned int irq, bool secondary)3 {4struct task_struct *t;5struct sched_param param = {6.sched_priority = MAX_USER_RT_PRIO/2,7};89if (!secondary) {10t = kthread_create(irq_thread, new, "irq/%d-%s", irq, 11 new->name);12} else {13t = kthread_create(irq_thread, new, "i

[리눅스커널][워크큐] 딜레이 워크(delayed_work) 소개

Guillermo Austin Kim|2019년 2월 12일

딜레이 워크 소개 워크큐는 대표적인 커널 후반부 처리 기법으로 후반부 처리 코드를 워크 핸들러에서 실행합니다. 동기적으로 처리 할 필요가 없는 코드를 워크 핸들러에 위치시켜 비동기적으로 커널 쓰레드 레벨에서 처리하는 겁니다. 이런 구조로 드라이버를 설계하면 다양한 디바이스 드라이버 시나리오에 맞게 코드를 구성할 수 있습니다. 워크에서 유연성을 추가한 기법이 딜레이 워크입니다. 딜레이 워크란 무엇인가? 구체적으로 딜레이 워크란 무엇일까요? 딜레이 워크는 워크를 일정 시각(HZ 단위) 후에 지연시켜 실행합니다. 여기서 말하는 지연 시각은 디바이스 드라이버 시나리오에 맞게 변경할 수 있습니다. 라즈베리파이에선 진동수인 HZ는 100입니다. 예를 들어 다음 온도를 콘트롤하는 드라이버 시나리오를 생