728x90
비연속적인 메모리
- 슬랩 할당, 버디 할당 등 커널 메모리 할당 방식 때문에 큰 연속 영역을 늘 확보할 수는 없음
- 결과적으로 하나의 논리적 버퍼가 여러 개의 물리 페이지로 나뉠 수 있음
논리적 버퍼: [━━━━━━━ 16KB ━━━━━━━]
물리 메모리: [4KB][4KB][…할당 불가능…][4KB][4KB]
-> 이런식으로 !!
그래서 scatterlist는 여러 물리 페이지(조각)들을 리스트로 묶어서 하나의 논리적 버퍼처럼 취급할 수 있게 해줌
예를 들어 하드웨어(DMA 컨트롤러, 암호화 엔진 등)는 “물리주소 0x1234abcd” 이런 식의 실제 메모리 위치를 알아야 데이터를 읽거나 쓸 수 있음
- 연속된 물리메모리라면 “0x1000부터 0x1fff까지” 한 번에 처리할 수 있지만,
- 흩어진(page A, B, C, D) 메모리는
- “page A 물리주소 처리”
- “page B 물리주소 처리”
- “…“
이렇게 각각 따로 알려줘야함 ㅇㅇ..
그래서 scatterlist는 이 페이지들의 물리주소 정보를 리스트 형태로 모아서 하드웨어 드라이버에게 한 번에 건네줄 수 있음
드라이버는 리스트를 보고
- “첫 번째 조각은 물리주소 X에서”
- “두 번째 조각은 물리주소 Y에서”
…
이렇게 차례로 매핑(mapping)해서 하드웨어가 전체 버퍼(논리적 버퍼)를 순서대로 처리할 수 있게 됨!
코드 예
struct scatterlist sg[4]; //scatterlist 구조체 선언
sg_init_table(sg, 4); //scatterlist 초기화
sg_set_page(&sg[0], page0, PAGE_SIZE, 0); //scatterlist 요소에 각각의 페이지 정보 넣기
sg_set_page(&sg[1], page1, PAGE_SIZE, 0);
// ...
ahash_request_set_crypt(req, sg, NULL, total_len);