Clevo W65KJ1_KK1 (한성 XH57) 커피레이크 개조 바이오스 삽질기

들어가면서

데스크탑 용도로 한성 XH57을 사용하고 있어요<

이 노트북의 가장 큰 특징은 데스크탑 CPU를 장착하고 있다는 건데요, 그래서 그런지 노트북에 비해서 성능이 꽤 넉넉해서 (펜티엄인데도) 데스크탑으로 사용하기 좋은 것 같아요, 쿨링도 울트라북에 비하면 잘 되어있고요.

잘 쓰고 있는데, 왠지 이런 말을 인터넷에서 보게 되었죠:

???: 인텔의 7세대 보드에서 8세대 CPU는 사실 호환 된다, 인텔이 보드 더 팔아먹으려고 그냥 안되게 막아놓은 것이다.

아주 그럴듯한 말이죠, 인텔이 지금까지 우리에게 저지른 짓을 생각하면요.

그래서 분명 이렇게 많이 팔리고, 가성비로 소문난 노트북이라면 누군가가 미리 개조해 놓은게 있을 것이다 라는 생각이 들어서 검색을 해 봤더니, 세상에 진짜로 있는거에요.

그래서 빨리 다운로드를 해 놓으려고 했죠, 인터넷에 있는 자료는 생각보다도 유통기한이 짧으니까요. 그런…데 이미 좀 늦었더라고요. 바이오스를 개조해서 올리신 분이 커뮤니티의 유저들과 다소 마찰이 있어서, 올려놓은 파일들을 비공개로 전환한 것 같았어요.

권한 요청 버튼을 눌러놓고 개인적으로 메일이라거나 보낼 수 있는 방법을 찾아서 부탁을 드려볼까… 싶다가, 본인이 싫다는데 거기에 부탁하는 건 좀 예의가 아닌 것 같아서요. 못하는 것도 아니니 귀차니즘을 이기고 언제나처럼 직접™ 해보기로 했습니다.

닌텐도 전 대표, 이와타 사토루가 '직접' 이라고 말하면서 양 손을 얼굴 앞으로 뻗는 특유의 제스쳐를 취하는 그림
이와타 사토루 전 닌텐도 사장, 닌텐도 다이렉트의 저작권은 주식회사 닌텐도에 있습니다.

오늘만은 윈도우

바이오스 관련 툴들은 죄다 윈도우용으로만 있죠. 그래서 오늘만은 리눅스를 사용하지 못하고 윈도우 VM을 사용하기로 했어요.
우선 모든 작업을 하기 전에, 컴퓨터가 켜져있는 상태에서 한번 백업을 떠보기로 했어요.

$ sudo flashrom -p internal -r bios_raw_dump.bin

무리없이 8 메가바이트짜리 덤프가 떠졌고, 두번 연속으로 해도 같은 해시가 나와서 우선 저 파일을 보관해 두기로 했어요.

VirtualBox 를 사용해서 바이오스 작업용 윈도우를 새로 설치하면서 1)아무래도 주로 사용하는 게임 환경에 설치하기엔 좀 깔끔하진 않아서 어떤 작업을 해야 하는지 정리해 보았어요.

  1. 커피레이크 CPU 마이크로코드 삽입
  2. Intel ME 무력화 (아무짝에도 쓸모 없는 보안을 해치는 녀석이니 이참에)
  3. 바이오스에 든 옵션롬들도 이왕이면 업데이트 하자, 최신이 나쁠건 없으니
  4. 한성 로고는 영 아니니 이왕이면… 좀 모에한 로고로 바꾸자

그리고 필요한 프로그램들을 정리해 보았어요.

  1. MMTool2)AMI의 지적 자산이에요
  2. UBU
  3. me_cleaner
  4. UEFITool

연장은 이정도면 되었겠죠, 삽질을 시작해요<

우선 주목적인 CPU 마이크로코드부터, 덤으로 옵션롬들을 업데이트

윈도우 툴들은 처음 쓰는 사람도 쉽게 쓰기 좋아서 참 좋은 것 같아요, 하지만 개인적으론 OS가 정말로 마음에 안 들죠<

UBU를 사용해서 아까 뜬 덤프를 열었어요. 다행히 잘 열리네요. 마이크로코드 업데이트 옵션으로 우선 바이오스에 있는 마이크로코드들을 업데이트 해요.
그리고 나서 새로운 커피레이크 CPU용 마이크로코드를 삽입해야 하는데, 프로그램 자체엔 그 메뉴가 없더라구요.
꼼수로 필요하지 않은 스카이레이크 CPU의 마이크로코드의 최신 버전이라고 속이면서 커피레이크 CPU용 마이크로코드를 강제로 밀어넣었어요. 뭐 어차피 상관 없겠죠.

마이크로코드를 밀어넣고 나서 랜카드의 옵션롬 같은 자잘한 옵션롬을 업데이트 해요. 안해도 상관 없겠지만 뭐 최신이라는데 나쁠건 없겠죠.

로고!

한성 로고는 아주 지루해요.

그러니 좀 바꿔봤어요.

이제 좀 낫네요, 최근에 mNetwork 안에 만들어진 연구소인 mNetwork 비전리 방사선 연구소 의 자산이라는 표시도 넣기로 해요<

UEFITool 에 있는 모듈 Body 바꿔치기 기능으로 새로운 로고를 넣을 수 있어요. 이름은 Logo.bmp 이지만 사실은 jpg라는 걸 잊지 말기로 해요.

Intel ME 무력화

사실 로고는 아무래도 좋고 (바탕화면을 많이 보지, 부팅 로고는 안 보잖아요) 더 중요한건 Intel ME를 없애버리는 거였어요.

$ me_cleaner -S bios_microcode_vbios_realtek_updated_logo.bin -O bios_microcode_vbios_realtek_updated_logo_aggressiveclean.bin
$ me_cleaner -s bios_microcode_vbios_realtek_updated_logo.bin -O bios_microcode_vbios_realtek_updated_logo_passiveclean.bin

ME 펌웨어 부분에 HAP 비트만 설정해도 물론 ME를 끌 수 있긴 하지만, 찝찝하니까 가능하면 ME 펌웨어의 대부분을 삭제하고 싶었어요. 하지만 실패할 가능성이 좀 있으니 (이 노트북은 Boot Guard가 활성화 되어 있으니) HAP 비트만 설정한 버전도 하나 준비하기로 해요.

플래싱!

을 컴퓨터에서 하고 싶었어요. 사실 못하는 건 아니에요. 하는 방법이 있긴 한데… 아까 뜬 덤프가 맞는지 좀 의심스러운 점도 있어서 직접 분해해서 SPI 플래셔로 EEPROM에 접근하기로 했어요.

말은 쉽지, EEPROM이 쉽게 접근하기 어려운 위치에 있더라고요 (M.2 슬롯과 CPU 쿨러 사이에 있는 히트싱크과 검정 플라스틱 아래), 열심히 나사를 정리하면서 분해했습니다. 뭐 이리 나사가 많아, 전동드라이버를 사던지 해야지 원…

듀퐁 케이블 난장판으로 싸구려 SOIC8 클립을 연결하고, 스팩시트를 침침한 눈으로 한 다섯번 읽어가면서 전압이랑 핀 배열을 체크했죠. 3.3볼트 칩에 5볼트를 넣는다거나, 1.8볼트 칩에 3.3볼트 혹은 5볼트를 넣는다거나3)사실 3.3볼트는 로직 레벨 컨버터가 도착을 안 했을때 한번 해본적 있었어요, 다행스럽게도 고장 안났죠. 플래싱 하는동안 얼마나 심장이 쫄깃하던지 하면 큰일 나니까요.

다행스럽게도 이 칩은 3.3볼트여서 로직 레벨 컨버터에 물릴 필요는 없어요. 레노버 싱크패드 쓸땐 1.8볼트라서 궁시렁 거리면서 로직 레벨 컨버터에 연결하곤 했는데, 이건 그점은 참 마음에 드네요.

언제나 하던것처럼 다시 한번 정식으로 덤프를 뜨고 md5를 한번 아까 시작할 때 덤프 뜬 거랑 비교해봤죠. 어, 다르네…

뭐지…?

이미 XH57을 다 분해해 둔 상태라서 XH57 안에 있는 하드 안에 있는 VM 이미지에서 자료를 꺼내오기도 곤란하고4)USB-SATA 연결할 수 있는 외장하드 케이스를 사둘까… 아쉬운대로 XPS에 있는 VM에다가 UEFITool을 설치해서 실제 롬 덤프 안에 있는 리전들을 비교해보기로 했어요.

BIOS 리전 - 해시 일치
ME 리전 - 해시 불일치

다른 부분 - EC 등 은... 뭐 확인은 안되지만 같겠죠, 뒷부분쪽은 vbindiff 해보니 같았으니

어차피 ME는 날릴거니, 그냥 해보자는 생각이 들었어요. 그래서 다시 덤프 데이터가 맞는지 한번 더 떠보고, 그래도 불안해서 또 한번 더 떠보고 md5가 모두 일치한다는 걸 확인하고 로고 & ME HAP 설정 그리고 대부분 ME 펌웨어 삭제 버전 롬을 플래싱 했어요. 그리고 머리 한 구석에서 불안감을 떨치지 못하면서 부랴부랴 다시 노트북을 조립했죠. 조립하면서 팔이 아파서 진짜 전동드라이버를 사고 싶었어요.

두근두근

책상은 전선과 여러대의 컴퓨터, 여러개의 키보드 등으로 난장판이라서, 비교적 좀 더 자리가 넓은 책상 역할을 하고 있는 침대 위에서 배터리로 XH57을 켜보려고 40% 쯤으로 충전해서 보관중이던 배터리를 가져왔어요. 배터리를 장착하고 전원을 켰는데… 화면이 검정색이네요.

아, 망했다 생각이 드는 찰나에 삐- 하는 POST 비프가 들렸어요. 그리고 systemd-boot 의 부트 선택 화면이 보였죠. 다행스럽게 로고만 망했네요, 아직까진.

그리고 OS로 부팅해서 ME가 어떻게 되었는지 급하게 명령어를 쳤어요

$ sudo ./intelmetools -m
Can't find ME PCI device

만세!

하지만 30분 더 있어봐야죠, ME를 잘못 제거하면 컴퓨터가 30분 후에 강제로 꺼지니까요.

watch -n 1 uptime

유튜브라도 보면서 시간을 보내다 구석에 있는 터미널을 보니 어느새 부팅 후 31분이 지나고 있었어요. 성공적으로 ME를 제거한거에요.

앞으로 더 할 일

나중에 뜯을 기운이 있을 때 (아마도 i5-8400으로 CPU를 교체할 때) 로고를 다시 건드리기로 했어요. 아마 파일 크기 한계나 압축 형식 같은 문제겠죠. 서멀을 대충 조립하느냐 새걸로 바르지 않고 그냥 그대로 덮었는데, 이것도 그때 다시 발라야겠죠. 우선은 삽질 성공!

ME를 제거하고 마이크로코드를 넣은 바이오스 파일은 전례를 보았으니 공개하지 않을거에요. 하지만 대충 어떻게 하는지 필요한 도구들과 과정을 적어놓았으니 컴퓨터를 잘 다루시는 분들이라면 할 수 있겠죠. 이 작업을 제대로 된 장비 없이 하면 진짜로 컴퓨터가 딴딴한 벽돌이 될 수 있으니, 할 수 있는 분들만 하세요.

Sn   [ + ]

리눅스와 NVMe SSD 펌웨어 업데이트, 그리고 고통받는 리눅서

원래 ‘고통받는 리눅서’ 시리즈를 정규로 쓸 생각은 없었지만, 요즘같이 그냥 깔면 돌아가는 “It Just Works” 세상에 리눅스를 메인 OS로 쓰고 있다는 건 셀프로 고통받길 좋아한다는 것 외엔 설명이 되질 않겠죠. 그래서 오늘도 흔한 리눅서가 고통받는 것 중 하나인 펌웨어 업데이트를 들고 왔습니다<

미노리는 KXG50ZNV512G 라는 SSD를 쓰고 있어요. 흔히 Toshiba XG5 라고 불리는 물건이죠. 하드디스크 계의 도시바는 ‘또, 시바!’ 라는 악명이 아주 높았지만1)뭐 그것도 케이스 바이 케이스 같지만요, 미노리는 도시바 하드 서버에 넣고 혹사시키면서 돌리고 있는데 멀쩡합니다< SSD는 과연 어떨까요?

Toshiba KXG50ZNV256G/KXG50ZNV512G/KXG50ZNV1T02 non-SED Solid State Drive Firmware Update

This package provides the firmware for Toshiba KXG50ZNV256G 256GB, KXG50ZNV512G 512GB and KXG50ZNV1T02 1TB non-SED M.2 2280, Revision AADA4104, and is supported on Latitude, OptiPlex, Vostro, Inspiron, Precision, Alienware and XPS models running the following Windows operating systems: Windows 7, Windows 8, Windows 8.1 and Windows 10 64-bit only.

Fixes & Enhancements

Fixes:
-Fixed issue encountered during drive refresh in corner condition
-Fixed SMART reporting to be in line with industry practice

Enhancement:
- Improvements to Data Recovery in corner condition

(AADA4105)
Fixes & Enhancements
Fixes:
- Fixed write performance issue encountered on specific workload.

Enhancement:
- Not Applicable

산 후 벌써 두번이나 업데이트가 나왔네요. 성능도 더 좋아진다고 하고, 이제서야 업계 표준에 맞게 SMART를 지킬 마음이 들었다니 그거 참 다행이네요, 그러면 이제 업데이트를 해야 하는데, 델은 역시나 리눅서들을 실망시키지 않죠.

Supported Operating Systems

Windows 7, 32-bit
Windows 7, 64-bit
Windows 8, 32-bit
Windows 8, 64-bit
Windows 8.1, 32-bit
Windows 8.1, 64-bit
Windows 10, 64-bit

언제나처럼 직접 까야 하는거죠.

만능 바이너리 해체기, 7z

리눅스에서 파일을 까는 방법은 여러가지가 있어요. file 명령어를 통해서 이게 대충 어떤 파일일지 추측하는 방법도 있고, binwalk 를 통해서, 그리고 binwalk -eM 을 통해서 줄줄히 내부에 있는 압축 데이터까지 전부 추출해보는 방법도 있죠. 하지만, 의외로 꽤 쓸만한 툴이 있어요. 그건 압축 프로그램인 7-zip 이죠.

$ 7z l Toshiba\ XG5_nonSED_\ KXG50ZNV256G_512G_1T02_C0PF8_ZPE.exe

7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
p7zip Version 16.02 (locale=ko_KR.UTF-8,Utf16=on,HugeFiles=on,64 bits,8 CPUs Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz (806EA),ASM,AES-NI)

Scanning the drive for archives:
1 file, 3832016 bytes (3743 KiB)

Listing archive: Toshiba XG5_nonSED_ KXG50ZNV256G_512G_1T02_C0PF8_ZPE.exe

--
Path = Toshiba XG5_nonSED_ KXG50ZNV256G_512G_1T02_C0PF8_ZPE.exe
Type = PE
Physical Size = 3832016
CPU = x86
Characteristics = Executable 32-bit NoRelocs NoLineNums NoLocalSyms
Created = 2003-10-18 04:35:08
Headers Size = 4096
Checksum = 3861488
Image Size = 221184
Section Alignment = 4096
File Alignment = 4096
Code Size = 77824
Initialized Data Size = 139264
Uninitialized Data Size = 0
Linker Version = 6.0
OS Version = 4.0
Image Version = 0.0
Subsystem Version = 4.0
Subsystem = Windows GUI
Stack Reserve = 1048576
Stack Commit = 4096
Heap Reserve = 1048576
Heap Commit = 4096
Image Base = 4194304
Comment = FileVersion: 1.3.1.12
ProductVersion: 1.3.1.12
FileDescription: 
----
Path = [0]
Size = 3714320
Packed Size = 3714320
Virtual Size = 3714320
Offset = 110592
--
Path = [0]
Type = zip
Offset = -110592
Physical Size = 3824910
Tail Size = 2
Embedded Stub Size = 113608

   Date      Time    Attr         Size   Compressed  Name
------------------- ----- ------------ ------------  ------------------------
2018-05-11 11:18:34 ....A      3775488      3710121  AADA4105-64bit.exe
2018-05-14 17:10:36 ....A         2342          951  Readme.txt
------------------- ----- ------------ ------------  ------------------------
2018-05-14 17:10:36            3777830      3711072  2 files

$ 7z l AADA4105-64bit.exe

....

   Date      Time    Attr         Size   Compressed  Name
------------------- ----- ------------ ------------  ------------------------
2018-05-11 11:18:30 ....A          144               launch.vbs
2018-05-11 11:18:30 ....A        20112               TFMDriver32.sys
2018-05-11 11:18:30 ....A        23184               TFMDriver64.sys
2018-05-11 11:18:30 ....A        29240               TFMNativeApp32.exe
2018-05-11 11:18:30 ....A        32312               TFMNativeApp64.exe
2018-05-11 11:18:30 ....A      2199608               TFMWizardApp.exe
2018-05-11 11:18:30 ....A      2860600               TFMWizardApp64.exe
2018-05-09 14:33:50 ....A      1601536               AADA4105.sig
2018-02-23 15:49:46 ....A       128527               EULA.rtf
2018-02-19 17:54:56 ....A        29750               Logo.bmp
2018-05-11 11:05:30 ..HSA         5120               Thumbs.db
2018-05-11 11:18:30 ....A         4228               TFMUpdate-config.xml
------------------- ----- ------------ ------------  ------------------------
2018-05-11 11:18:30            6934361      3775488  12 files

$ cat TFMUpdate-config.xml

....

    <!--- - - - - KXG50ZNV512G NVMe TOSHIBA 512GB - - - - - -->
    <Drive Model="KXG50ZNV512G NVMe TOSHIBA 512GB">
        <Firmware Revision="AADA4101">
            <AvailableFirmware Revision="AADA4105" FileName="AADA4105.sig" />
        </Firmware>

....

이렇게 AADA4105.sig 파일이 펌웨어 본체라는 걸 알 수 있죠. 이제 펌웨어 본체를 알아냈으니 저걸 nvme에 올려야 하는데, 이것에 쓰는 아주 좋은 툴이 있죠. 바로 nvme-cli 에요.

심호흡을 한번 크게 하고, 떨리는 마음으로 펌웨어 업로드 명령을 내려봐요.

$ sudo nvme fw-download /dev/nvme0 --fw=AADA4105.sig
Firmware download success
>>> elapsed time 12s                                                            
$ sudo nvme fw-commit /dev/nvme0 --slot=0 --action=1
Success committing firmware action:1 slot:0

그리고 리부팅을 하고, 다시 부팅이 되는 걸 보면서 환호성을 지른 후

$ sudo nvme id-ctrl /dev/nvme0 | grep fr
fr      : AADA4105
frmw    : 0x14

안 망했네요<

어지간하면 윈도우로 멀티부팅해서 펌웨어 업데이트를 하는게 가장 좋겠지만, 윈도우를 쓰지 않는다면 이런 방법을 사용해 볼 순 있겠죠. 이 작업을 자기가 뭘 하고 있는지 파악을 못하면서 하면 SSD가 (진짜로) 벽돌 될 위험이 존재하니, 조심해서 진행하세요.

Sn   [ + ]

리눅스와 고해상도 모니터 (HiDPI), 그리고 고통받는 리눅서

XPS 13을 이제 약 반년째 쓰고 있어요<

그동안 사용하면서 이것저것 다 마음에 드는 상태로 고치면서 (소프트웨어 적이건, 하드웨어적으로 바꿔버리건) 사용했지만, 딱 하나 고치지 못하고 타협하면서 썼던 것이 있었어요.

그건 바로 HiDPI 에요.

윈도우 에서도 지원이 오묘해서 종종 프로그램의 모양이 이상하게 나온다거나 하는 HiDPI 지원은 리눅스도 사정이 크게 다르지 않아요. 아니, 훨씬 더 심각해요. 좋게 표현해서 리눅스 환경에선 ‘역사가 깊은 프로그램’을 많이 사용하게 되는데, 그 프로그램들은 대부분 한참 전부터 업데이트가 그리 활발하게 이루어지지 않는 경우가 많아요. 그런데 그런 예전에 만들어진 프로그램들은 대부분 HiDPI 에 대한 개념이 없던 시절부터 있던 경우가 많다보니, HiDPI 환경에선 사용이 불가능 할 정도로 작게 나오거나, 아니면 GUI 레이아웃이 와장창 깨져서 나와서 아주 미워보이는 문제가 있죠.

그나마 그런 HiDPI 문제는 GTK3, Qt5 기반 프로그램이 늘어나면서 (그럭저럭) 해결이 되어가고 있지만, 아쉽게도 하나 해결되고 있지 못하는 부분이 있어요. 그건 바로 HiDPI 모니터와 일반 (96dpi) 모니터가 섞여 있는 환경에선 어떻게 돌아가는가 하는 문제에요.

우분투 같은 사용자 친화적인 배포판의 경우엔 어떨지 모르겠지만, 미노리가 사용하고 있는 아치 리눅스는 사용자가 꽤 많은 설정을 수동으로 해야 하는 배포판이에요. 그러다 보니 지금 사용하고 있는 DE인 Plasma5의 기본 동작대로 많이 사용하게 되는데요, 이 DE의 경우엔 기본 설정 상 설치하자마자 바로 HiDPI 가 감지되지 않는 경우가 많아요.1)모니터의 망가진 EDID라거나, 등등… 그래서 각종 꼼수를 사용해서 HiDPI 환경에서 사용하기 적합하게 만들어 두는 경우가 대부분이죠.2)예를 들어서 이것처럼 이런 환경에서 일반 모니터를 컴퓨터에 연결하면 일반 모니터 쪽 화면이 HiDPI 모니터 쪽 스케일링 배수만큼 더 커져 보이게 되어요. 이대론 사용하기가 아주 힘들죠.

이 문제를 근본적으로 해결하기 위해선 Wayland를 사용해야 하지만 Wayland는 ‘올해 말쯤엔 사용할 만 할 것’이라는 말만 무성한 채로3)올해 말 디스플레이 서버 수년째 실생활에서 아무 문제 없이 사용하긴 좀 힘든 상태에요. 그래서 결국 이런 선택지 중 하나를 선택할 수 밖에 없게 되죠.

  1. 그냥 한쪽 모니터는 아주 크게 나오는 상태로 사용한다.
  2. 그냥 한쪽 모니터는 아주 작게 나오는 상태로 사용한다. 그리고 매번 모니터를 연결했다가 분리할때마다 HiDPI 관련 설정을 바꾼다.
  3. 듀얼모니터를 포기하고 HiDPI 모니터만 사용한다.
  4. 듀얼모니터를 포기하고 일반 모니터만 사용한다. 그리고 매번 모니터를 연결했다가 분리할때마다 HiDPI 관련 설정을 바꾼다.

지금까진 3번 선택지를 사용해 왔는데, 눈이 아파서 도저히 안되겠다는 생각이 들었어요. 그래서 한번 해킨토시를 설치해서 맥의 더 나은 HiDPI 지원을 체험해 보려다가 결국 포기하고 5번 선택지를 선택하게 되었습니다<

5. 일반 모니터를 HiDPI 인 것 처럼 속인 후, 실제로 화면 출력은 절반 사이즈로 줄여서 출력하면서 사용한다.

우선 테스트

테스트 목적으로 이미 실행되고 있는 DE에서 다음과 같은 명령어를 입력해 봤어요. 노트북의 내장 디스플레이 (HiDPI) 는 eDP1 인터페이스에, 외장 디스플레이 (일반 dpi) 는 DP1 인터페이스에 연결되어 있어요.

xrandr --output DP1 --auto --fb 3840x2160 --scale 2x2 --pos 0x0

모든것이 두배 두배로 커졌던 일반 dpi 1080p 디스플레이가 멀쩡한 사이즈로 출력되기 시작했지만, 바탕화면이나 패널 등이 여전히 절반 크기로 출력되고 있었어요. 새로 실행하는 프로그램들은 모두 정상적으로 동작하고, 플라즈마 쉘을 죽였다가 다시 켜면 그 다시 켠 부분들은 멀쩡하게 동작하는 걸 보고 올바른 방향으로 오고 있다는 걸 알았어요. 플라즈마 전체를 저 명령어를 입력 후 다시 껐다가 켜거나, 아니면 아예 플라즈마 세션이 시작하기 전 저 명령어를 입력하면 해결된다는 거죠. 그래서 저 명령어가 X가 시작한 후 플라즈마 쉘이 실행되기 전 실행되도록 .xprofile 에 다음과 같은 내용을 추가했어요.

# 2x2 scaling when external monitor is connected via DP1 port
if [ $(xrandr | grep "^DP1" | cut -d ' ' -f 2) = "connected" ]; then
        /usr/bin/xrandr --output DP1 --auto --fb 3840x2160 --scale 2x2 --pos 0x0
fi

다시 시작

로그아웃 하면 X가 꺼졌다가 다시 켜지면서 SDDM을 불러오기 때문에, 로그아웃 후 다시 플라즈마 세션을 시작했어요. 순간적으로 올바르게 스케일링 된 화면이 보이다가, 다시 두배 두배로 큰 화면이 보이기 시작했어요. xrandr 결과에선 화면이 3840×2160이 아니라 1920×1080 이라는 말이 나오고 있었죠. 왜 그런가 고민을 하다가, Plasma 세션이 시작되면서 디스플레이 설정을 건드리는 것 같다는 결론에 도달했어요. 그래서 이걸 수동으로 설정하기 위해서 (어차피 해상도 설정은 한번 하면 잘 바꾸지도 않으니) KScreen 2 데몬을 자동으로 시작하지 않도록 바꿨습니다< 그리고 나서 다시 시작하니, 짜잔, 멀쩡하게 동작하는 화면이 나오기 시작했죠.

과도한 욕심을 버리자

듀얼 모니터를 다 사용하면 정말로 좋겠지만, 결국엔 노트북 본체 모니터는 끄는게 더 낫다는 생각이 들었어요. XPS 13에 달려있는 Intel UHD Graphics 620의 성능이 너무 암울해서4)아니, 이름은 UHD 라면서!, 4K+QHD 디스플레이의 3D 컴포지팅을 도저히 감당할 수 없었기 때문이에요. 그래서 최종적으론 다음과 같은 설정을 .xprofile 에 넣었어요.

# 2x2 scaling when external monitor is connected via DP1 port
if [ $(xrandr | grep "^DP1" | cut -d ' ' -f 2) = "connected" ]; then
        /usr/bin/xrandr --output eDP1 --off --output DP1 --auto --fb 3840x2160 --scale 2x2 --pos 0x0
else
        /usr/bin/xrandr --output eDP1 --auto
fi

else 쪽은 아마도 필요가 없겠지만, 혹시 모르니까<

실제 사용

그래서 지금 실제로 위와 같은 설정으로 사용하기 시작했어요. 4k 크기의 프레임버퍼는 여전히 UHD 620에게 버겁지만, 그래도 아쉬운대로 실제로 사용할 수 있긴 해요.
외장 일반 dpi 모니터를 연결해서 사용하고 싶다면 외장 모니터를 연결한 후 세션을 로그아웃 했다가 다시 시작하면 복잡하게 설정을 하나하나 일일히 바꿀 필요 없이 돼요. 다시 HiDPI 모니터를 주로 사용하고 싶다면 외장 모니터를 분리한 뒤 똑같이 하면 HiDPI 모드로 돌아와요. 듀얼 모니터를 사용할 수 없지만 (성능 문제로), 그래도 책상에서 13인치 노트북 화면을 째려보지 않고 27인치 모니터를 보면서 편하게 사용할 수 있게 되었다는 점은 아주 만족이에요. Wayland가 멀쩡해져서 모니터의 DPI에 맞춰서 자동으로 화면을 스케일링 하기 전까진 가장 실용적으로 사용할 수 있는 방법일 것 같아요.

덧붙임

xrandr를 이용한 scale 설정은 지난 7년동안 망가져 있는 상태라서 사용할 수 없었어요. 다행스럽게도 이 글을 쓰는 시점에선 고쳐진 상태지만, 업스트림에서 고쳐진 지 약 한달밖에 되지 않아서 많은 배포판에 아직 배포가 되지 않았을 수 있어요. 고쳐진 버전은 1.20 이에요.

OpenGL을 사용한 컴포지팅 성능이 너무 처참해서 도저히 써먹을 수 없겠다면 모든 애니메이션을 끄고 XRender를 이용해 컴포지팅을 시도해 볼 수 있어요. 이젠 슬슬 고여서 퇴장할 준비를 하고 있는 인텔 DDX 드라이버를 설치한 후 2D 가속 데스크탑을 즐겨보세요!

Sn   [ + ]

오버클러킹이 불가능한 인텔 CPU에서 MCHBAR를 이용한 TDP 수정

시리즈

이 글은 이 글 에서 이어집니다. 이쪽도 참고하세요.

면책조항

  • MCHBAR 수정은 CPU (혹은 시스템 보드) 의 보증을 무효화 시킬 수 있습니다. 조심해서 진행하세요. 전 이 글로 인해 발생한 어떠한 피해에 대해 책임을 지지 않습니다.
  • MCHBAR 주소는 시스템마다 다를 수 있습니다. 인텔의 문서를 참고하세요.
  • 인텔 i7-8550U (카비레이크 리프레시) 에서만 테스트 되었습니다.

시작

MSR을 수정하여 TDP 제한을 풀었지만, 여전히 기존 설정값대로 TDP가 계속 내려가서 클럭 제한이 걸리는 경우엔 시스템의 다른 부분에도 제한이 있다는 것을 의심해볼 수 있습니다. 여기에서는 가능성이 높은 선택지인 MCHBAR를 공략해 봅니다.

필요한 도구들

저번 글에서 필요한 내용

MSR_RAPL_POWER_UNIT에 존재하는 전력 단위 값이 이번 글에서 사용됩니다. 제 CPU의 경우엔 다음과 같습니다:

606H MSR_RAPL_POWER_UNIT (RO)
    3:0 = 전력 단위 (W) = 1/2^(10진수)W - 초기값: 0.125W
    12:8 = 에너지 단위 (J) = 1/2^(10진수)J - 초기값: 0.00006103515625J
    19:16 = 시간 단위 (sec) = 1/2^(10진수)sec - 초기값: 0.0009765625sec

본격적인 작업

패키지 전력 제한 1은 FED159A0h, 패키지 전력 제한 2는 FED159A4h에 존재합니다.

$ sudo ./devmem2 0xFED159A0
00DD8078
$ sudo ./devmem2 0xFED159A4
00428198

레지스터 값 뒤의 3자리를 10진수로 변환한 뒤 전력 단위 값을 곱하면 현재 TDP가 됩니다. 이 값이 맞는지 다시 한번 확인하세요.

0x078 * 0.125 = 15
0x198 * 0.125 = 51

값을 알맞게 수정합니다.

0x0C8 * 0.125 = 25
0x198 * 0.125 = 51

수정한 값을 레지스터에 다시 씁니다.

$ sudo ./devmem2 0xFED159A0 w 0x00DD80C8

결과

열 스로틀링의 영향을 받지 않는 환경에서 CPU가 지속적으로 15W 초과의 TDP로 동작하는 것을 확인할 수 있었습니다. XPS 13의 쿨링 설계의 한계로 인해 25W로 지속적으로 동작하지는 못했습니다.

절망적인 델 XPS 13 키보드를 이겨내기 위한 선택, 휴대용 기계식 키보드 (Anne Pro)

평상시엔 노트북에 유니콤프 모델 M 키보드를 연결해서 사용하고 있어요<

모델 M 키보드가 워낙 좋은 탓도 있겠지만, 최근 나오는 델 울트라북에 붙어있는 키보드가 공통적으로 꽤 자주 중복 입력이 되거나 입력을 무시하는 문제가 있어서, 그걸 해결하기 위해서 세게 펑펑 때리는 습관이 들었어요. 그러고 보니 오랫동안 (한두시간동안) 노트북 키보드를 잡고 치고 있으면 너무 힘들더라고요.

이번에 거의 한달동안 해외에 나가있게 되는데, 거기에서 쓸 모델 M 키보드를 가져갈 순 없고 (이것만 해도 2kg에 가까우니), 그렇다고 큰맘 먹고 풀옵션으로 지른 노트북을 중고로 팔아버릴수도 없고 (다음엔 절대로 델 안사요… 기본적인 키보드 하나도 제대로 못 만들다니…), 결국 휴대할 수 있는 기계식 키보드를 알아보게 되었어요. 그래서 Anne Pro를 샀어요<

대략적으로 이런 느낌의 키보드에요:

  • 61키 (표준 키 레이아웃에서 상단 펑션키, 방향키, 텐키, Home, Insert 등 네비게이션 키를 제외한 키들)
  • 체리 호환 스위치 – 게이트론 (미노리는 갈축으로 샀어요<)
  • 아주 화려하게 빛나는 파도타기까지 하는 의미를 잘 모르겠는 RGB 백라이트 기능들, 가끔 버그로 인해서 먹통이 되거나 몇 키의 색이 변함
  • 위의 백라이트를 풀로 켜면 (의미는 모르겠지만 무려 10단계 밝기 조절!) 몇시간 가지 못하는 작은 리튬 배터리
  • 4개의 프리셋 지정 가능한 블루투스 연결, 그냥 USB로 연결해서도 물론 사용 가능
  • PBT 키캡
  • 뽑기에 따라서 꽤 철컥거리는 소리가 나는 체리식 스테빌라이저
  • 있다곤 하지만 펌웨어 단 버그로 쓸 수 없는 하드웨어 키 매크로
  • 펌웨어 업그레이드 기능, Rust로 짜고 있는 커스텀 펌웨어가 존재 (아직 배터리가 줄줄 새어나가지만)

전형적인 중국제 기계식 키보드고, 판매자에 따라서 좀 다르지만 중국에서 몇만원 하지 않는 가격에 살 수 있어요< 이거랑 아주 비슷한 기능을 가진 모델인 스카이디지털 NKEYBOARD BT61이 한국 시장에서 약 4만원에 팔리고 있으니 (카일축이지만, 어차피 호환축이 뭐 그게 그거니), AS랑 물건이 오는 시간이 중요하다면 저쪽을 사는것도 좋을 것 같아요<


그래서 지금 이 글을 계속 새로 산 키보드로 쓰고 있는데, 생각보다 갈축도 멤브레인 키보드 수준의 소리는 난다는 걸 알았어요. 그래도 이정도의 소리라면 사무실에서 써도 크게 뭐라고 욕을 먹진 않을 것 같아요. 우선은 주로 사용할 블루투스 연결로 사용하고 있는데, 특별히 연결이 불안정 하다거나, 글자 입력이 무시된다거나 하는 문제는 없는 것 같아요. 이건 좀 더 써봐야 알겠지만, 이 글을 입력하면서 델 키보드는 거의 한 문장마다 한두번씩은 키가 무시되거나 두번 눌리는 문제가 생길거라는 걸 생각하면, 이건 아주 양호하다고 생각되어요<

스테빌라이저는 뽑기 운이 있다는 것 같고, 최근 바뀐 리비전에선 스테빌라이저 소리가 많이 조용해졌다는 것 같아요. 여전히 좀 찰랑거리는 소리가 나긴 하지만, 이정도는 별 신경 안 쓰고 쓸 수 있을 것 같아요. (미노리가 원래 많이 철컥거리는 버클링 키보드를 사용하는 사람이라는 걸 참고하세요.)

몸체의 경우엔 아래에 꽤 큰 고무 발바닥이 달려 있어서 밀리거나 하는 문제는 없어요. 키보드가 작다보니 몸체가 비틀린다거나 하는 문제도 특별히 없어요. 물론 이렇게 작은 키보드에서 몸체가 조금만 힘을 주면 비틀린다는 건 정말로 키보드를 엉망으로 만들었다는 이야기가 되겠지만…

배터리의 경우엔 아직 완전히 충전하지 않았기 때문에 역시 잘 모르겠어요. 백라이트를 끈다면 생각보단 꽤 오래 쓸 수 있을 것 같지만, 이건 더 써봐야 알 수 있을 것 같아요. 이 키보드의 최고 단점 중 하나가 물리적으로 전원을 차단하는 스위치가 없다는 건데, 과연 가방속에 대충 넣어둔 상태에서 키가 눌렸을 때 어느정도의 전기를 소모할진 잘 모르겠어요.


결론적으론, 싼 값에 살 수 있는 PBT 키캡을 가진 작고 단단한 중국산 휴대용 블루투스 기계식 키보드에요. RGB 백라이트는 기믹이고, 매크로 기능은 그냥 없는거에요. RGB 백라이트와 PBT 키캡이 필요하지 않다면 물리 전원 스위치가 있는 스카이디지털의 키보드를 사는게 더 좋은 선택일거에요.

Dell XPS 13 (9360, Kaby Lake-R) 에 해킨토시를 설치 (했던 기록)

왜죠..?

평소와 같이 장난아니게 한가하던 토요일 밤, 마유와 이야기 하다가 이런 이야기가 나오게 되었고…

stringByAddingPercentEncodingWithAllowedCharacters:
– Apple, 2018

이런 직관성을 보니, 평소 기-인 이름을 애용하는 사람으로서 ‘하지’ 않을 수 없었습니다..<

어떻게..?

10년 전, 호랑이가 아직 산으로 올라가지 못했던 시절 (OS X Tiger) 에는 흔히 미리 수정된 이미지를 가지고 설치를 했지만, 이젠 아주 간단한 부트로더 만으로 기본적인 설치는 가능합니다. 세상이 참 좋아졌죠<

Clover EFI Bootloader
FakeSMC

물론 이것만 깔면 대부분의 경우엔 그래픽 가속도 되지 않으면서 버벅거리고 소리도 안 나고 인터넷도 안 되는 맥 os의 메인 화면을 만날 수 있기 때문에, 추가적으로 여기에 흑마법을 부리기 시작하게 되죠<

우선 고칠 수 없는 것과 고칠 수는 있는 것 골라내기

우선 XPS13에 달려있는 무선 랜카드1)퀄컴 혹은 인텔는 도저히 고칠 수 없어요, 맥에서 네이티브로 쓰는 무선랜 칩셋은 브로드컴이기 때문에 브로드컴 카드를 써야 해요2)본격적인 무선랜 부자가 되어갑니다…….
하이버네이션 기능은 일반적인 PC랑 이 애들이 좀 다른 구조로 전원 관리를 하기 때문에 고치기가 많이 힘들어요, 어차피 켜고 끄는데 15초면 될테니 그냥 재우기3)다행히 호환이 잘 되는만 쓰도록 해요.
아이메세지 라거나 페이스타임 등은 유효한 기기 시리얼 번호를 필요로 하기도 하고, 미노리는 어차피 애플 기기를 안 쓰기 때문에 안 고치기로 해요.
3-4점 터치 멀티터치 트랙패드도 고치고 싶지만, 고칠 수 없기 때문에..< 그냥 기본적인 트랙패드 기능만 동작하도록 할래요.
SD 카드 리더기도 드라이버가 없으니 고칠 수 없어요, 켜두면 전원만 먹을테니 바이오스에서 꺼버리기로 해요.
지문 인식 센서는 당연히 맥북거랑 제조사가 달라요, 저긴 자체 센서를 쓸테니 포기해요<

그래픽 가속은 어차피 CPU 내장 그래픽카드니까 이건 생각보단 쉽게 고칠 수 있을거에요<
사운드카드도 Intel HDA 호환이니 정 안되면 VoodooHDA를 사용하면 붙을거에요.
키보드 레이아웃은 아주 쉽게 고칠 수 있어요.
웹캠은 어차피 USB 인터페이스로 연결될거라 아마 OOB로 동작할거에요.
배터리 관리도 어차피 표준적인 ACPI 인터페이스를 사용하니 간단하게 고칠 수 있을거에요.
USB 버스는 예전 6시리즈 보드에선 서드파티 3.0을 써서 좀 귀찮았지만, 이젠 인텔의 루트버스를 사용하기 때문에 아마도 OOB로 동작할거에요.
썬더볼트도 인텔 컨트롤러를 쓰고 있기 때문에 아마 OOB로 동작할거에요.
NVMe는 최근 맥에서도 네이티브 지원이 생겼을거에요, 4k 섹터를 지원하는 물건이라면 적어도 동작은 무리없이 잘 할거에요.

기초공사 시작

우선 좀 편하게 그럭저럭 바닐라인 시스템을 인스톨 하기 위해서 Unibeast를 사용하기로 해요, 부팅 디스크를 적절하게 만들고 평범하게 macOS를 설치<

그리고 Unibeast USB에 따라오는 Clover를 이용해서 우선은 설치된 macOS로 부팅을 하면, 앞에서 언급한 것 처럼 많이 불편한 데스크탑이 뜨죠..<
원래대로라면 Multibeast를 써서 설정하는 사람이 많겠지만, 미노리는 미니멀한 것을 좋아하기 때문에 직접 수동으로 설정하도록 합니다<

계속 Unibeast를 사용해서 부팅할 순 없으니, Clover를 내려받아서 설치하도록 해요, 기본 설정은 맥의 루트 파티션에다가 설치하게 되어있지만, 보통 해킨토시를 쓰는 사람의 바이오스는 HFS 등에서 EFI 바이너리를 불러올 수 없으므로 EFS에 설치하도록 합시다<

그리고 희망을 가지고 -v 옵션을 주고 재부팅을 하면… 그래픽카드때문에 패닉이 나면서 부팅이 안되죠, 다시 Unibeast로 부팅<

흑마법 시작

흑마법은 보통 커널 모듈 (kext)를 사용해서 부리게 돼요, 기본적으론 동작하지 않는 하드웨어의 드라이버를 붙여서 돌아가게 하는거랑 비슷하죠<

흑마법을 부려야 할 항목 해당하는 kext들 (아마)
그래픽 CoreDisplayFixup, IntelGraphicsFixup, Lilu, FakePCIID_Intel_HD_Graphics
사운드 AppleHDA_ALC256 (패치), CodecCommander
배터리 ACPIBatteryManager
무선랜 (Broadcom) BrcmFirmwareRepo, BrcmPatchRAM2, FakePCIID_Broadcom_WiFi
화면 백라이트 AppleBacklightInjector
터치패드 VoodooPS2Controller

의존성 면에서 빠진게 좀 있을 수 있지만, 대충 이런 느낌으로…

그리고 맥은 그래픽카드를 아주 활발하게 사용하기 때문에, 그리고 그래픽 프레임버퍼의 크기가 어느정도 이상 되는걸 항상 생각하고 만들었기 때문에 DVMT minimum size를 64M 정도로 수정해야 해요< 안그러면 역시 패닉이 납니다< 바이오스에 저 설정이 있으면 다행인데, 없으면 바이오스를 뜯어보면서 efivar의 offset을 찾아서 수동으로 설정해야 해요, 바이오스에서 안 막았다면..<

이런 흑마법을 다 하고 나서 부팅을 한다면… 아마도 부팅이 잘 될거에요<

신나게 다 깔고 나서 알아차린 문제 – 프리징

설정하고 수시로 재부팅 할 땐 모르던 문젠데, 다 설정하고 나서 왠지 모르게 5-10분, 혹은 30분정도로 랜덤으로 프리징이 발생하던 문제가 있었어요.
관련해서 C-state라거나 그래픽카드 id 스푸핑이라거나 다 해봤지만 도저히 고칠 수 없었기 때문에, IO 장치쪽을 의심하고 한번 APFS가 아닌 HFS로4)설치 과정에서 변환되지 않도록 수동으로 설정하고 macOS를 다시 설치했는데…
잘…되네요…

결국 삭제하게 된 이유

Filevault를 활성화 할 수 없어서 결국 삭제했어요, 데이터 암호화는 무지 소중하기 때문에..< Clovar EFI가 분명 (일부 필요한 드라이버들을 넣으면) filevault를 지원해야 하지만, 왠지 모르게 그냥 검은 화면에 커서만 깜박거리면서 멈춰버리더라구요… 한 이틀 정도 OS를 계속 밀면서 시도를 해봤지만, 더 이상 시도할 필요가 없다는 생각이 들었고, 그냥 다시 리눅스로 돌아왔어요<

Sn   [ + ]

TDP and turbo parameter modification with MSR on non-overclockable CPU

Disclaimer

  • MSR modification may void your CPU’s (or system board’s) warranty. Proceed with care. I’m not responsible for any destruction caused by this article.
  • MSR address (greatly) differs from CPU to CPU. Check your own CPU’s MSR address using Intel’s documentation.
  • Only tested on Intel i7-8550U (Kaby Lake R).
  • This article is translation of this article. If you can understand Korean, I recommend reading that article, not this.

Start

On Windows, Intel XTU can be used for modifying turbo-boost parameter and TDP related settings. But on other OSes, there are no specific (user friendly) tools available. In this article, I will directly modify MSR (Model-Specific Registers) to achieve similar effect.

Know about your CPU

There are many CPU models. We call them by their friendly names – such as ‘Core i7’ – but this is not enough in this article. In fact, some CPUs are very different even if they are named after same friendly name. Some CPUs are named different, but they are actually same varient of other CPU. In Intel, they distinguish between CPU using CPU family and model. For example,

$ cat /proc/cpuinfo | less
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 142
model name      : Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz
stepping        : 10
...

Note that /proc/cpuinfo returns CPU family and model by decimal.

Some dependencies

In Linux, you will need msr-tools, and msr kernel module. You may want to insert kernel module automatically by adding appropriate configuration. (e.g., echo msr > /etc/modules-load.d/msr.conf in Arch Linux)

You can read from MSR with rdmsr 0x(address) and write to MSR with wrmsr 0x(address) 0x(value). When reading, you can specify bitmasks by -f 15:0 (from bit 0 to bit 15, in reverse).

Power/Energy/Time units

My CPU has MSR_RAPL_POWER_UNIT at address 606h.

606H MSR_RAPL_POWER_UNIT (RO)
    3:0 = Power unit (W) = 1/2^(decimal)W - def: 0.125W
    12:8 = Energy unit (J) = 1/2^(decimal)J - def: 0.00006103515625J
    19:16 = Time unit (sec) = 1/2^(decimal)sec - def: 0.0009765625sec

These units are needed to modify existing values.

Package power limits

Now the fun part begins, MSR_PKG_POWER_LIMIT has package power limit variables.

610H MSR_PKG_POWER_LIMIT (RW)
    14:0 = Pkg power limit = Powerunit * decimal
    15:15 = Pkg power enabled (bool)
    16:16 = Pkg clamping limit (bool)
    23:17 = Pkg power limit time window = 2^(21:17 bit) * (1.0 + (23:22 bit)/4.0 ) * Timeunit

    46:32 = Pkg power limit 2 = Powerunit * decimal
    47:47 = Pkg power 2 enabled (bool)
    48:48 = Pkg clamping limit 2 (bool)
    55:49 = Pkg power limit time window = 2^(53:49 bit) * (1.0 + (55:54 bit)/4.0 ) * Timeunit

    63:63 = MSR lock (bool)

If bit 63 is 0, those values can be changed by writing to 0x610 register. You may change package power limit to higher TDP, and prolong limit time window to increase your processor’s performance (if you are not throttled by thermal throttling).

Turbo boost ratio limit

If MSR_PLATFORM_INFO[28] is 1, you can also change turbo boost limit variable.

CEH MSR_PLATFORM_INFO
    15:8 = Maximum non-turbo (RO) bool
    28 = Programmable ratio limit for turbo (RO) bool
    29 = Programmable TDP limit for turbo (RO) bool
    30 = Programmable TJ offset (RO) bool

1ADH MSR_TURBO_RATIO_LIMIT (RO if MSR_PLATFORM_INFO[28]=0, else RW)
    7:0 = Ratio 1C
    15:8 = Ratio 2C
    23:16 = Ratio 3C
    31:24 = Ratio 4C

Real life example, tune i7-8550U processor

Using above information, I could change MSR on my processor – i7-8550U.

Since this processor is limited to 37 boost ratio when all 4 cores are being used, I changed limitation to 40. Also, I changed 23W limit to 25W with longer (1073741824 seconds) boost duration.

From

610H
    42819800dd80b8h

    00000000 01000010 10000001 10011000
    00000000 11011101 10000000 10111000

    14:0 = Pkg power limit = 10111000b (184d, b8h) = 23
    15:15 = Pkg power enabled (bool) = 1b
    16:16 = Pkg clamping limit (bool) = 1b
    23:17 = Pkg power limit time window = 11b(3d) 01110b(14d) = 2^14*(1+3/4)*(1/2)^10=28

    46:32 = Pkg power limit 2 = 110011000b (408d, 198h) = 51
    47:47 = Pkg power 2 enabled (bool) = 1b
    48:48 = Pkg clamping limit 2 (bool) = 0b
    55:49 = Pkg power limit time window = 01b(1d) 00001b(1d) = 2^1*(1+1/4)*(1/2)^10=0.00244140625

    63:63 = MSR lock (bool) = 0b

1ADH
    25252828h

    7:0 = Ratio 1C = 40
    15:8 = Ratio 2C = 40
    23:16 = Ratio 3C = 37
    31:24 = Ratio 4C = 37

To

610H
    42819800FC80C8h

    00000000 01000010 10000001 10011000
    00000000 11111100 10000000 11001000

    14:0 = Pkg power limit = 11001000b (200d, c8h) = 25
    15:15 = Pkg power enabled (bool) = 1b
    16:16 = Pkg clamping limit (bool) = 0b
    23:17 = Pkg power limit time window = 11b(3d) 11110b(30d) = 2^30*(1+3/4)*(1/2)^10=1073741824

    46:32 = Pkg power limit 2 = 110011000b (408d, 198h) = 51
    47:47 = Pkg power 2 enabled (bool) = 1b
    48:48 = Pkg clamping limit 2 (bool) = 0b
    55:49 = Pkg power limit time window = 01b(1d) 00001b(1d) = 2^1*(1+1/4)*(1/2)^10=0.00244140625

    63:63 = MSR lock (bool) = 0b

1ADH
    28282828h

    7:0 = Ratio 1C = 40
    15:8 = Ratio 2C = 40
    23:16 = Ratio 3C = 40
    31:24 = Ratio 4C = 40

Result

turbostat reported updated TDP limit and duration, and changed turbo boost ratio. I could not test real life performance difference, since my processor is heavily throttled by thermal throttling even at 15W TDP.

오버클러킹이 불가능한 인텔 CPU에서 MSR을 이용한 TDP와 터보 파라미터 수정

면책조항

  • MSR 수정은 CPU (혹은 시스템 보드) 의 보증을 무효화 시킬 수 있습니다. 조심해서 진행하세요. 전 이 글로 인해 발생한 어떠한 피해에 대해 책임을 지지 않습니다.
  • MSR 주소는 CPU 마다 (아주 많이) 다릅니다. 인텔의 문서를 참고하여 직접 사용하고 있는 CPU의 MSR 주소를 확인하세요.
  • 인텔 i7-8550U (카비레이크 리프레시) 에서만 테스트 되었습니다.
  • 이 글의 영어 번역본이 존재합니다. 영어를 모국어로 사용하는 분이라면 이쪽을 읽는걸 고려해보세요.

시작

윈도우 에선 Intel XTU 를 사용하여 터보 파라미터와 TDP 관련 설정을 변경할 수 있습니다. 하지만 다른 운영체제에선 (유저 친화적인) 도구가 존재하지 않습니다. 이 글에서 저는 MSR (Model-Specific Registers) 를 직접 수정하여 비슷한 결과를 만들어 낼 것입니다.

당신의 CPU에 대해 더 자세히 알아보세요

우리 주변엔 많은 CPU들이 존재하고, 우리는 그들을 흔히 불리는 이름 – 예를 들어서 ‘Core i7’ – 으로 부릅니다. 하지만 이 정도론 충분하지 않습니다. 사실, 어떤 CPU는 우리가 같은 흔히 불리는 이름으로 불러도 내부적으론 너무 다릅니다. 그리고 어떤 CPU는 다른 이름으로 불리지만 내부적으로는 다른 CPU과 같게 동작하기도 합니다. 인텔에서는 CPU를 CPU familymodel로 분류합니다. 예를 들어,

$ cat /proc/cpuinfo | less
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 142
model name      : Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz
stepping        : 10
...

/proc/cpuinfo 가 CPU family와 model을 10진수로 반환하는 것에 유의하세요.

일부 의존성

리눅스에선 msr-toolsmsr 커널 모듈이 필요합니다. 적합한 설정을 사용하여 커널 모듈을 자동으로 삽입하게 할 수도 있습니다. (예를 들어서 아치리눅스에서 echo msr > /etc/modules-load.d/msr.conf)

위의 도구를 사용하여 MSR에서 데이터를 rdmsr 0x(주소) 의 형식으로 읽을 수 있고, MSR에 데이터를 wrmsr 0x(주소) 0x(값) 형식으로 쓸 수 있습니다. 데이터를 읽을 때, 특정 비트마스크를 -f 15:0 (비트 0에서 비트 15까지, 역순으로) 의 형식으로 적용할 수 있습니다.

전력/에너지/시간 단위

제 CPU는 MSR_RAPL_POWER_UNIT 레지스터가 606h 에 존재합니다.

606H MSR_RAPL_POWER_UNIT (RO)
    3:0 = 전력 단위 (W) = 1/2^(10진수)W - 초기값: 0.125W
    12:8 = 에너지 단위 (J) = 1/2^(10진수)J - 초기값: 0.00006103515625J
    19:16 = 시간 단위 (sec) = 1/2^(10진수)sec - 초기값: 0.0009765625sec

이 단위들은 앞으로 다룰 레지스터에 이미 존재하는 값을 수정하는데에 필요합니다.

패키지 전력 제한

이제 재미있는 부분이 시작됩니다, MSR_PKG_POWER_LIMIT 레지스터는 프로세서 패키지의 전력 제한 변수를 가지고 있습니다.

610H MSR_PKG_POWER_LIMIT (RW)
    14:0 = 패키지 전력 제한 = 전력 단위 * 10진수
    15:15 = 패키지 전력 제한 활성화 (부울린)
    16:16 = 패키지 클램핑 제한 (부울린)
    23:17 = 패키지 전력 제한 시간 = 2^(21:17 비트) * (1.0 + (23:22 비트)/4.0 ) * 시간 단위

    46:32 = 패키지 전력 제한 2 = 전력 단위 * 10진수
    47:47 = 패키지 전력 제한 2 활성화 (부울린)
    48:48 = 패키지 클램핑 제한 2 (부울린)
    55:49 = 패키지 전력 제한 시간 2 = 2^(53:49 비트) * (1.0 + (55:54 비트)/4.0 ) * 시간 단위

    63:63 = MSR 잠금 (부울린)

만약 비트 63이 0이라면, 저 값들은 0x610 레지스터에 기록하는 방법으로 바꿀 수 있습니다. 패키지 전력 제한을 더 높은 값으로 바꾸고, 전력 제한 시간을 더 늘려서 (만약 온도 스로틀링에 영향을 받지 않는다는 가정 아래에) 프로세서의 성능을 향상시킬 수 있습니다.

터보 부스트 배율 제한

MSR_PLATFORM_INFO[28] 레지스터의 값이 1 이라면, 터보 부스트 배율 제한 변수도 바꿀 수 있습니다.

CEH MSR_PLATFORM_INFO
    15:8 = 최대 비-터보 비율 (RO) 
    28 = 터보 비율 수정 가능 (RO) 부울린
    29 = 터보 TDP 수정 가능 (RO) 부울린
    30 = 온도 제한 수정 가능 (RO) 부울린

1ADH MSR_TURBO_RATIO_LIMIT (MSR_PLATFORM_INFO[28]=0 이라면 RO, 아니면 RW)
    7:0 = 코어 하나 로드 시 배율
    15:8 = 코어 둘 로드 시 배율
    23:16 = 코어 셋 로드 시 배율
    31:24 = 코어 넷 로드 시 배율

실제 예제 – i7-8550U 프로세서를 튜닝

위의 정보를 사용하여 제 프로세서인 i7-8550U의 MSR을 수정할 수 있었습니다.

이 프로세서가 전체 코어 로드 시 37 배율로 제한되어 있기 때문에, 이 제한을 40 배율로 바꿨습니다. 또한 23와트 제한을 25와트로, 그리고 부스트 시간을 1073741824로 바꿨습니다.

원래 값

610H
    42819800dd80b8h

    00000000 01000010 10000001 10011000
    00000000 11011101 10000000 10111000

    14:0 = 패키지 전력 제한 = 10111000b (184d, b8h) = 23
    15:15 = 패키지 전력 제한 활성화 (부울린) = 1b
    16:16 = 패키지 클램핑 제한 (부울린) = 1b
    23:17 = 패키지 전력 제한 시간 = 11b(3d) 01110b(14d) = 2^14*(1+3/4)*(1/2)^10=28

    46:32 = 패키지 전력 제한 2 = 110011000b (408d, 198h) = 51
    47:47 = 패키지 전력 제한 2 활성화 (부울린) = 1b
    48:48 = 패키지 클램핑 제한 2 (부울린) = 0b
    55:49 = 패키지 전력 제한 시간 2 = 01b(1d) 00001b(1d) = 2^1*(1+1/4)*(1/2)^10=0.00244140625

    63:63 = MSR 잠금 (부울린) = 0b

1ADH
    25252828h

    7:0 = 코어 하나 로드 시 배율 = 40
    15:8 = 코어 둘 로드 시 배율 = 40
    23:16 = 코어 셋 로드 시 배율 = 37
    31:24 = 코어 넷 로드 시 배율 = 37

수정한 값

610H
    42819800FC80C8h

    00000000 01000010 10000001 10011000
    00000000 11111100 10000000 11001000

    14:0 = 패키지 전력 제한 = 10111000b (184d, b8h) = 25
    15:15 = 패키지 전력 제한 활성화 (부울린) = 1b
    16:16 = 패키지 클램핑 제한 (부울린) = 0b
    23:17 = 패키지 전력 제한 시간 = 11b(3d) 11110b(30d) = 2^30*(1+3/4)*(1/2)^10=1073741824

    46:32 = 패키지 전력 제한 2 = 110011000b (408d, 198h) = 51
    47:47 = 패키지 전력 제한 2 활성화 (부울린) = 1b
    48:48 = 패키지 클램핑 제한 2 (부울린) = 0b
    55:49 = 패키지 전력 제한 시간 2 = 01b(1d) 00001b(1d) = 2^1*(1+1/4)*(1/2)^10=0.00244140625

    63:63 = MSR 잠금 (부울린) = 0b

1ADH
    28282828h

    7:0 = 코어 하나 로드 시 배율 = 40
    15:8 = 코어 둘 로드 시 배율 = 40
    23:16 = 코어 셋 로드 시 배율 = 40
    31:24 = 코어 넷 로드 시 배율 = 40

결과

turbostat 을 사용하여 TDP 제한과 시간, 그리고 터보 부스트 배율이 바뀐 걸 확인할 수 있었습니다. 이미 제 프로세서가 15W TDP에서도 열 스로틀링의 영향을 받기 때문에 실제 성능 향상에 대해선 테스트 할 수 없었습니다.

만약 이 작업을 실행해도 실제로 성능이 향상되지 않는다면 이 글도 보세요.

Intel 9260을 샀어요<

유노쨩에게 정든 생각판때기1)ThinkPad X240을 보내면서, XPS 13에 원래 달려있던 Killer 무선랜을 끼워서 보냈었는데, 역시 유노쨩도 도저히 못 써먹겠다고 해서 다시 Intel 7260을 돌려주기로 했어요..<

그래서 무언가 대체할 물건이 필요해서 9260을 주문했습니다<

주문해서 도착한…건 좋은데, 이거 왠지 좀 심각하게 아직 버그가 있는 것 같네요..<

뭐, 너무 날카로워서 베일 것 같은2)Bleeding-edge 하드웨어를 산 미노리가 잘못한거죠..< 그나마 다행인 건 저 버그의 인텔쪽(!) 담당자인 Emmanuel 아저씨가 관리하는 backport-iwlwifi 드라이버를 사용하면 아마…도..? 고쳐진 것 처럼 보인다는 것…


추가 1, 5GHz AP는 왠지 저렇게 하면 고쳐진…것 같은데, 왠지 OpenWRT를 올려둔 공유기3)2.4GHz 에선 또 성능이 처참하게 나오기 시작하네요… 이렇게 되면 노트북 내장 무선랜은 못 쓰고 미디어텍 usb 무선랜 동글을 가지고 다녀야 하는 건가…

Sn   [ + ]

CTL-472/672 를 리눅스에서도 사용

English TL;DR – Apply this patch(Linux kernel), or this patch(input-wacom), or use this repository to install modified wacom kernel module for your CTL-472/672. No need to modify xf86-input-wacom (at least in Arch). Patch credits to Jason Gerecke.


최근 (이라곤 해도 몇 달 되었지만) 꽤 저렴한 와콤 디지타이저1)WACOM One by WACOM – CTL-472가 나와서, 한번 그림을 그려볼까 하고 샀는데, 사고 나서 보니 드라이버 지원이 되는지 체크하는 걸 깜빡했더라구요..<

아니나 다를까 집에 디지타이저가 도착해서 컴퓨터에 연결해보니 역시 지원이 제대로 되지 않았어요<

(뭔가 흐름이 이상하지만) 그래서 한번 되게 만들어 보았습니다<


리눅스 시스템의 와콤 디지타이저 동작 구조

뭘 해야 하는지에 대해서 들어가기 전에, 우선 와콤 디지타이저가 리눅스에서 어떻게 동작하는지 간단하게 쓸래요<

와콤 커널 모듈이 우선 있고, 이 장치가 있어야 와콤 디지타이저가 xinput 장치로 잡히게 되어요< 이 상태에선 절대 좌표 포인팅 장치론 작동하게 되죠<
그리고 xinput 드라이버가 있어서 이 xinput 장치에 대한 확장 기능들 – 필압이라거나… 가 지원되게 되어요<

그런데 당연하지만 이 디지타이저는 출시된 지 그렇게 오래 되지 않았고, 그렇게 인기가 많은 장치도 아니기 때문에 메인라인 커널에 있는 모듈이 아직 이 장치의 지원을 하지 않아요, 그래서 커널 소스를 수정하거나, 와콤의 메인라인 커널모듈인 input-wacom 소스를 수정해야 해요<

당연하지만 후자가 더 편한 일이고 (전자는 커널이 새로 나올때마다 매번 커널을 통째로 다시 컴파일을 해야 하니…) 그래서 후자로 해 보았습니다<


패치!

수동으로 이 장치가 어떤 필압 단계를 지원하고, 어떤 감지 영역을 지원하는지 입력해서 장치를 인식하도록 할 수도 있겠지만2)어차피 바닥부터 새로 만들어진 장치가 아니고, 기존 장치랑 거의 똑같이 동작하니까요< 다행스럽게도 이미 패치가 있어요<

여기

저 패치는 커널에 적용되는 패치인데, 어차피 wacom_wac.c 파일은 input-wacom 쪽에도 있으니 이 패치 내용을 수동으로 적용해주면 되겠죠<

혹시 귀찮다면 이 패치를 input-wacom에 적용하시면 될거에요< 요즘도 4.5 커널 아래를 쓰는 사람은 없을 것 같으니 4.5 버전 드라이버만 패치해두었는데, 만약 아래라면.. 수동으로 하셔야겠죠..<

이것도 귀찮으시다면 이 레포지토리 에 이미 패치를 적용해 두었으니 이걸 사용하시면 될거에요, 역시 4.5쪽만 패치했어요, 그리고 주기적으로 업데이트 안 할 거니 어지간하면 직접 패치하세요..<


컴파일 후 설치!

이제 이걸 설치하는 단계인데, 미노리는 아치 리눅스를 쓰고 있기 때문에, 아치 리눅스의 input-wacom-dkms AUR 패키지를 클론했어요<3)만약 데비안이나 우분투를 쓰고 계시다면… 수동으로 make 해서 커널모듈을 복사하거나, dkms를 설정하면 좀 더 편하겠죠..<

드라이버 버전이 업데이트 되어도 미노리를 귀찮게 하지 않도록 패키지 이름을 적당하게 바꾸고, 패키지의 소스 위치를 적당히 수정하면 앞으로 커널 버전이 업데이트 될 때마다 자동으로 모듈이 업데이트 되겠죠<


Profit!

마지막으로 디지타이저를 연결하고 나서 dmesg를 보니

[23309.595292] input: Wacom One by Wacom S Pen as /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.1/1-1.1.3/1-1.1.3:1.0/0003:056A:037A.0007/input/input52
[23309.595920] wacom 0003:056A:037A.0007: hidraw5: USB HID v1.10 Mouse [Wacom Co.,Ltd. CTL-472] on usb-0000:00:14.0-1.1.3/input0

Krita를 실행해서 선을 한번 그어보니 필압 감지가 잘 되네요, 이제 그리기만 하면 되는데…. 이게 제일 어렵겠죠<

Sn   [ + ]