rosieblue
Published 2025. 4. 29. 16:27
[Linux Kernel] scatterlist 카테고리 없음
728x90

 

비연속적인 메모리

 

  • 슬랩 할당, 버디 할당 등 커널 메모리 할당 방식 때문에 큰 연속 영역을 늘 확보할 수는 없음
  • 결과적으로 하나의 논리적 버퍼가 여러 개의 물리 페이지로 나뉠 수 있음

논리적 버퍼: [━━━━━━━ 16KB ━━━━━━━]

물리 메모리:  [4KB][4KB][…할당 불가능…][4KB][4KB] 

 

-> 이런식으로 !!

 

 

그래서 scatterlist는 여러 물리 페이지(조각)들을 리스트로 묶어서 하나의 논리적 버퍼처럼 취급할 수 있게 해줌

 

예를 들어 하드웨어(DMA 컨트롤러, 암호화 엔진 등)는 “물리주소 0x1234abcd” 이런 식의 실제 메모리 위치를 알아야 데이터를 읽거나 쓸 수 있음

  • 연속된 물리메모리라면 “0x1000부터 0x1fff까지” 한 번에 처리할 수 있지만,
  • 흩어진(page A, B, C, D) 메모리는
    • “page A 물리주소 처리”
    • “page B 물리주소 처리”
    • “…“
      이렇게 각각 따로 알려줘야함 ㅇㅇ..

그래서 scatterlist는 이 페이지들의 물리주소 정보를 리스트 형태로 모아서 하드웨어 드라이버에게 한 번에 건네줄 수 있음
드라이버는 리스트를 보고

  1. “첫 번째 조각은 물리주소 X에서”
  2. “두 번째 조각은 물리주소 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);

 

 

 

 

profile

rosieblue

@Rosieblue

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!