본문 바로가기
Black board/Scratch pad

mtrr 파일 수정해서 uncachable 영역 조정하기

by HaveaNiceDay! 2019. 7. 11.

 컴퓨터를 부팅될 때 부트로더와 커널이 device tree를 읽고 memory mapped I/O(MMIO)를 정의한다.

그 중에서  I/O영역은 보통 uncachable 영역으로 잡는다.

 

 글쓴이는 FPGA accelerator을 실험하기 위해서 vivado의 PCIe core ip를 사용하였다. vivado의 pcie core는 pcie의 BAR영역을 확장하여 FPGA의 axi bus에 mapping함으로써, FPGA accelerator를 마치 메모리 영역처럼 보이게 한다.

PCIe core 맵핑 수 lspci를 친 모습, c0000000~ 256메가가 할당되어 있는 것을 확인할 수 있다.

이 디바이스에 mmap을 하여서 메모리처럼 사용을 하고 싶은데. word(4byte)마다 pcie통신을 하니 데이터 transaction 자체의 오버헤드가 너무 커서 성능이 상당히 저하된 것을 확인할 수 있었다.

 

ubuntu:/lfs$ dd if=/dev/zero of=testfile bs=64M count=1

1+0 records in

1+0 records out

67108864 bytes (67 MB, 64 MiB) copied, 3.86649 s, 17.4 MB/s

ubuntu:/lfs$ dd if=testfile of=/dev/zero bs=64M count=1

1+0 records in

1+0 records out

67108864 bytes (67 MB, 64 MiB) copied, 61.7393 s, 1.1 MB/s

 

그래서 해당 영역 0xc0000000 ~ 256MB 구간을 cachable로 바꾸는 작업을 수행하였다.

CPU(intel)은 데이터 접근에 대해 cache를 통해서 접근할지 바로 시스템 버스에 접근할지(uncachable) 내부의 MTRR(Memory type range register)이라는 레지스터를 보고 판단한다. 해당 레지스터에 어떠한 값을 쓸 것인지는 /proc/mtrr에 적혀있다.

수정전에 cat /proc/mtrr 출력

위 그림을 보면 0x80000000~ 2GB가 전부 uncachable로 설정되어 있으며, 그 구간에슨 0xc0000000~256MB 범위로 포함되어있다.

 

그래서 이 파일을 수정하여서 uncachable 영역을 수정하였다.

 

수정했을 때 생긴 이슈는 다음과 같다.

1. root 계정만 수정할 수 있다.(sudo는 안된다.)

2. 입력 포맷이 정해져있다.

 

글쓴이는 다음과 같은 스크립트로 mtrr을 수정하였다.

sudo echo "disable=2" >| /proc/mtrr
sudo echo "disable=1" >| /proc/mtrr
sudo echo "disable=0" >| /proc/mtrr

echo "base=0x0e0000000 size=0x20000000 type=uncachable" >/proc/mtrr
echo "base=0x0d0000000 size=0x10000000 type=uncachable" >/proc/mtrr
echo "base=0x0c0000000 size=0x10000000 type=write-combining" >/proc/mtrr
echo "base=0x080000000 size=0x40000000 type=uncachable" >/proc/mtrr
echo "base=0x070000000 size=0x10000000 type=uncachable" >/proc/mtrr
echo "base=0x06f800000 size=0x80000 type=uncachable" >/proc/mtrr

수정 후 cat /proc/mtrr 화면

 

그 후에 다시 측정해보니 

ubuntu:/lfs$ dd if=/dev/zero of=testfile bs=64M count=1
1+0 records in
1+0 records out
67108864 bytes (67 MB, 64 MiB) copied, 0.14494 s, 463 MB/s
ubuntu:/lfs$ dd if=testfile of=/dev/zero bs=64M count=1
1+0 records in
1+0 records out
67108864 bytes (67 MB, 64 MiB) copied, 2.21458 s, 30.3 MB/s

제대로 적용된 것을 확인할 수 있었따.

 

그렇다면 write combine은 무엇인가??

'Black board > Scratch pad' 카테고리의 다른 글

ARMv8에서 Virtual address를 통해 cache flush 시키기2  (0) 2020.03.21
AXI signal 설명  (0) 2019.03.20

댓글