ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • PIT [작성중]
    프로젝트/운영체제 만들기 2023. 5. 29. 19:41

    글의 참고

    - https://en.wikipedia.org/wiki/Intel_8253

    - https://en.wikipedia.org/wiki/Programmable_interval_timer

    - https://web.archive.org/web/20161122073424/http://www.intel.com:80/design/archives/periphrl/docs/7203.htm

    - https://stackoverflow.com/questions/20712085/rtc-vs-pit-for-scheduler

    - https://en.wikipedia.org/wiki/High_Precision_Event_Timer

    - https://en.wikipedia.org/wiki/System_time

    - http://www.osdever.net/bkerndev/Docs/pit.htm

    - https://en.wikibooks.org/wiki/X86_Assembly/Programmable_Interval_Timer

    - https://en.wikipedia.org/wiki/Hertz


    글의 소개 및 목적


    글의 전제

    - 내가 글을 쓰다가 궁금한 점은 파란색 볼드체로 표현했다. 나도 모르기 때문에 나중에 알아봐야 할 내용이라는 뜻이다.

    - 밑줄로 작성된 글은 좀 더 긴 설명이 필요해서 친 것이다. 그러므로, 밑 줄 처친 글이 이해가 안간다면 링크를 따라서 관련 내용을 공부하자.

    - `글의 참조`에서 빨간색 볼드체로 체크된 링크는 이 글을 작성하면 가장 많이 참조한 링크다.

    - `운영체제 만들기` 파트에서 퍼온 모든 참조 글들과 그림은 반드시 `이 글과 그림을 소스 코드로 어떻게 구현을 해야할까` 라는 생각으로 정말 심도있게 잠시 멈춰서 생각해봐야 실력이 발전한다.


    글의 내용

    - 동작 설명

    : 전원이 인가되면 8254 칩은 `undefined` 상태다. 모드, 카운팅 값, 아우

     

    : Timer0(Counter0)는 `timekeeping interrupt` 용으로 사용되고, Timer1은 `Refresh for DRAM memory` 용으로 사용되고, Timer2는 `PC Counter` 용으로 사용되었다. 대개 Timer1는 거의 커스텀이 불가능해서 사용하지 않고, 0과 2를 주로 사용한다. 시스템 프로그래머들에게는 Timer0이 가장 중요하다. 주로, 프로세스 스케줄링 관련해서 사용하기 때문이다. 

     

    : Timer0에게는 I/O Port 40h ~ 43h가 할당되고, Timer1에게는 50h ~ 53h가 할당되었다.

     

     

    - 주파수 분배기(Frequency divider)

    : 타이머에서 주파수 분배기는 기본 주파수를 더 작은 주파수들로 쪼개기 위해서 사용된다. 주파수를 왜 쪼갤까? 세상에 존재하는 모든 디바이스는 동일한 주파수(클락)으로 동작하지 않는다. 각 디바이스가 만들어질 때, 동작에 필요한 주파수는 정해져있다. 그리고 각 디바이스에 맞는 주파수를 제공해야 올바르게 동작한다. 타이머에서는 `tick`의 발생시점을 조절하기 위해서 분배기관련 레지스터(카운터 레지스터)를 사용한다.

    A `frequency divider`, also called a `clock divider` or `scaler` or `prescaler`, is a circuit that takes an input signal of a frequency, `f{in}`, and generates an output signal of a frequency:

    `f{out} = f{in} / n`

    where `n` is an integer. Phase-locked loop frequency synthesizers make use of frequency dividers to generate a frequency that is a multiple of a reference frequency. Frequency dividers can be implemented for both analog and digital applications.
    ....

    - 참고 : https://en.wikipedia.org/wiki/Frequency_divider

     

    : 1Hz란 초당 주파수가 한 번 발생한다는 것을 의미한다. PIT의 기본 주파수는 `1193182Hz`다. 이 값을 카운트 레지스터에 작성된 값으로 나눠서 1초에 몇 번 tick(1초에 발생하는 타이머 인터럽트 횟수)을 하는지를 계산한다. 데이터 레지스터는 16비트다. 최대 65,536 값이 될 수 있다. 실제로 16비트면 최대값은 65,535 지만, 데이터 레지스터에 0을 쓰면 65,536으로 설정하도록 되어 있다. BIOS는 초기 부팅시에 주파수를 18.2065HZ가 되도록 설정한다(1193182 / 65,356). 즉, 카운트 레지스터에 0을 씀으로서, 1초에 18번의 타이머 인터럽트가 발생하게 된다. 1초에 18번의 인터럽트가 발생하니, 이러면, IRQ0는 54.9254ms 간격으로 한 번씩 발생한다고 볼 수 있다(1 / 18).

     

    - PIT vs RTC

    : PIT와 RTC 중에서는 선점형 스케줄러의 타이머로는 PIT를 많이 쓴다고 한다. 주로, 시간을 관리하는 용으로 RTC를 사용한다. 그 이유는 PIT가 RTC 보다 더 빠른 주파수를 갖기 때문이다. 그리고 PIT의 타이머 인터럽트가 PIC의 인터럽트 우선순위가 높아서 다른 인터럽트에게 선점되지 않는다.

     

    : 그러나 현대의 운영 체제는 각 CPU 코어마다 Local-APIC 타이머를 가지고 있어서 그걸 사용한다. 물론, x86 아키텍처를 기준으로 한다. 그리고 시간은 HPET 라는 타이머를 사용해서 PIT와 RTC를 대체하는 듯 하다. 이미, PIT와 RTC는 구식이라고 보는 것 맞다.

    '프로젝트 > 운영체제 만들기' 카테고리의 다른 글

    커널 이미지  (0) 2023.05.31
    페이징  (0) 2023.05.30
    [운영체제 만들기] Exception  (0) 2023.05.25
    [운영체제 만들기] 에러 사항  (0) 2023.05.24
    [운영체제 만들기] 문자열 - 라이브러리  (0) 2023.05.18
Designed by Tistory.