MikanOS에 NIC 드라이버 설치 - 준비

개시하다
0부터 시작하는 자체 제작 OS 시작 알아?모르는 사람이 먼저 사요.지침의 해설에서 시작된 자체 제작된 OS의 입문서다.신난다!
이 책에서 MikanOS OS를 제작했지만 아쉽게도 미칸OS는 네트워크 기능이 없어서...겨우 OS를 만들었는데 네트워크가 안 돼.
"뭐?"⁉️농담하지 마라😡」저자uchan는 강사를 맡은 안전 캠핑 2021Y-1 트럭(자체 제작 OS 세미나)에 들어가 미칸OS에서 NIC 드라이버를 만들었다고 생각했다...
그래서 제가 안전 캠프에서 일하는'미칸OS에 NIC 드라이버를 설치한다'는 내용을 소개해 드리려고 합니다!나도 MikanOS에서 NIC 드라이버를 만들어 인터넷에 연결하고 싶다!이런 분들은 꼭 읽어주세요!
전제 조건
이 글은 제로에서 시작해 자작 OS 입문까지 7장 정도의 지식이 필요하다.
만든 물건
NIC는 여러 가지가 있는 것 같은데 이번에는 E1000 NIC를 만들어 보겠습니다.E1000은 Intel 82545 EM 기가비트 이더넷 NIC의 에뮬레이션 버전입니다.가상 머신(QEMU 등)에 탑재되지만 실제 머신 버전도 있다.E1000의 NIC 드라이버가 구현되면 QEMU에서나 실기에서 모두 작동할 수 있다는 것이다.
참고 자료
내가 먼저 참고 자료를 너에게 줄게.

  • https://pdos.csail.mit.edu/6.828/2020/readings/8254x_GBe_SDM.pdf
    E1000의 데이터 테이블, 즉 규격서식이다.귀신처럼 길지만 다 읽는 건 아니지.중요한 것은 3장과 14장이다.

  • http://yuma.ohgami.jp/x86_64-Jisaku-OS-4.pdf
    I-218V NIC 설치라고 적혀 있습니다.이것도 E1000과 호환성이 있는 것 같은데, 실제로 이 기사를 읽으면 기본적으로 똑같은 것을 만들 수 있다.
  • 설치 요약
    먼저 NIC 드라이버를 설치할 때 설명 루프를 미리 알아야 합니다.

    설명 루프는 설명자를 Que로 배열하는 데이터 구조입니다.설명자 중에는 송신 설명자와 수신 설명자가 있는데 각각 송신 버퍼와 수신 버퍼에 대한 정보를 쓴다.
    드라이버는 메모리에서 설명 루프의 영역을 확보하고 NIC에 기본 주소를 알려줍니다.그런 다음 NIC는 스토리지의 설명자를 읽고 써서 전송 및 수신 처리를 수행합니다.
    또한 설명 루프에는 처리되지 않은 설명자와 처리된 설명자를 관리하는 데 사용되는 지침인 Head 및 Tail 포인터가 있습니다.
    요컨대, 여기서는 메모리에 설명자 같은Queue를 만들어서 NIC에 알려주면 된다.
    다음은 발송 처리와 수신 처리의 개요를 상세하게 설명할 것이다.
    송신 처리
    드라이브에 대한 작업은 다음과 같습니다.
  • 스토리지에 보낼 버퍼 준비
  • 보낼 버퍼의 Offset과 Length는 TAIL이 가리키는 설명자의 다음 설명자에 기록됩니다.
  • TAIL 값을 추가하고 NIC에 해당 값을 알려줍니다
  • .
    위 작업을 통해 TAIL의 값을 트리거점으로 쓰고 TAIL이 가리키는 설명자를 읽으며 메모리에 지정된 Offset과 Length로 버퍼 메모리를 읽고 발송합니다.

    ↑ 설명자 보내기
    이번 실상은 여기까지만 이해하면 충분할 것 같고, HEAD와 TAIL에 대해서는 좀 더 자세히 설명해 드리겠습니다.
    HEAD는 NIC 처리(전송)가 완료된 설명자 중 마지막입니다.
    TAIL은 NIC가 처리해야 할 설명자 중 첫 번째입니다.
    쉽게 말해 HEAD는'이렇게 해냈다', 태일은'이렇게 해야 한다'는 것이다.
    따라서 NIC는 HEAD=TAIL에 앞서 HEAD와 TAIL 사이의 설명자를 HEAD를 추가하는 동시에 순서대로 처리한다.
    구체적으로 예를 들면 HEAD = 1, TAIL = 3의 경우 설명자 2, 설명자 3의 순서로 처리하고 HEAD = 3, TAIL = 3의 순서로 중지한다.
    HEAD는 NIC로 작동하고 TAIL은 드라이버로 작동합니다.
    접수 처리
    드라이버의 조작은 다음과 같다.
  • 증가 TAIL
  • TAIL이 가리키는 설명자에서 Offset과 Length를 읽고 버퍼
  • 를 가져옵니다.

    ↑ 수신 설명자
    받아들일 수 있는 이유를 말씀드리겠습니다.
    NIC의 수신 측면 동작은 다음과 같습니다.
  • HEAD가 가리키는 설명자에서 Offset(BufferAddress)을 읽고 받은 버퍼를 이 메모리 주소에 기록합니다
  • 버퍼의 Length를 설명자에 쓰기
  • 수신 정보를 설명자에 추가 쓰기
  • HEAD 증가
  • NIC는 수신된 버퍼 메모리를 지정된 메모리에 무단으로 쓰기 때문에 드라이버가 읽으면 된다는 것이다.
    HEAD는 NIC가 다음에 사용(쓰기)하는 설명자입니다.
    TAIL은 드라이버의 다음 처리(수신)에 대한 설명자입니다.
    즉, 드라이버가 TAIL=HEAD로 변하기 전에 TAIL과 HEAD 사이의 설명자를 HEAD가 증가하는 순서대로 처리한다는 것이다.
    구체적으로 예를 들면 TAIL = 1, HEAD = 3 의 경우 설명자 2, 설명자 3 의 순서대로 처리하고 HEAD = 3, TAIL = 3 으로 정지한다.
    발송 처리와 동일합니다.
    이번 총결산
    따라서 먼저 NIC 드라이버에서 수행해야 할 작업을 대략적으로 정리합니다.
    다음부터 실시!
    다음: 초기화 편

    좋은 웹페이지 즐겨찾기