← Ethernet 상세 목차

Hardware · Ethernet detailed manual 02 · Linux v6.18.37

2. descriptor format과 buffer lifetime을 word 단위로 읽는다

normal, enhanced, extended descriptor와 GMAC4 descriptor를 구분하고 각 word의 buffer address, length, status, context와 ownership을 driver가 채우는 시점대로 추적합니다.

상세 표
2
검증 행
16
절차
4 checkpoints
기준
Synopsys DWMAC · Linux NAPI · Linux v6.18.37

CHAPTER 02

2. descriptor format과 buffer lifetime을 word 단위로 읽는다

normal, enhanced, extended descriptor와 GMAC4 descriptor를 구분하고 각 word의 buffer address, length, status, context와 ownership을 driver가 채우는 시점대로 추적합니다.

descriptor memory

ring은 보통 coherent DMA memory이지만 packet buffer는 streaming mapping일 수 있습니다. 두 memory의 cache 계약이 다릅니다.

OWN

CPU가 모든 field와 buffer를 준비한 뒤 마지막으로 device ownership을 넘깁니다. 회수 후에는 status를 읽고 buffer를 unmap/recycle합니다.

context descriptor

TSO, timestamp, VLAN 같은 metadata가 별도 context descriptor를 사용할 수 있습니다. data descriptor 수와 packet 수가 같지 않을 수 있습니다.

wrap

ring index wrap과 hardware tail pointer 단위가 descriptor 개수인지 주소인지 확인합니다.

레지스터와 관측값을 함께 읽는 표

항목소유 블록설정 또는 의미정상 증거실패 해석
DES0 status/OWNdescriptordevice/CPU 소유와 completion statushandoff 후 1, completion 후 0stuck OWN은 DMA/channel/address 확인
DES1 control/lengthdescriptorbuffer length, interrupt, first/lastskb fragment 구성과 일치length/segment 경계 오류
DES2/3 addressdescriptorbuffer 또는 next descriptor 주소dma_map 결과와 정확히 일치CPU VA 또는 truncated IOVA
extended/context wordsdescriptortimestamp/offload metadatafeature가 켜진 packet에만 유효format 선택과 capability 불일치
ring base/lengthDMA channeldescriptor DMA base와 개수allocation과 alignment 일치base high bits/length off-by-one
head/tail/currentDMA channelhardware 진행 위치software producer/consumer 사이wrap 단위 또는 stale read

증상별로 오류 발생 지점을 찾는 표

관측 증상직전 통과 증거우선 확인반증 시험판정
첫 descriptor부터 OWN 고정channel run bit setring base와 bus accessDMA address/IOMMU fault 확인descriptor fetch 경계
몇 바퀴 뒤 멈춤초기 packet 성공wrap/length/tail 계산작은 ring으로 index tracering 경계조건
큰 packet만 깨짐single descriptor 정상first/last와 fragment lengthlinearize 후 비교multi-descriptor 조립
timestamp/offload에서만 실패normal descriptor 정상context/extended formatfeature를 끄고 descriptor diffformat 전환 경계
DMA 주소 상위 bit 유실저주소 정상address width와 DES high fieldIOMMU로 32-bit IOVA 강제주소 폭
회수 후 use-after-freehardware completion 보임unmap/recycle/refcount 순서KASAN과 descriptor index tracebuffer lifetime
그림 1. 「2. descriptor format과 buffer lifetime을 word 단위로 읽는다」의 실행 순서왼쪽부터 신호나 데이터를 처리하는 순서를 나타냅니다. 각 단계에서 확인할 항목을 함께 표시했습니다.
01 ring allocate
02 buffer map
03 descriptor fields 작성
04 barrier
05 OWN=DMA
06 tail doorbell
07 completion
08 OWN=CPU
09 unmap/recycle

실제 검증 절차

순서실행남길 증거판정 목적
1선택된 descriptor ops와 descriptor 크기를 boot log에 남깁니다.format/size/capability해석표 고정
2packet 하나를 전송하며 handoff 전후 raw word를 dump합니다.word별 변화OWN과 field 순서 확인
3ring base와 각 buffer DMA address를 IOMMU mapping과 대조합니다.IOVA/PA ledger주소 변환 검증
4ring wrap 직전/직후 index와 descriptor를 capture합니다.producer/consumer/tailoff-by-one 검출

주의device ownership인 descriptor를 CPU가 수정하면 안 됩니다. debug dump도 cache sync와 ownership 규칙을 지켜야 합니다.

공개적으로 다시 확인할 수 있는 자료

공개되지 않은 제조사 레지스터나 제품별 오프셋은 추측하지 않았습니다. 아래의 제조사 자료, 아키텍처 문서, Linux v6.18.37 원본으로 확인할 수 있는 내용만 다뤘습니다.

Linux stmmac driver

Synopsys GMAC/GMAC4/XGMAC, descriptor, NAPI, PTP와 offload 공개 설명

Linux NAPI

schedule, poll budget, completion과 IRQ 재활성화 계약

Linux DMA API HOWTO

CPU와 장치 사이의 디스크립터·패킷 버퍼 소유권, 주소 매핑, 메모리 배리어