scatterlist
- CPU 및 Device 관점에서의 address와 length 정보 (page 內 offset 정보 포함)
- page_link 기능
- SG_CHAIN 설정 時, 현재 sgl은 데이터를 포함하지 않은 link 用 sgl
- SG_END 설정 時, 현재 sgl은 마지막 sgl이며 data를 가르키고 있음
- CHAIN이 아닌 경우, page_link는 첫번째 page 정보를 가르킴

SGL Type
- non-chained SGL
- 여러개의 SGL이 연속적으로 위치
- SG_MAX_SINGLE_ALLOC : non-chained SGL의 최대 크기
- 해당값 초과 時, 자동으로 chained-SGL 적용
- chained SGL
- 하나의 chain 內 SGL은 연속적으로 위치
- 마지막 SGL은 chain을 연결하는 기능
- SG_CHUNK_SIZE : 각 chain의 최대 크기

SGL API
- sg_alloc_table(struct sg_table *table, unsigned int nents, gfp_t gfp_mask)
- non-chained SGL 할당
- nent값이 SG_MAX_SINGLE_ALLOC 초과 時, chained SGL 할당
- sg_alloc_table_chained(struct sg_table *table, int nents, struct scatterlist *first_chunk, unsigned nents_first_chunk)
- chained SGL 할당
- nents : 할당 요청된 SGL 갯수
- first_chunk : 이미 존재하는 SGL
- nents_first_chunk : chain의 갯수
- 새로 할당되는 SGL은 first_chunk와 chaining 되어 할당
- __sg_alloc_table(struct sg_table *table, unsigned int nents, unsigned int max_ents, struct scatterlist *first_chunk, unsigned int nents_first_chunk, gfp_t gfp_mask, sg_alloc_fn *alloc_fn)
- 상황1 : first_chunk = NULL && nents <= max_ents
- 미리 할당된 SGL이 없는 경우
- alloc_fn() 함수를 통해서 할당
- non-chained SGL 생성
- 상황2: first_chunk = NULL && nents > max_ents
- 미리 할당된 SGL이 없는 경우
- 여러개의 chain으로 구성된 SGL 할당
- 상황3 : first_chunk != NULL && nents <= max_ents
- 이전에 할당된 SGL 수량이 이미 요청된 수량을 만족하는 경우, 이전 sg_table을 바로 return
- 상황4 : first_chunk != NULL && nents > max_ents
- 이전에 할당한 SGL의 수량이 요청된 수량을 만족하지 못하는 경우
- alloc_fn() 함수를 통해 부족한 수량의 SGL 할당
- 이전 SGL과 chain 구성
- 상황1 : first_chunk = NULL && nents <= max_ents
SCSI Command & SGL
- sg_alloc_table_chained(&cmd->sdb.table, nr_segs, cmd->sdb.table.sgl, SCSI_INLINE_SG_CNT)
- SCSI Layer에서는 SGL을 통해서 명령어 전달
- SCSI Layer에서 해당하는 memory 위치는 scatter list로 표현
- sg_table의 첫번째 두번째 SGL은 static으로 할당된 SGL
- 추가적인 명령은 chain 형식으로 뒤에 연결되어 전달
- SCSI Layer에서는 SGL을 통해서 명령어 전달
참고 및 출처
- https://git.launchpad.net/~ubuntu-kernel/ubuntu/+source/linux/+git/jammy
- https://blog.csdn.net/flyingnosky/article/details/121427354
.
'Kernel > 理解' 카테고리의 다른 글
| Block IO 분석 (0) | 2024.03.24 |
|---|---|
| Device Tree 분석 (Kernel Source) (0) | 2024.02.02 |
| Device Tree 문법 (0) | 2024.02.02 |
| ZRAM 분석 (0) | 2024.02.02 |
| ELF 실행 & execve (0) | 2024.02.02 |