이 글은 본인 섭취 칼로리 양을 못 줄이는 인간이 자기 노트북 섭취 칼로리를 줄여버리는 내용을 담고 있습니다.
어제쯤 언더볼팅 관련해서 글을 하나 올린 적이 있지요.
플런더볼트와 하드웨어 형식의 접근 방법인 볼트필리저에 대한 이야기였습니다.
( 참고: https://gigglehd.com/gg/8898184 )
밥을 한참 모자라게 주니까 당연히 계산도 좀 틀리고 그럴 수 있는데, 하필 그 중에서 위험한거 관리하는 놈이 계산이 틀리니까, "밥은 정량대로"라고 망치 땅땅 했는데
부르주아들은 자기 밥그릇 줄이면 난리나도 고용인 밥그릇은 줄여야겠쥬? 어떻게든 법망을 피해서 고용인들의 밥그릇을 줄이려는 시도를 합니다.
만국의 노동자들이여 일어나세요! ... 가 아니라 오늘은 부르주아의 입장에서 법망을 피하는 이야기를 하게 될겁니다. 저도 그냥 월급루팡 노동자인데 배신이군요. 아아...
암튼, 앞서 빌드업을 해보려던 저 글을 통해 인텔이 10세대의 언더볼팅을 막기위해 BIOS 벤더에게 그걸 맡겼고, 덕분에 여러 제조사들 마다 언더볼팅을 어떻게 조치할건지 다르게들 행동했다는 것을 확인할 수 있었습니다. 그 중에서 DELL은 사용자가 선택할 여지를 주지 않고 막아버렸죠.
암튼 저한테도 i7-10750h를 사용하는 노트북이 있는데, 이놈이 그 ... DELL놈입니다.
ThrottleStop을 실행하면 FIVR Control 옆에 - Locked가 적혀 있습니다. apply를 눌러도 바뀌지 않죠. XTU는 말할 것도 없이 막혀있습니다.
근데 사람 마음이라는게 ... 원래 하지말라는거 더 하고싶잖아요? 그래서 했습니다.
<주의: 아래 내용을 따라하면서 발생하는 모든 문제는 당신의 책임입니다. 저도 아니고 주인장님도 아닙니다.>
1. 일단 뭐가 문제인지 뭘 어떻게 해야할지 생각해봅시다
1) 대체 뭘로 막은거지? 하드웨어인가 소프트웨어인가 >> 와이어링해야하는거면 안 해야지. 소프트웨어면 뭔가 피할 망법이 있겠지.
2) 근데 막은 방법이 BIOS라네? >> 해보자!
3) 그럼 최악의 상황은..
가. BIOS Modding 후 덮어쓰기일 경우 >> 벽돌 엔딩... 그럼 안 해야지
나. NVRAM에 적히는 변수 값 바꾸기라면 >> 배터리를 빼는 등의 방법으로 NVRAM만 초기화. 초기화가 안되면 또 다시 벽돌 엔딩이지만 이거 정도라면 괜찮지 않을까..?
2. 누가 시도해봤는지, 기존 방법이 있는지 선행연구를 찾아보는건 기본이죠.
1) 수준이 높은 순서대로 낮은 방향으로 가면서 찾아야..
가. XPS 9500 voltage unlock bios modding
나. i7 10750h undervolting
다. DELL bios intel 10th cpu undervolting
라. .... (하여튼 많은 키워드 조합)
마. bios modding ...
2) 다행히 마까지 가기전에 거의 들어 맞는 아이템을 찾았습니다.
가. DELL G7 7700을 누가 작업했네요. 그것도 DELL 바이오스에, 똑같은 인텔 10세대 H시리즙니다. i7-10750h.
>> 선행연구 출처: https://www.ozbargain.com.au/node/559551
3. 선행연구를 참고하고, 이걸 응용해서 목적을 달성해봅시다.
참고로 제가 링크랑 완전히 똑같이 했다면 전 이글을 남기지 않았을겁니다.
1) 일단 DELL 최신 바이오스를 구해야 합니다. 제가 작업할 XPS 15인치, 9500 모델의 최신 BIOS 버전은 2020년 12월 기준 1.4.0이 최신이고, 이 바이오스는 이미 제 시스템에 심어져 있습니다. 만약 BIOS를 모딩하고 덮어써야 하는 작업이 있다면 저는 여기서 그만뒀을겁니다. 저는 벽돌 엔딩을 생각하고 싶지 않아서요. 그래도 1.4.0 버전의 바이오스를 다운로드 합니다.
이름이 왜 프리시전 5550인지는 저도 모릅니다. 뭐 자동차 처럼 공통 프레임 뭐 이런거겠죠.
2) 여기서 BIOS 파일을 추출해야 합니다. 깃헙의 @platomav 사용자는 DELL PFS BIOS Extractor를 파이썬으로 구현하여 그 코드를 올려놓았습니다. 이걸 활용해서 파일을 추출할겁니다.
링크: BIOSUtilities/Dell PFS BIOS Extractor at master · platomav/BIOSUtilities · GitHub
여기 있는 Dell_PFS_Extract.py 파일을 받습니다. 이 파일은 python 3.7 버전 이상이 필요하고, 제 윈도우 머신에는 Anaconda 3(Python 3.8 버전, 다운로드: Anaconda | Individual Edition )이 설치되어 있기 때문에 이를 그대로 사용했습니다. Anaconda3 Command-line prompt를 열고 두 파일을 한 폴더에 몰아넣고 다음과 같이 파일을 추출했습니다:
바로 아래, Precision_5550_1.4.0.exe_extracted 라는 이름을 갖는 폴더가 생기고, 그 안에 파일들이 분리되어 있음을 볼 수 있습니다. 근데... 알집...?? ...
3) 암튼 저 파일 중 "1 -- 1 System BIOS with BiosGuard v1.4 ... .bin" 파일을 분해해서, 우리가 필요한 값을 알아내는 것이 목표가 되겠습니다.
UEFITool을 사용하여 우리가 필요한 파트를 먼저 찾아야 합니다. https://github.com/LongSoft/UEFITool 에서는 이 UEFI 바이오스에서 원하는 파트를 찾을 수 있게 도와줄겁니다.
다운로드 링크: Release A58 · LongSoft/UEFITool · GitHub , 여기서 UEFITool_NE_A58_win32.zip 파일을 대충 받아서 쓰면 됩니다. 실행하고 아래 그림처럼 open image file을 누른 다음에 저 "1 -- 1 System BIOS with 뭐시기.." 파일을 선택합니다.
그런 다음 메뉴의 Action - Search를 누르고,
CFG Lock이라는 문구를 찾습니다. 해킨토시 작업을 해보신 분들께는 익숙한 장면일지도?
그럼 검색 결과가 뜹니다. 대충 search 탭 아래 찾은 항목에 마우스를 가져다대고 클릭. 그러면 structure에 뭔가 뜰겁니다.
그럼 structure에 PE32 image section을 골라서 마우스 오른쪽 버튼을 눌러 컨텍스트 메뉴를 띄우고 "Extract as is..."를 선택합시다.
그리고 대중 주어진 값을 그대로 사용해서 저장버튼을 누르면 아래의 파일이 생깁니다.
4) 이제 저기서 IFR을 추출해야 합니다. @donovan6000 이라는 양반이 만든 Universal IFR Extractor를 써야 합니다. bios-mod.com 같은데서, 그리고 선행자료에서 사용한 원본파일을 사용할 수 있지만,
위의 UEFITool을 만드는 @LongSoft 깃헙 유저가 @donovan6000한테서 코드를 받아서 일부 버그를 수정한 새 버전이 있습니다. 여기서 받으세요. 이 결과가 더 보기 좋고, 이해하기도 좋습니다.
링크: Release 0.3.6 · LongSoft/Universal-IFR-Extractor · GitHub , 여기서 IRFExtractor_0.3.6_win.zip을 다운로드 받아 사용합니다.
대충 .. 을 눌러 위의 .sct 파일을 지정하고 extract 버튼을 누르고, 대충 지정된 이름으로 저장하면 같은 이름의 .txt 파일이 생기게 됩니다. 우리는 이제 여기서 필요한 값을 찾을 겁니다.
5) 이제 생성된 텍스트 파일을 엽니다. 대충 이런걸 볼 수 있게 됩니다:
6) 제 목적은 언더볼팅이지 해킨토시를 설치할 것은 아니라서, 저는 이 파일에서 "Overclocking Lock"을 찾을겁니다. 문자열을 찾아볼까요?
7) 우리는 여기서 무엇을 알 수 있냐면..., Overclocking Lock이 기본값으로 0x1 (enabled)로 가 있다는 것을 알 수 있고, 이놈이 UEFI 설정값으로 조절이 가능하다는 것을 알 수 있습니다. 알아야 할 핵심은 다음과 같습니다:
가. "VarStore: 0x3"
나. "VarStoreInfo (VarOffSet/VarName): 0xDA"
다. "Size: 1, Min: 0x0, Max: 0x1"
이 Overclocking Lock 항목은 0x0 또는 0x1 값을 설정할 수 있고, 0x3이라는 변수 저장 시작점(VarStore)과 0xDA라는 해당 변수의 오프셋(VarOffset)을 통해서 접근할 수 있게됩니다.
바로 위에, C-State 를 소프트웨어로 조절가능한 MSR(Model-Specific Register)에 접근 가능 여부를 결정할 수 있는 CFG Lock 여부도 조정할 수 있음을 알 수 있습니다. 역시 마찬가지로 0x0이나 0x1 값으로 off/on을 조절 가능하고, 기본값은 enabled (=즉, locked)이며, 0x3이라는 변수 저장 시작점과 0x3E라는 오프셋으로 찾아가서 바꿀 수 있다는 걸 알게 되었습니다. 언더볼팅에는 이게 필요없으나, 해킨토시를 쓸 사람이라면 이것도 off 해 볼 수 있을겁니다.
8) 근데 대체 0x3은 뭘 말하는걸까요? 이걸 알아보기 위해, 우리는 다음의 문자열을 검색해볼겁니다:
"VarStoreId: 0x3"
대충 120 라인 근처에 보면, 이것의 설정 구간 이름이 CpuSetup, 그리고 이것의 GUID는 B08...로 시작하는 긴 문자열이라는걸 알 수 있습니다. 여기서 명심해야 할 것은, 설정구간의 이름 "CpuSetup"입니다.
이 이름이나 GUID를 알아내야하는 이유가 뭐냐하면, UEFI 변수를 조작하는 수많은 소프트웨어 중에서, 어떤 걸로 접근하게 하는지를 알 수 없기 때문입니다. 그냥 0x3으로 접근하던지, 아니면 이름인 CpuSetup으로 접근하던지, 아니면 B08..로 시작하는 GUID로 접근하던지요.
선행문건에서 나온 도구는 일부 접근이 어려운 UEFI 변수를 설정할 수 있게 패치한 grub bootloader를 사용하고 있습니다. 여기서는 이름인 CpuSetup을 요구하고 있네요.
이제 남은 일은 이 UEFI 변수를 어떻게 바꿀지를 결정하고, 그것에 맞게 실행하면 됩니다.
(옵션) Intel XTU(Extreme Tuning Utility)를 사용해서 언더볼팅을 하고 싶은 경우, XTU Interface 활성화 방법
사실 저 CpuSetup, 0xda 를 0x0으로 바꾸면 MSR 0x150을 사용해서 전압 조정이 가능하게 되지만, XTU에서는 여전히 막혀있는 것처럼 보입니다. (주: XTU 버전 7.0 이후 버전이면 BIOS에서 무슨 짓을 하셔도 i7-10750h에서는 전압 조정이 불가능합니다)
그래서 저는 BIOS에 숨겨져있는 OverClocking Feature와, XTU Interface를 같이 활성화 시킬 겁니다.
위의 내용을 통해서, OverClocking Feature를 0x0 -> 0x1로, XTU Interface를 0x0 -> 0x1로 바꿔줄겁니다.
정리하자면..
>> OverClocking Feature 활성화(각각 설정저장소이름, 오프셋, 쓸 값): CpuSetup 0x1b7 0x1
>> XTU Interface 활성화: CpuSetup 0x1b8 0x1
9) 이제 UEFI 변수를 바꿔봅시다.
저는 선행문건에서 사용했던, setup_var를 사용할 수 있는 패치된 grub을 사용하기로 결정했습니다.
링크: Releases · XDleader555/grub_setup_var · GitHub , 여기 가면 v1.0-alpha, assets을 눌러보면 efi bootloader 파일이 두 개 보이실겁니다. 하나는 grubx64.efi, 다른 하나는 grubi386.efi 파일입니다.
저는 이미 EFI Bootloader가 설치된 USB를 들고 있었기 때문에, 그 USB을 열고, EFI/BOOT 폴더로 간 뒤,
grubx64.efi 파일을 복사하고, 이걸 BOOTX64.efi 라는 파일 이름으로 바꿔줍니다.
grubi386.efi 파일을 복사하고, 또 이걸 BOOTIA32.efi 라는 파일 이름으로 바꿔줬습니다.
EFI bootloader가 있는 USB가 없다면, 선행 문건에 나와있는대로 GUID 파티션 맵을 사용하는 GPT disk로 먼저 만들고 거기에 FAT32 파티션을 생성해 준 뒤, 그 USB에 EFI 폴더 만들고, 그 안에 다시 BOOT라는 폴더를 만들고, 저기서 받아온 grubx64.efi 파일을 복사해온 뒤 BOOTX64.efi 라는 파일 이름으로 바꿔주시면 됩니다.
10) XPS 9500을 켭니다. F12나 F2 연타해서 bios 진입하고 Boot configuration으로 가서 Secure boot를 끕니다.
11) 그런 다음에 저장하고 다시 재부팅. 이제 F12 연타해서 one-time configuration .. 그리고 USB로 부팅을 시켜줘서 grub을 띄웁니다.
12) 이제 grub 프롬프트가 뜨면... overclocking lock을 해제합니다.
명령어 형식은 다음과 같습니다: setup_var [설정구간이름] [오프셋] [값]
이제 위에서 알아낸 대로 입력해서 0x1을 0x0으로 바꿔줍니다. 겁나니까, 0xda(오프셋) 까지만 치고 엔터를 치면 현재 값을 보여줍니다. 최종 입력하기 전에 한번 값을 먼저 확인하고.. 0x1로 되어 있으면 이걸 0x0으로 바꿔주면 되는겁니다.
grub 프롬프트> setup_var CpuSetup 0xda 0x0
아래 사진에서는 선행 문건에 나와 있는 대로 CFG Lock도 풀어줬었습니다. 나중에는 다시 0x0으로 변경.
저는 앞에서 옵션인 XTU Interface, OverClocking Feature를 모두 활성화할 것이라, 명령어 두개를 더 입력해줬습니다:
grub 프롬프트> setup_var CpuSetup 0x1b7 0x1
grub 프롬프트> setup_var CpuSetup 0x1b8 0x1
마지막으로 reboot를 치면 재부팅이 일어날겁니다.
grub 프롬프트> reboot
13) 재부팅되면 다시 F12 또는 F2를 눌러 BIOS 화면으로 진입해서, Boot Configuration 항목을 눌러 다시 Secure Boot를 On으로 바꿔줍니다.
14) 이제 다 빼고 그냥 윈도우로 부팅합니다.
15-1) ThrottleStop에서 정상적으로 전압 조정이 가능해집니다. FIVR Control 옆에 Locked라는 문구가 사라졌죠?
HWINFO64에서도 잘 반영되는게 보입니다.
15-2) XTU 버전은 6.5.2.40 버전을 사용했습니다. 인텔 공홈에서 구하실 수 있는 7.0.1.4 버전과 그 이후의 버전은 *무조건* 변경이 안되게 바뀌어 있습니다. XTU를 사용하시려면 6.5.2.40 버전을 쓰세요. 6.4 버전은 설치할 때 오류가 날겁니다.
4. 마치며
이제 열심히 언더볼팅을 하면 됩니다. 저는 언더볼팅이 된다 안된다 정도만을 보기 때문에 안정화 이런건 크게 생각하지 않았습니다. -50mV~-70mV 정도에서는 인텔 CPU 검사 도구나 Prime95 정도에서 이상없이 동작하네요. 전압도 잘 조정되는걸 확인했습니다.
언더볼팅 적용 전 (Intel 프로세서 진단도구를 실행), 최대 ~1.345V
적용 후 (-70mV) : c최대 ~1.282V
사실 그렇게 뭐 치명적인 작업을 하는게 아니라서 노트북 CPU에 전압이 어떤지는 아무래도 상관없는데... 호기심이 사람을 이렇게 만드네요.
길고 재미 없는 글 봐주셔서 고맙습니다.