ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [컴퓨터구조] PC의 Enumeration
    공학/컴퓨터구조 2023. 8. 3. 02:34

    글의 참고

    - http://www.learningaboutelectronics.com/Articles/Platform-device-linux.php

    - https://www.quora.com/What-is-PCIE-enumeration


    글의 전제

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

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

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

    - 이 글은 글의 참조에 있는 링크들을 내 마음대로 번역한 것이다. 심지어 필요없다고 생각된 부분은 생략했음을 알린다.


    글의 내용

    - 플랫폼 디바이스

    : ARM사의 AHB 및 APB 버스는 auto discoverability and hot plugging을 지원하지 않는다. 즉, 주변 페리페럴들이 동적으로 SoC에 장착되더라도 자동으로 인식하지 못한다는 말이다. 따라서 I2C, SPI, UART 등과 같은 platform device는 애초에 동적으로 연결할 수가 없다. 그런데 요즘은 또 별도의 모듈로 등장하고 있다.

     

    출처 - https://vctec.co.kr/product/usb-i2c-%EB%B3%80%ED%99%98-%EB%AA%A8%EB%93%88-ft200xd-ft200xd-usb-to-i2c-bridge/12336/

     

    : 저 모듈을 사서 ARM 칩을 사용하는 SoC에 동적으로 연결하면, 감지가 가능할까? 당연히 가능할 것이다. 근데 PC만 가능할 것이다. 위의 모듈에 외부로 나온 인터페이스는 2개(USB, I2C)다. USB를 PC에 동적으로 연결하면 PC는 인식이 동적으로 될 듯하다. 저 모듈에 달려있는 칩이 아마 USB Protocol 기능을 지원할 것이다. 그러니 23,300이나 하겠지라고 조심스럽게 생각해본다. 

     

    : 그러나 임베디드 보드에 연결되는 I2C는 동적으로 감지하지 못할 것으로 예상된다. 애초에 I2C같은 버스들은 자동으로 감지하는 능력이 없기 때문이다. 즉, 동적 감지를 위해 저 모듈을 샀다면 돈 낭비가 될 가능성이 높다. 결국 임베디드 보드가 부딩하기전에 이미 장착이 되어 있어야 하거나, I2C 버스 드라이버를 리로드 하거나 둘 중 하나일 것이다.  

     

    : 결국 코드로 개발된 운영체제라는 프로그램은 하드웨어적인 뒷받침이 없이는 동적으로 장착되는 디바이스들을 자동으로 감지 할 수 없다는 말이다. 

     

    : 조금 기초적인 내용으로 돌아가보자. 모든 devices들은 부팅 시점에 OS에게 기본적으로 제공해야 하는 정보들이 있다. 주변장치들은 부팅 시점은 크게 2가지로 나눠 볼 수 있다.

    1) device가 동적으로 삽입되서 부팅하는 경우,
    2) device가 PCB에 함께 납땜되서(정적) 부팅하는 경우,

     

    : PC 환경의 윈도우즈 또는 리눅스와 같은 운영 체제는 이러한 데이터를 auto-discover 할 수 있다. 따라서 이런 운영 체제들은 동적으로 삽입된 device에 대해 자동으로 알 수 있다. 이를 `Enumeration`이라고 합니다. `Enumeration` is a process through which the operating system can inquire and receive information, such as the type of the device, the manufacturer, device configuration, and all of the devices connected to a given bus(`Enumeration` 영어 그대로 받아들여야 의미가 와닿음). 

     

    : PC에서 `Enumeration` 이 중요한 이유는 물리적인 hardware device에 대한 정보를 특정 버스들(PCI, USB)을 통해서 자동으로 수집할 수 있기 때문이다. 즉, 정리하면 아래와 같다.

    1" PC에서는 일단 PCI나 USB같은 버스들이 auto enumeration/hot plugging 기능을 지원함.

    2" Bus 레벨에서 저런 기능들을 지원해주니, OS의 device driver 코드안에 hardware device들에 대한 정보를 하드코딩 할 필요가 없음. 왜? OS가 부팅 하면서 PCI/USB 버스를 통해서 auto enumeration를 할 거니깐.

    3" 그런데 임베디드 플랫폼은 auto enumeration/hot plugging 기능을 지원하는 버스(USB/PCI)를 거의 사용하지 않는다. 그래서 hardware device들의 정보를 OS가 부팅하면서 auto enumeration 을 할 수가 없다. 그럼 임베디드 플랫폼은 어떻게 hardware device를 인식시키냐? 그래서 커널 코드에다가 hardware device에 대한 information을 작성한다. 그게 바로 `디바이스트리`다.

     

    : 앞에 `Enumeration` 과정을 통해 Operating system이 device에 대한 정보를 수집하면, 해당 device에 적합한 드라이버를 자동으로 로드할 수 있다. PC의 경우, PCI bus 및 USB bus 와 같은 bus는 auto enumeration/hot plugging 기능을 지원합니다.

     

    : 그러나 임베디드 시스템에서는 대부분의 peripherals들이 auto-discovery or enumeration를 지원하지 않는 bus를 통해 CPU에 연결되기 때문에 자동으로 인식하지 못한다. 이런 devices들을 platform devices 라고 한다. 즉, SoC가 공장에서 만들어질 때 부터 같이 납땜되서 나오는 디바이스들을 의미한다.

     

    : 이러한 platform devices들은 좋은 버스가 없어서 OS가 자동으로 인식을 못하는 디바이스다. 그런데 이런 plaform device 들도 결국 OS에게 인식은 되야 한다. 그래서 리눅스에서는 디바이스 트리라는 것을 통해 부팅 시점에 OS에게 플랫폼 디바이스인식시킬 수 있는 방법을 제공한다. 저 디바이스 트리에 플랫폼 디바이스에 대한 하드웨어 스펙을 작성하면 OS는 부팅하는 시점에 해당 내용을 읽어서 대응하는 디바이스를 초기화한다. 

Designed by Tistory.