life is egg

[PINTOS] 타이머 인터럽트의 주체는 본문

sw정글/C

[PINTOS] 타이머 인터럽트의 주체는

삶은계란진재혁 2024. 4. 29. 11:07

타이머 인터럽트

 

무엇이길래 다른 스레드나 프로세스가 코어를 점유하고 있어도 "timer_interrupt" 코드를 실행 시켜주는 지 궁금해졌다.

 

일단 찾아본 바로는

 

  • 타이머 하드웨어에 의해서 인터럽트가 발생 , 즉 타이머 인터럽트의 주체는 하드웨어 타이머
  • 하드웨어 타이머가 인터럽트 신호를 CPU에게 보냄, 현재 작업 잠시 중단 
  • 운영체제의 인터럽트 핸들러 or 인터럽트 서비스 루틴 을 실행하도록 요청
  • 해당 인터럽트에 실행 될 코드 실행,
  • 위의 과정은 모두 시스템의 커널 모드에서 실행, 즉 타이머 인터럽트는 하드웨어 타이머에 의해 발생하지만, 실제로는 인터럽트를 처리하는 코드(인터럽트 핸들러)는 운영체제 커널에 의해 실행.

 

타이머 인터럽트가 발생되면 실행되는 코드 이다

/* Timer interrupt handler. */
static void
timer_interrupt(struct intr_frame *args UNUSED)
{
	ticks++;
	thread_tick();
}

 

어디서 사용되는지 찾아보면

 

타이머 초기화시 intr_register_ext() 함수의 파라미터로 들어간다 .

void timer_init(void)
{
	/* 8254 input frequency divided by TIMER_FREQ, rounded to
	   nearest. */
	uint16_t count = (1193180 + TIMER_FREQ / 2) / TIMER_FREQ;

	outb(0x43, 0x34); /* CW: counter 0, LSB then MSB, mode 2, binary. */
	outb(0x40, count & 0xff);
	outb(0x40, count >> 8);

	intr_register_ext(0x20, timer_interrupt, "8254 Timer");
}

 

intr_register_ext()

무었이냐 이름만보면 외부 인터럽트 신호를 등록해주는 그런 느낌적인 느낌..

 

코드를 보면

/* Registers external interrupt VEC_NO to invoke HANDLER, which
   is named NAME for debugging purposes.  The handler will
   execute with interrupts disabled. */
void intr_register_ext(uint8_t vec_no, intr_handler_func *handler,
					   const char *name)
{
	ASSERT(vec_no >= 0x20 && vec_no <= 0x2f);
	register_handler(vec_no, 0, INTR_OFF, handler, name);
}
  • vev_no  :  인터럽트 핸들러의 위치를 가리키는 인덱스
  • intr_handler_func : 해당 인터럽트에 실행시킬 함수
  • name : 디버깅시 구분편하라고 설정한 이름

intr_register_ext() 함수 내부에서 이제 찐으로 register_handler()를 호출하는데, 이 이상으로 살펴볼 마음은 안들지만..

register_handler의 파라미터중 INTR_OFF 가 들어간다는 것은 볼만한 정보 인듯하다

해당 인터럽트의 인터럽트 핸들러가 실행될 때 다른 인터럽트 요청을 차단해서. 핸들러 실행의 안정성과 신뢰성을 보장 할 수있기 때문


타고 타고 타고 들어가다보면 매크로를 만나게됨

 

IDT(Interrupt Descriptor Table)에 인터럽트 핸들러를 손쉽게 등록하게 해주는 매크로 무튼 그렇다.

 


 

결국 타이머 인터럽트의 주체는 하드웨어 타이머이고 그것을 처리하는건 운영체제의 커널..!

'sw정글 > C' 카테고리의 다른 글

[PINTOS] 구조체 초기화  (0) 2024.05.21
[PINTOS] syn_read 와... 인터럽트 검증 관련 오류  (0) 2024.05.14
[PINTOS] priority conditon variable test  (0) 2024.05.03
[Malloc] Implict  (0) 2024.04.18
[Malloc] Malloc Lab 개요  (0) 2024.04.14
Comments