입출력 시스템
입출력을 위해서 현대적인 컴퓨터 시스템에서는 우리는 하드웨어에 직접적으로 접근할 필요는 없다.
입출력을 통제하는 시스템 즉 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가지 형식으로 설치가 된다.
- 컴퓨터에 하드웨어가 붙기전에 설치되는 방식
- OS가 장치 이름과 서명을 인식합니다. 그런 다음 장치 드라이버 소프트웨어를 찾아 설치합니다.
현대적 컴퓨터에서는 거의 대부분 운영체제가 직접 그 디바이스에 맞는 드라이버를 설치가 된다. 즉 2번 방식이 많은 것이다.
입출력 계층IO hierarchy 예시
예시: 어떤 어플리케이션이 화면에 문자열을 출력하는 경우
- 프로그램 (어플리케이션)에서 코딩이 된 high level 언어에서의 함수를 호출한다.(문자열 출력함수 - printf 등)
- 라이브러리 함수(레벨 3)가 문자열을 전달하여 OS함수(시스템 마다 다른 함수)를 호출한다. 출력하고자 하는 문자열의 위치를 포인터로 운영체제에게 넘겨주면서 하게된다.
- 운영체제에서 제공하는 함수(레벨 2)가 바로 하드웨어에 엑세스 한다고 생각할 수 있지만 그렇지 않다. 운영체제에게 맞물릴 수 있는 하드웨어의 종류가 매우 많을 것이기 때문에 그것들은 운영체제가 다 컨트롤 하는 게 아니라 바이어스를 지나가게 된다.
- 운영체제에서 문자를 출력하기 위해서 루프를 사용해서 바이어스 함수를 호출하게 된다.
- 아스키 코드와 색상에 대한 정보를 넘겨준다.
- 그리고 루프를 계속해서 돌면서 메모리에 있는 문자들을 쭉 바이어스에게 넘겨주게 된다.
- 다 넘겨주고 나서 커서를 스크린의 다음 좌표로 넘겨주는 걸 바이어스에서 호출한다.
- 바이어스 입장(레벨 1) 에서는 루프를 통해서 문자 하나씩 운영체제로 부터 전달을 받았기 때문에 그 문자들을 시스템 폰트에 맵핑을 해주고 그리고 비디오 컨트롤러 카드에 연결된 디바이스 포트에다가 캐릭터들을 보내주는 작업을 한다.
- 마지막으로 디바이스포트에 맞물린 디바이스 컨트롤러가 컨트롤 하는 비디오 카드(레벨 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 장치를 처리할 수 있도록 코딩 로직을 확장해야 합니다.
- 이 수준의 프로그램은 하드웨어가 허용하는 한 빠르게 실행됩니다.
'CSE > system programing' 카테고리의 다른 글
[시스템 프로그래밍 5-1] 어셈블리 기본 데이터 타입 (0) | 2023.03.30 |
---|---|
[시스템 프로그래밍 4강] 어셈블리 언어 문법 및 구성요소 (0) | 2023.03.30 |
[시스템 프로그래밍 3-5] 전형적인 X86 컴퓨터의 구성요소(마더보드, 메모리) (1) | 2023.03.20 |
[시스템 프로그래밍 3- 4] 64-Bit x86-64 Processors (0) | 2023.03.20 |
[시스템 프로그래밍 3-3] 32 bit X86 processor의 메모리 관리 (0) | 2023.03.20 |