아...swiotlb..
스토리가 약간 길어지겠네요..
먼저, IOMMU는 하드웨어 장치들이 물리주소가 아닌 자신만의 가상주소를 쓰게하
는 장치죠. 관련일을 하던 친구가 얘기하는걸 들어보니 이 주소변환이 생각보다
짜증나게 구현되어있길래 그 근처에 안갔습니다만..-_-; 이걸 SW로 하겠다는 이
름같은데, 사실 알고보면 전혀 관련없는 두개의 별개의 기법입니다.
http://lwn.net/Articles/91870/ 에 이야기가 소개되어 있습니다.
대충 설명해보죠.. 전통적으로 리눅스는 ZONE_DMA, ZONE_NORMAL,
ZONE_HIGHMEM 세개의 ZONE으로 물리메모리를 관리합니다.
이제 우리의 청춘의 시기를 생각해봅시다..네, 32비트 시절이죠.
32비트 시절, 우리의 행복하던 이 시절엔 꽤 괜찮았습니다.
ZONE_DMA 는 16비트 시절의 유산이라 거의 쓰는 기기도 없었고 DMA도
전체 물리 메모리를 접근할수 있었으니까요..
64비트에서 환경이 좀 달라집니다. (슬픈일이죠. 인생무상입니다.)
이제 ZONE_HIGHMEM도 없어지고 ZONE_NORMAL이 ZONE_DMA 위에서부터 끝까지
를 커버하는데, 이제 사실상 ZONE_NORMAL하나뿐입니다. 이는 메모리관리를 단순
화하는 장점이 있습니다.
하지만 DMA는 여전히 32bit addressing이라 4GB아래로만 접근할수 있습니다.
16메가인 ZONE_DMA는 너무 작고, ZONE_NORMAL은 전체 메모리를 대상으로
하기 때문에 리눅스에선 4GB아래에서만 할당해달라..는걸 지원하지 않게 됩니다.
ZONE_DMA는 너무 작습니다.
당장 생각할수 있는건 ZONE_BIGDMA를 새로 만들어서 4GB까지를 커버하게 하면 되
는데 이러면 너무 메모리관리가 힘들어진다고 합니다. zone들간의 balancing은
아주 골 아퍼진다고 하는데요. (이건 살짝 이해가 가려다가 안가는군요. 결국 리
눅스엔 ZONE_DMA32가 등장합니다.
http://lwn.net/Articles/152462/ )
AMD의 처음 64비트는 IOMMU를 도입해서 이에 따라 이문제가 없었습니다.
근데 인텔은 자신들의 구현에서 이걸 빼버렸습니다.
그리고 아이태니엄은 "software I/O translation buffer"를 만들어서 이걸 해결
합니다.
뭐 일종의 편법으로 swiotlb 메모리를 128MB정도 미리 확 떼어놓았다가 DMA요청
에 사용합니다. 이렇게 미리 떼어놓아서 메모리관리의 대상이 아니기때문에 메모
리 낭비가 되고, 이렇게 미리 확보된곳에 bounce buffer를 만들어서 드라이버의
버퍼에게 다시 카피해줍니다. 중간에서 한번 더 카피하기때문에 I/O는 느려집니다.
이 웬 삽질입니까..swiotlb라니..
결국 리눅스에 ZONE_DMA32 가 등장하기때문에 swiotlb 는 필요없다고 생각됩니다
만, 어떤 환경이시길래 swiotlb를 ??
On 1/30/2013 1:18 AM, Choonho Son wrote:
> Linux 에서 swiotlb 의 역할 좀 가르켜 주세요. !!
>
> --
> Google 그룹스 'osinside' 그룹에 가입했으므로 본 메일이 전송되었습니다.
> 이 그룹에서 탈퇴하고 더 이상 이메일을 받지 않으려면
>
osinside+u...@googlegroups.com에 이메일을 보내세요.
> 이 그룹에 게시하려면
osin...@googlegroups.com(으)로 이메일을 보내세요.
>
http://groups.google.com/group/osinside?hl=ko에서 그룹을 방문하세요.
> 더 많은 옵션을 보려면
https://groups.google.com/groups/opt_out을(를) 방문하
> 세요.
>
>