← Ethernet 상세 목차DUJINLABS.COM

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 규칙을 지켜야 합니다.

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

공개되지 않은 vendor register나 integration별 offset을 추측해서 채우지 않았습니다. 아래 제조사 자료, architecture 문서와 Linux v6.18.37 원본에서 다시 확인할 수 있는 범위만 사용했습니다.

Linux stmmac driver

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

Linux NAPI

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