본문 바로가기
전공/시스템 프로그래밍

[시스템 프로그래밍 3-6] 입출력 시스템

by 뜨거운 개발자 2023. 3. 20.

입출력 시스템

입출력을 위해서 현대적인 컴퓨터 시스템에서는 우리는 하드웨어에 직접적으로 접근할 필요는 없다.

입출력을 통제하는 시스템 즉 os가 제공하는 fuction 들을 사용함으로써 i/o들이 일어나는 것이 일반적이다

i/o 는 서로 다른 입출력 레벨을 가지고 있다.

하드웨어에 직접 액세스하여 I/O를 수행할 필요는 없습니다. 대신 OS에서 제공하는 함수를 호출할 수 있습니다.

3가지의 입출력 레벨

1. High-level language functions

  • c/c++/java등 언어를 말하는 것인데 여기서 사용하는 input output을 위한 함수들을 사용을 한다.(ex : printf)
  • 이렇게 언어에서 제공하는 함수를 활용해서 입출력을 할 수가 있다.
  • 이런 함수들을 사용하면 대부분 이식성이 높다. 즉 시스템과 운영체제에 종속되는게 아니라 범용적으로 사용할 수 있는 것이다.

2. OS

프로그래머는 API(애플리케이션 프로그래밍 인터페이스)로 알려진 라이브러리에서 OS 함수를 호출할 수 있습니다.
– OS는 높은 수준의 작업을 제공합니다.

  • " 파일에 문자열 쓰기
  • " 키보드에서 문자열 읽기
  • " 메모리 블록 할당

이런 건 사실 high level 함수에서도 제공을 하고 있지만 운영체제에서도 이런걸 제공하는 API가 있다는 사실이 있다.

3. BIOS

  • 하드웨어 장비들과 직접적인 컨트롤이 가능한 루틴들을 제공하고 있다.
  • 주로 설계사(제조업체)에서 특정 하드웨어에 딱 맞도록 설계되어있다.
  • 일반적으로 운영체제가 BIOS와 communicate해서 많은 것들을 처리한다.

디바이스 드라이버

디바이스 드라이버란 프로그램들의 집합으로 볼 수 있는데 운영체제가 하드웨어 장치나 시스템 바이어스에 직접적으로 접근 할 수 있도록 하는 프로그램들의 집합을 디바이스 드라이버라고 부른다.

어떤 디바이스 드라이버가 운영체제로 부터 데이터를 읽으라는 요청을 받을 수 있는데, 이러면 디바이스 드라이버가 디바이스 펌웨어에 있는 코드를 실행함으로써 요청받은 것을 처리할 수 있게 된다.

디바이스 펌웨어에 있는 실행할 수 있는 코드들은 특정 디바이스에서 동작하도록 하는 명령을 내린다.

디바이스 드라이버는 2가지 형식으로 설치가 된다.

  1. 컴퓨터에 하드웨어가 붙기전에 설치되는 방식
  2. OS가 장치 이름과 서명을 인식합니다. 그런 다음 장치 드라이버 소프트웨어를 찾아 설치합니다.

현대적 컴퓨터에서는 거의 대부분 운영체제가 직접 그 디바이스에 맞는 드라이버를 설치가 된다. 즉 2번 방식이 많은 것이다.

입출력 계층IO hierarchy 예시

예시: 어떤 어플리케이션이 화면에 문자열을 출력하는 경우

  1. 프로그램 (어플리케이션)에서 코딩이 된 high level 언어에서의 함수를 호출한다.(문자열 출력함수 - printf 등)
  2. 라이브러리 함수(레벨 3)가 문자열을 전달하여 OS함수(시스템 마다 다른 함수)를 호출한다. 출력하고자 하는 문자열의 위치를 포인터로 운영체제에게 넘겨주면서 하게된다.
  3. 운영체제에서 제공하는 함수(레벨 2)가 바로 하드웨어에 엑세스 한다고 생각할 수 있지만 그렇지 않다. 운영체제에게 맞물릴 수 있는 하드웨어의 종류가 매우 많을 것이기 때문에 그것들은 운영체제가 다 컨트롤 하는 게 아니라 바이어스를 지나가게 된다.
    1. 운영체제에서 문자를 출력하기 위해서 루프를 사용해서 바이어스 함수를 호출하게 된다.
    2. 아스키 코드와 색상에 대한 정보를 넘겨준다.
    3. 그리고 루프를 계속해서 돌면서 메모리에 있는 문자들을 쭉 바이어스에게 넘겨주게 된다.
    4. 다 넘겨주고 나서 커서를 스크린의 다음 좌표로 넘겨주는 걸 바이어스에서 호출한다.
  4. 바이어스 입장(레벨 1) 에서는 루프를 통해서 문자 하나씩 운영체제로 부터 전달을 받았기 때문에 그 문자들을 시스템 폰트에 맵핑을 해주고 그리고 비디오 컨트롤러 카드에 연결된 디바이스 포트에다가 캐릭터들을 보내주는 작업을 한다.
  5. 마지막으로 디바이스포트에 맞물린 디바이스 컨트롤러가 컨트롤 하는 비디오 카드(레벨 0)로 신호(하드웨어 시그널을 만들어서)를 보내주게 된다. 그렇게 되면 비디오는 디스플레이는 픽셀을 보여준다.

여러 수준에서 프로그래밍

• 어셈블리 언어 프로그램은 IO 프로그래밍 영역에서 강력한 성능과 유연성을 제공합니다.

어셈블리 언어 프로그래밍은 다양한 레벨을 선택할 수 있다는 장점이 존재한다.

  • 레벨 3 (고급프로그래밍 언어 함수)아까 말한대로 하이레벨 수준의 함수를 사용하는 선택
  • 레벨 2(운영체제 API) ( 운영체제 단에서 제공하는 API호출 방식
    • 이렇게 하면 운영체제단에서 사용하는 그래픽(GUI)을 사용을 할 수가 있다.
  • 레벨 1 ( 바이어스 함수) : 바이어스 단으로 바로 접근을 해서 바이어스에서 제공을 하는 특정한 계열의 하드웨어들에 대해서 동작할 수 있도록 하는 함수들을 직접적으로 호출을 할 수가 있게 된다.
  • 레벨 0 : 특정 하드웨어에 직접적으로 엑세스 해서 하드웨어에 직접적으로 명령을 내릴 수 있다. 하드웨어의 자원을 모두 다 사용할 수 있다는 강력한 장점이 있지만, 이 방식을 portable하지 않다는 단점이 존재한다. 다른 하드웨어에서는 사용할 수 없다는 게 있고 만약 i/o만 어셈블리로 짰다면 그 부분만이라도 커스터마징이 필요하다.

그렇다면 낮은 레벨을 써야하는 이유가 무엇인가 바로 레벨에 따른 tradeoff

레벨이 올라가면 control 이 줄지만 이식성이 올라가고 그것이 서로 충돌한다.

운영체제에서 제어(레벨 2)

이런 경우에는 같은 운영체제에서 다 사용할 수 있기 때문에 이식성이 높다고 말할 수는 있지만 하드웨어가 운영체제에서 아직 지원하지 않는 기능들이 있다면 그것을 사용할 수 없기 떄문에 컨트롤은 많이 줄어들게 된다.

운영체제가 더 아래 레벨로 내려가기 때문에 시간이 조금 더 걸리게 된다.(아주아주 적지만 약간의 차이가 존재)

  • OS 함수를 호출하여 일반 텍스트 입출력 및 파일 기반 입출력을 수행합니다.
  • OS가 GUI를 사용하는 경우 장치에 독립적인 방식으로 그래픽을 표시하는 기능이 있습니다.

바이어스 레벨에서 (레벨 1)

  • 해당 바이어스를 사용하고 있는 경우는 모두 동일하다.
  • 다만 같은 바이어스더라도 항상 동일한 결과를 보장하지는 않는다.
  • BIOS 기능을 호출하여 색상, 그래픽, 사운드, 키보드 입력 및 로우 레벨 디스크 I/O와 같은 장치별 기능을 제어합니다. 
    • 예를 들어서 해상도가 다 다르기 때문에 그런 경우에는 해상도를 직접 설정을 해줘야한다.
  • bios 레벨이 OS 레벨보다 portability가 더 낮은 반면 control의 범위가 더 넓습니다. IO access level을 bios 레벨로 하게 되면 같은 bios를 사용하는 시스템으로 제한되기 때문에, bios에 상관없이 IO를 제공할 수 있는 OS레벨보다 portability가 떨어질 수 밖에 없습니다

여러 수준에서 프로그래밍

• 단점
– 제어 대 휴대성

  • 레벨 2(OS)
    • 동일한 OS를 실행하는 모든 컴퓨터에서 작동
    • I/O 장치에 특정 기능이 부족한 경우, OS는 의도한 결과에 근접하기 위해 최선을 다합니다.
    •  레벨 2는 각 I/O 호출이 실행되기 전에 여러 계층을 거쳐야 하기 때문에 특별히 빠르지는 않습니다.
  • " 레벨 1(BIOS)
    •  표준 BIOS를 사용하는 모든 시스템에서 작동하지만 모든 시스템에서 동일한 결과를 생성하지는 않습니다.
    •  예) 두 대의 컴퓨터에 해상도 기능이 다른 비디오 디스플레이가 있을 수 있습니다. 레벨 1 프로그래머는 사용자의 하드웨어 설정을 감지하고 그에 맞게 출력 형식을 조정하는 코드를 작성해야 합니다.레벨 1은 하드웨어보다 한 단계 위에 있기 때문에 레벨 2보다 빠르게 실행됩니다.
  • 레벨 0(하드웨어)
    • 직렬 포트와 같은 일반 장치 및 알려진 제조업체에서 생산한 특정 I/O 장치와 함께 작동합니다.
    • 이 레벨을 사용하는 프로그램은 다양한 I/O 장치를 처리할 수 있도록 코딩 로직을 확장해야 합니다.
    • 이 수준의 프로그램은 하드웨어가 허용하는 한 빠르게 실행됩니다.
728x90