Guillermo Austin Kim

Sources

Posts

998 posts

[ARM] tst 명령어를 실행하면 ARM CPSR 레지스터가 어떻게 변경될까?

Guillermo Austin Kim|2019년 2월 21일

tst 명령어는 연산자와 비연산자 사이 AND 비트 연산을 수행합니다. AND 비트 연산 결과에 따라 CPSR 레지스터 Z 비트는 다음과 같이 변경됩니다.Z: 0 ( AND 비트 연산 결과가 1인 경우)Z: 1 ( AND 비트 연산 결과가 0인 경우) tst 명령어가 위와 같이 동작하는지 증명하기 위해 T32 디버거를 실행해 보겠습니다.다음 화면은 tst 명령어를 실행하기 직전입니다. NSR:80107E6C|ret_to_user_from_irq: ldr r2,[r9,#0x8]NSR:80107E70| cmp r2,#0x7F000000 ; r2,#2130706432NSR:80107E74|

[리눅스커널] 워크큐: 딜레이 워크는 누가 언제 호출할까?

Guillermo Austin Kim|2019년 2월 21일

이전 소절에서는 schedule_delayed_work() 함수를 호출하면 동적 타이머를 실행해서 지정한 지연 시각 후에 동적 타이머 핸들러인 delayed_work_timer_fn() 함수가 실행되도록 한다고 했습니다. 이번 소절에서는 delayed_work_timer_fn() 함수가 어떻게 호출되는지 살펴봅니다. delayed_work_timer_fn() 함수는 언제 실행할까요? 동적 타이머 만료 시각에 도달하면 Soft IRQ 컨택스트에서 delayed_work_timer_fn() 함수를 호출합니다. Soft IRQ 전체 구조와 흐름은 8장(커널 타이머)에서 상세히 다룹니다. Soft IRQ 개념이 익숙하지 않은 분은 8장을 먼저 읽고 오시면 됩니다. 먼저 delayed_work_ti

[리눅스커널][스케줄링] 선점 스케줄링 지연 함수 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