디바이스 컨트롤러, 디바이스 드라이버, ssd 컨트롤러란? 개념 정리



컴퓨터를 사용하면 많은 장치들(ssd/hdd 외장하드, ssd/hdd 내장하드, usb 플래시 저장매체, usb 허브 등)을 컴퓨터에 꽂아서 사용합니다. 혹은, 이미 많은 장치들이 컴퓨터에 꽂힌 상태로 사용하고 있습니다. 이러한 많은 장치들은 컴퓨터와 어떻게 소통할 수 있을까요?? 정답은 바로 디바이스 컨트롤러와 디바이스 드라이버, 장치 내부의 컨트롤러가 있기 때문입니다.

1. 컴퓨터 내부의 버스와 디바이스 컨트롤러의 구조

image Bus and Computer Architecture

컴퓨터 내부의 버스와 컨트롤러는 위와 같은 구조를 이루고 있습니다. 컴퓨터 내부의 장치들이 서로 소통을 하기 위해서는 데이터 선이 필요한데 이를 bus라고 하고, 최근에는 PCI bus를 많이 사용하고 있습니다. bus들은 여러가지 종류가 있는데, PCI는 그 중에 하나입니다.

컴퓨터는 PCI bus를 중심으로 여러가지 프로토콜의 데이터를 주고받을 수 있어야 합니다. 장치마다 모두 사용하는 bus의 종류가 다르기 때문입니다. 비교적 저속의 데이터를 주고 받기 위해서는 expansion bus를 사용하고, SCSI bus와 같은 경우는 SCSI 프로토콜을 가진 장치들이 데이터를 송수신할 때 사용합니다. 이외에도 모니터와 프로세서와 같은 요소들과 효율적으로 데이터를 주고받을 수 있어야 합니다.

controller의 역할을 정리하면 아래와 같습니다.

  • 다른 프로토콜의 bus 규격을 가진 bus와의 소통을 위하여 필요
  • 여러 개의 연결된 디바이스의 데이터들을 보내기 위하여 필요
  • 효율적인 데이터 전송을 위하여 그래픽 장치나 프로세서, 메모리와 같은 요소들과 버스 사이에 위치

조금 더 명확한 정의를 보기 위하여 예시를 하나 보려고 합니다. 위키피디아에서는 아래와 같이 메모리 컨트롤러에 대하여 정의하고 있습니다.

메모리 컨트롤러(memory controller,MC)는 컴퓨터 주기판이나 중앙 처리 장치의 다이 위에 있는 칩이며, 메모리에서 오고가는 자료를 관리하는 데 쓰인다. 메모리 컨트롤러는 가끔 메모리 칩 컨트롤러(memory chip controller, MCC) 또는 메모리 컨트롤러 장치(memory controller unit, MCU)로도 불린다.

인텔 프로세서 기반의 컴퓨터 대부분은 자사 메인보드의 노스브리지에 추가되어 있지만 AMD의 애슬론 64, 옵테론, IBM사의 POWER5, 그리고 썬 마이크로시스템즈사의 UltraSPARC T1 프로세서와 같은 현대의 마이크로프로세서는 메모리 레이턴시를 줄이기 위해 CPU에 메모리 컨트롤러를 장착하고 있다.

image PCH

많은 콘트롤러들은 메인보드에서 기존에는 노스브릿지에 위치하고 있었지만, 현재는 PCH(Platform Controller Hub) 내부에 위치하고 있습니다. 이름부터 Controller Hub이니 많은 컨트롤러들이 들어 있겠죠. 디바이스 컨트롤러는 구글에 많은 자료들에서 I/O Controller와 혼용해서 사용하는 것 같습니다.

image Bus & Controller

위와 같이 컨트롤러 아래에 또 컨트롤러가 붙어 있을 수도 있습니다.

2. 디바이스 드라이버 (Device Driver)

image device driver and device controller connection

디바이스 드라이버는 위키백과의 내용을 많이 참조했습니다. 가장 이해하기 좋은 것 같습니다. 장치 드라이버/제어기(문화어: 장치구동기, 장치구동프로그람) 또는 디바이스 드라이버(영어: device driver)는 특정 하드웨어나 장치를 제어하기 위한 커널의 일부분으로 동작하는 프로그램입니다. 호스트 시스템의 운영체제가 각각의 디바이스를 접근하게 하기위한 인터페이스 역할을 하는 소프트웨어라고 할 수 있습니다. 장치를 식별하고, 구동/정지하며 절전시키기 위한 기능들이 구현되어있습니다.

장치드라이버는 커널의 일부분이기는 하나 커널과 통합되는 것은 처음부터 해당 드라이버 프로그램 코드소스가 커널 전체 소스에 포함되어 컴파일되는 경우도 있고, 그리고 별도로 컴파일된 파일(윈도의 *.sys, 리눅스의 *.o)의 형태로 존재하고 부팅 시 또는 필요 시 해당 파일이 로드되어 커널과 통합되기도 합니다.

드라이버는 흔히 컴퓨터 버스, 또는 하드웨어와 이어진 통신 하위 시스템을 통해 장치와 통신합니다. 요청하는 프로그램이 드라이버의 명령어를 호출하면, 드라이버는 장치에 명령어를 전달합니다. 장치가 드라이버에게 데이터를 되돌려 주면, 드라이버는 원래 요청한 프로그램의 명령어로 데이터를 다시 전달합니다.

image device와 소통 과정

장치 드라이버는 흔히 장치 칩의 레지스터에 접근하여 하드웨어를 제어하며 하드웨어와 주변 기기를 사용하는 프로그램의 중간 다리 역할을 합니다.

응용 프로그램은 하드웨어를 직접 제어할 수 없어, 커널의 디바이스 드라이버를 사용하기 위하여 시스템 콜을 이용합니다.

또한, 전자 제품에서 각각의 주변 장치들을 제어하기 위하여 설계된 펌웨어도 장치 드라이버로 분류됩니다. 이런 해석은 위키백과의 ‘펌웨어’ 부분을 참조해보면 나오는 아래와 같은 부분을 보고 이해할 수 있습니다.

펌웨어와 장치 드라이버

드라이버는 흔히 컴퓨터 버스, 또는 하드웨어와 이어진 통신 하위 시스템을 통해 장치와 통신한다. 요청하는 프로그램이 드라이버의 명령어를 호출하면, 드라이버는 장치에 명령어를 전달한다. 장치가 드라이버에게 데이터를 되돌려 주면, 드라이버는 원래 요청한 프로그램의 명령어로 데이터를 다시 전달한다. 드라이버는 하드웨어에 의존하며 특정한 운영 체제를 따른다. 이러한 드라이버는 비동기 시간에 의존하는 하드웨어 인터페이스에 필요한 인터럽트를 다룰 수 있다. 장치 드라이버는 흔히 장치 칩의 레지스터에 접근하여 하드웨어를 제어하며 하드웨어와 주변 기기를 사용하는 프로그램의 중간 다리 역할을 한다.

3. 장치 안에도 컨트롤러가 있다?

image SATA 규격의 SSD

위에서 언급한 디바이스 컨트롤러가 아닌 장치 안에도 컨트롤러가 있습니다. 두 개의 차이점은 무엇일까요? 예시로 SSD를 들겠습니다. SSD에는 연결된 호스트 시스템(컴퓨터나 아이패드 같은 녀석들)과 교신할 수 있게 하는 컨트롤러가 포함되어 있습니다. 가령 위의 이미지에서 SSD에는 대부분 1개 이상의 Nand Flash가 있습니다. 여러 Nand Flash에 효율적으로 데이터를 쓰는 것이 필요합니다. 또, 연결된 호스트 시스템의 명령 없이도 불필요한 데이터를 제거하며, 컴퓨터와 소통을 하기 위하여 SSD 컨트롤러가 필요합니다. 아래의 두 이미지를 통하여 제대로 이해할 수 있습니다.

image Conventional Flash Interface

image SSD Controller

디테일하게 이미지를 통하여 보면 SSD 컨트롤러 안에 DRAM 컨트롤러가 있는 것을 확인할 수 있습니다. 또, Host Interface Logic(Buffer & Controller) 안에도 컨트롤러가 있는 것을 확인할 수 있습니다. 즉, SSD 컨트롤러 안에 여러가지의 디바이스 컨트롤러가 들어있다고 보면 될 것 같습니다.

image SSD Controller SOC Architecture

USB와 같은 경우도 Flash 메모리와 컨트롤러가 있습니다. 위의 그림에서 볼 수 있는 SATA 규격의 SSD도 컨트롤러가 있는데, SATA 버스에 데이터를 주고받기 위하여 SSD 컨트롤러가 필요합니다. SSD 컨트롤러가 데이터를 SATA 버스로 보내면, 호스트 시스템에 있는 SATA 컨트롤러가 해당 데이터를 받아서 처리를 한다고 보면 됩니다.

4. 사례를 통한 정리

4.1. 파일 읽기

  1. 사용자가 어떤 파일을 읽기 요청을 합니다.
  2. 그러면 CPU가 읽기 명령을 내리게 되고, I/O 장치와 바로 통신을 하는 것이 아니라 먼저 디바이스 컨트롤러에 명령을 내립니다. 이 때, 디바이스 컨트롤러에 있는 Instruction Register(IR)와 Data register에 명령을 집어 넣습니다.
  3. 디바이스 컨트롤러는 자신의 IR에 있는 명령어를 순차적으로 수행하게 됩니다. 수행하다보니, 방금 보낸 읽기 명령어가 수행될 차례입니다.
  4. 해당 컨트롤러가 연결된 장치들 중에서 명령어에 해당되는 장치에게 읽을 데이터를 요청합니다.
  5. 장치 내부의 컨트롤러는 이를 인지하고 요청한 데이터(Host가 읽은 데이터)를 디바이스 컨트롤러를 이용하여 DRAM(ssd의 경우 내부의 DRAM controller 사용)이나 Host의 디바이스 컨트롤러의 내부 메모리(버퍼)에 집어 넣습니다. 만약 데이터 크기가 클 경우에, 읽은 데이터를 매번 CPU에게 알려주려고 인터럽트를 주면 효율이 떨어지게 됩니다.(매번 CPU가 데이터를 처리하는 방식은 PIO라고 합니다) 따라서, DMA(직접 메모리 접근, Direct Memory Access)를 이용하여 데이터를 알아서 메모리에 옮겨 놓고 옮겼다고만 알려줍니다.

image PIO & DMA


출처

  • http://jake.dothome.co.kr/device-driver-1/
  • https://jhnyang.tistory.com/30
  • https://www.cs.uic.edu/~jbell/CourseNotes/OperatingSystems/13_IOSystems.html
  • https://ko.wikipedia.org/wiki/메모리_컨트롤러
  • https://pcper.com/2015/08/fms-2015-novachips-hlnand-pushes-ssds-beyond-16tb-per-ssd-controller/
  • https://ko.wikipedia.org/wiki/직접_메모리_접근
  • http://recipes.egloos.com/5152867
  • http://www.epnc.co.kr/news/articleView.html?idxno=45499
  • https://semiengineering.com/four-steps-to-verifying-an-ssd-controller-with-emulation/
  • https://ko.wikipedia.org/wiki/장치_드라이버