<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>2024 on Uniguri&#39;s Blog</title>
    <link>/tags/2024/</link>
    <description>Recent content in 2024 on Uniguri&#39;s Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Mon, 09 Dec 2024 14:51:14 +0000</lastBuildDate><atom:link href="/tags/2024/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>About_builtin_exptect</title>
      <link>/posts/recording/about-builtin-expect/</link>
      <pubDate>Mon, 09 Dec 2024 14:51:14 +0000</pubDate>
      
      <guid>/posts/recording/about-builtin-expect/</guid>
      <description>&lt;h2 id=&#34;background&#34;&gt;Background&lt;/h2&gt;
&lt;p&gt;컴퓨터 구조를 배우면서, MIPS 아키텍쳐에 대해 공부하고 있다.
MIPS의 경우, pipeline을 도입하고 branch prediction을 위해 여러 방법을 사용한다고 한다.
그 방법 중 static prediction의 방법으로 해당 branch가 거짓일 경우(즉, jump를 수행하지 않는 분기)로 예상하는 방법이 존재한다고 한다.&lt;/p&gt;
&lt;p&gt;이 방법을 보고나서 &lt;a href=&#34;https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html#index-_005f_005fbuiltin_005fexpect&#34;&gt;gcc의 __builtin_expect&lt;/a&gt;나 &lt;a href=&#34;https://en.cppreference.com/w/cpp/language/attributes/likely&#34;&gt;C++20의 likely 및 unlikely attribute&lt;/a&gt;가 이러한 분기 예측을 기반으로 구성되어 있는 것이 아닌가하는 생각이 들었다.
따라서 이를 간단하게 분석해보고자 하였다.&lt;/p&gt;
&lt;h2 id=&#34;__builtin_expect&#34;&gt;__builtin_expect&lt;/h2&gt;
&lt;p&gt;GCC에서는 컴파일러에게 도움을 줄 수 있는 여러 builtin macro를 제공한다.
앞서 언급했듯, 그 중에는 &lt;code&gt;__builtin_expect&lt;/code&gt;와 &lt;code&gt;__builtin_expect_with_probability&lt;/code&gt;가 존재한다.&lt;/p&gt;</description>
      <content>&lt;h2 id=&#34;background&#34;&gt;Background&lt;/h2&gt;
&lt;p&gt;컴퓨터 구조를 배우면서, MIPS 아키텍쳐에 대해 공부하고 있다.
MIPS의 경우, pipeline을 도입하고 branch prediction을 위해 여러 방법을 사용한다고 한다.
그 방법 중 static prediction의 방법으로 해당 branch가 거짓일 경우(즉, jump를 수행하지 않는 분기)로 예상하는 방법이 존재한다고 한다.&lt;/p&gt;
&lt;p&gt;이 방법을 보고나서 &lt;a href=&#34;https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html#index-_005f_005fbuiltin_005fexpect&#34;&gt;gcc의 __builtin_expect&lt;/a&gt;나 &lt;a href=&#34;https://en.cppreference.com/w/cpp/language/attributes/likely&#34;&gt;C++20의 likely 및 unlikely attribute&lt;/a&gt;가 이러한 분기 예측을 기반으로 구성되어 있는 것이 아닌가하는 생각이 들었다.
따라서 이를 간단하게 분석해보고자 하였다.&lt;/p&gt;
&lt;h2 id=&#34;__builtin_expect&#34;&gt;__builtin_expect&lt;/h2&gt;
&lt;p&gt;GCC에서는 컴파일러에게 도움을 줄 수 있는 여러 builtin macro를 제공한다.
앞서 언급했듯, 그 중에는 &lt;code&gt;__builtin_expect&lt;/code&gt;와 &lt;code&gt;__builtin_expect_with_probability&lt;/code&gt;가 존재한다.&lt;/p&gt;
&lt;h3 id=&#34;example-code--opcodes&#34;&gt;Example code &amp;amp; Opcodes&lt;/h3&gt;
&lt;p&gt;간단한 테스트를 위해 다음과 같은 코드를 &lt;code&gt;-O3&lt;/code&gt; 옵션으로 컴파일했다.&lt;/p&gt;



  &lt;div class=&#34;collapsable-code&#34;&gt;
    &lt;input id=&#34;1&#34; type=&#34;checkbox&#34; checked /&gt;
    &lt;label for=&#34;1&#34;&gt;
      &lt;span class=&#34;collapsable-code__language&#34;&gt;c&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__title&#34;&gt;__builtin_expect(-,1).c&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__toggle&#34; data-label-expand=&#34;Show&#34; data-label-collapse=&#34;Hide&#34;&gt;&lt;/span&gt;
    &lt;/label&gt;
    &lt;pre class=&#34;language-c&#34; &gt;&lt;code&gt;
#include &amp;lt;stdio.h&amp;gt;

int main() {
  int c;
  scanf(&amp;#34;%d&amp;#34;, &amp;amp;c);
  if(__builtin_expect(c != 0, 1)) {
    puts(&amp;#34;c != 0&amp;#34;);
  } else {
    puts(&amp;#34;c == 0&amp;#34;);
  }
  return 0;
}
&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;


&lt;p&gt;컴파일했을 때의 결과는 다음과 같다.&lt;/p&gt;



  &lt;div class=&#34;collapsable-code&#34;&gt;
    &lt;input id=&#34;2&#34; type=&#34;checkbox&#34; checked /&gt;
    &lt;label for=&#34;2&#34;&gt;
      &lt;span class=&#34;collapsable-code__language&#34;&gt;assembly&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__title&#34;&gt;When __builtin_expect(~, 1).asm&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__toggle&#34; data-label-expand=&#34;Show&#34; data-label-collapse=&#34;Hide&#34;&gt;&lt;/span&gt;
    &lt;/label&gt;
    &lt;pre class=&#34;language-assembly&#34; &gt;&lt;code&gt;
.text:00000000000010A0 ; int __fastcall main(int argc, const char **argv, const char **envp)
.text:00000000000010A0                 public main
.text:00000000000010A0 main            proc near               ; DATA XREF: _start&amp;#43;18↓o
.text:00000000000010A0
.text:00000000000010A0 var_14          = dword ptr -14h
.text:00000000000010A0 var_10          = qword ptr -10h
.text:00000000000010A0
.text:00000000000010A0 ; __unwind {
.text:00000000000010A0                 endbr64
.text:00000000000010A4                 sub     rsp, 18h
.text:00000000000010A8                 lea     rdi, unk_2004
.text:00000000000010AF                 mov     rax, fs:28h
.text:00000000000010B8                 mov     [rsp&amp;#43;18h&amp;#43;var_10], rax
.text:00000000000010BD                 xor     eax, eax
.text:00000000000010BF                 lea     rsi, [rsp&amp;#43;18h&amp;#43;var_14]
.text:00000000000010C4                 call    ___isoc99_scanf
.text:00000000000010C9                 mov     eax, [rsp&amp;#43;18h&amp;#43;var_14]
.text:00000000000010CD                 test    eax, eax
.text:00000000000010CF                 jz      short loc_10F4
.text:00000000000010D1                 lea     rdi, s          ; &amp;#34;c != 0&amp;#34;
.text:00000000000010D8                 call    _puts
.text:00000000000010DD
.text:00000000000010DD loc_10DD:                               ; CODE XREF: main&amp;#43;60↓j
.text:00000000000010DD                 mov     rax, [rsp&amp;#43;18h&amp;#43;var_10]
.text:00000000000010E2                 sub     rax, fs:28h
.text:00000000000010EB                 jnz     short loc_1102
.text:00000000000010ED                 xor     eax, eax
.text:00000000000010EF                 add     rsp, 18h
.text:00000000000010F3                 retn
.text:00000000000010F4 ; ---------------------------------------------------------------------------
.text:00000000000010F4
.text:00000000000010F4 loc_10F4:                               ; CODE XREF: main&amp;#43;2F↑j
.text:00000000000010F4                 lea     rdi, aC0_0      ; &amp;#34;c == 0&amp;#34;
.text:00000000000010FB                 call    _puts
.text:0000000000001100                 jmp     short loc_10DD
.text:0000000000001102 ; ---------------------------------------------------------------------------
.text:0000000000001102
.text:0000000000001102 loc_1102:                               ; CODE XREF: main&amp;#43;4B↑j
.text:0000000000001102                 call    ___stack_chk_fail
.text:0000000000001102 ; } // starts at 10A0
.text:0000000000001102 main            endp
&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;


&lt;p&gt;그러면 다음 코드를 컴파일하면 어떻게 될까?&lt;/p&gt;



  &lt;div class=&#34;collapsable-code&#34;&gt;
    &lt;input id=&#34;3&#34; type=&#34;checkbox&#34; checked /&gt;
    &lt;label for=&#34;3&#34;&gt;
      &lt;span class=&#34;collapsable-code__language&#34;&gt;c&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__title&#34;&gt;__builtin_expect(-,0).c&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__toggle&#34; data-label-expand=&#34;Show&#34; data-label-collapse=&#34;Hide&#34;&gt;&lt;/span&gt;
    &lt;/label&gt;
    &lt;pre class=&#34;language-c&#34; &gt;&lt;code&gt;
#include &amp;lt;stdio.h&amp;gt;

int main() {
  int c;
  scanf(&amp;#34;%d&amp;#34;, &amp;amp;c);
  if(__builtin_expect(c != 0, 0)) {
    puts(&amp;#34;c != 0&amp;#34;);
  } else {
    puts(&amp;#34;c == 0&amp;#34;);
  }
  return 0;
}
&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;


&lt;p&gt;다음과 같은 결과가 나온다.&lt;/p&gt;



  &lt;div class=&#34;collapsable-code&#34;&gt;
    &lt;input id=&#34;4&#34; type=&#34;checkbox&#34; checked /&gt;
    &lt;label for=&#34;4&#34;&gt;
      &lt;span class=&#34;collapsable-code__language&#34;&gt;assembly&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__title&#34;&gt;__builtin_expect(-,0).asm&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__toggle&#34; data-label-expand=&#34;Show&#34; data-label-collapse=&#34;Hide&#34;&gt;&lt;/span&gt;
    &lt;/label&gt;
    &lt;pre class=&#34;language-assembly&#34; &gt;&lt;code&gt;
.text:00000000000010A0 ; int __fastcall main(int argc, const char **argv, const char **envp)
.text:00000000000010A0                 public main
.text:00000000000010A0 main            proc near               ; DATA XREF: _start&amp;#43;18↓o
.text:00000000000010A0
.text:00000000000010A0 var_14          = dword ptr -14h
.text:00000000000010A0 var_10          = qword ptr -10h
.text:00000000000010A0
.text:00000000000010A0 ; __unwind {
.text:00000000000010A0                 endbr64
.text:00000000000010A4                 sub     rsp, 18h
.text:00000000000010A8                 lea     rdi, unk_2004
.text:00000000000010AF                 mov     rax, fs:28h
.text:00000000000010B8                 mov     [rsp&amp;#43;18h&amp;#43;var_10], rax
.text:00000000000010BD                 xor     eax, eax
.text:00000000000010BF                 lea     rsi, [rsp&amp;#43;18h&amp;#43;var_14]
.text:00000000000010C4                 call    ___isoc99_scanf
.text:00000000000010C9                 mov     eax, [rsp&amp;#43;18h&amp;#43;var_14]
.text:00000000000010CD                 test    eax, eax
.text:00000000000010CF                 jnz     short loc_10F4
.text:00000000000010D1                 lea     rdi, s          ; &amp;#34;c == 0&amp;#34;
.text:00000000000010D8                 call    _puts
.text:00000000000010DD
.text:00000000000010DD loc_10DD:                               ; CODE XREF: main&amp;#43;60↓j
.text:00000000000010DD                 mov     rax, [rsp&amp;#43;18h&amp;#43;var_10]
.text:00000000000010E2                 sub     rax, fs:28h
.text:00000000000010EB                 jnz     short loc_1102
.text:00000000000010ED                 xor     eax, eax
.text:00000000000010EF                 add     rsp, 18h
.text:00000000000010F3                 retn
.text:00000000000010F4 ; ---------------------------------------------------------------------------
.text:00000000000010F4
.text:00000000000010F4 loc_10F4:                               ; CODE XREF: main&amp;#43;2F↑j
.text:00000000000010F4                 lea     rdi, aC0_0      ; &amp;#34;c != 0&amp;#34;
.text:00000000000010FB                 call    _puts
.text:0000000000001100                 jmp     short loc_10DD
.text:0000000000001102 ; ---------------------------------------------------------------------------
.text:0000000000001102
.text:0000000000001102 loc_1102:                               ; CODE XREF: main&amp;#43;4B↑j
.text:0000000000001102                 call    ___stack_chk_fail
.text:0000000000001102 ; } // starts at 10A0
.text:0000000000001102 main            endp
&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;


&lt;h3 id=&#34;analysis-the-result&#34;&gt;Analysis the result&lt;/h3&gt;
&lt;p&gt;결과를 보면, &lt;code&gt;__builtin_expect(c != 0, 1)&lt;/code&gt;를 사용했을 때는 &lt;code&gt;jz&lt;/code&gt;로 분기를 하지 않으면 &lt;code&gt;c != 0&lt;/code&gt;을 출력한다.
반면에 &lt;code&gt;__builtin_expect(c != 0, 0)&lt;/code&gt;를 사용했을 때는 &lt;code&gt;jz&lt;/code&gt;로 분기하지 않으면 &lt;code&gt;c == 0&lt;/code&gt;이 출력된다.&lt;/p&gt;
&lt;p&gt;즉, &lt;code&gt;__builtin_expect&lt;/code&gt;를 통해 컴파일러에게 분기에 대한 예측을 제공하면 내가 예상한 대로 static branch prediction을 고려해서 실행될 것으로 예측될 블록은 점프를 하지 않고 실행할 수 있게 만든다.&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;예측이 옳았다. &lt;code&gt;__builtin_expect&lt;/code&gt;는 Static Branch Prediction을 고려해서, 예상되는 분기의 코드를 실행하기 위해 필요한 branch를 없앤다.
또한 글을 보면, 비단 static prediction에서뿐만 아니라 dynamic prediction(Branch Target Buffer를 사용한다든가 하는 방법)에서도 성능 향상을 이룰 수 있다고 한다&lt;a href=&#34;https://justdoprogram.blogspot.com/2022/03/builtinexpect-likely-unlikey.html&#34;&gt;[1]&lt;/a&gt;.&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>갤럭시 북 2 프로에 Arch linux 깔기</title>
      <link>/posts/recording/install-archlinux-on-galaxy-book-2-pro/</link>
      <pubDate>Thu, 21 Nov 2024 00:00:00 +0000</pubDate>
      
      <guid>/posts/recording/install-archlinux-on-galaxy-book-2-pro/</guid>
      <description>&lt;hr&gt;
&lt;h2 id=&#34;개요&#34;&gt;개요&lt;/h2&gt;
&lt;p&gt;BoB 에서 받은 노트북 갤럭시 북 2 프로 (NT951XED) 에 리눅스, 그 중에서도 Arch Linux 를 깔아서 쓰는 법을 정리한 글이다. 이 글에서 다루는 내용은 다음과 같다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;archinstall 을 사용한 Arch Linux 설치 방법
&lt;ol&gt;
&lt;li&gt;Hyprdots 설치 및 HiDPI 설정 방법&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;삼성 노트북에서 Arch Linux 및 Windows 를 Secure Boot 로 부팅하는 법&lt;/li&gt;
&lt;li&gt;화면 밝기 조절하는 법&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;또한 Arch Linux 를 설치하는 환경은 다음과 같다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;갤럭시 북 2 프로&lt;/li&gt;
&lt;li&gt;2 개의 NVME SSD
&lt;ul&gt;
&lt;li&gt;하나의 SSD 는 윈도우 설치&lt;/li&gt;
&lt;li&gt;다른 SSD 는 리눅스 설치&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;arch-linux-설치&#34;&gt;Arch Linux 설치&lt;/h2&gt;
&lt;h3 id=&#34;설치-usb-만들기&#34;&gt;설치 USB 만들기&lt;/h3&gt;
&lt;p&gt;다음 주소에서 아치 리눅스 부팅 ISO 파일을 다운로드한다.&lt;/p&gt;</description>
      <content>&lt;hr&gt;
&lt;h2 id=&#34;개요&#34;&gt;개요&lt;/h2&gt;
&lt;p&gt;BoB 에서 받은 노트북 갤럭시 북 2 프로 (NT951XED) 에 리눅스, 그 중에서도 Arch Linux 를 깔아서 쓰는 법을 정리한 글이다. 이 글에서 다루는 내용은 다음과 같다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;archinstall 을 사용한 Arch Linux 설치 방법
&lt;ol&gt;
&lt;li&gt;Hyprdots 설치 및 HiDPI 설정 방법&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;삼성 노트북에서 Arch Linux 및 Windows 를 Secure Boot 로 부팅하는 법&lt;/li&gt;
&lt;li&gt;화면 밝기 조절하는 법&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;또한 Arch Linux 를 설치하는 환경은 다음과 같다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;갤럭시 북 2 프로&lt;/li&gt;
&lt;li&gt;2 개의 NVME SSD
&lt;ul&gt;
&lt;li&gt;하나의 SSD 는 윈도우 설치&lt;/li&gt;
&lt;li&gt;다른 SSD 는 리눅스 설치&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;arch-linux-설치&#34;&gt;Arch Linux 설치&lt;/h2&gt;
&lt;h3 id=&#34;설치-usb-만들기&#34;&gt;설치 USB 만들기&lt;/h3&gt;
&lt;p&gt;다음 주소에서 아치 리눅스 부팅 ISO 파일을 다운로드한다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://archlinux.org/download/#checksums&#34;&gt;https://archlinux.org/download/#checksums&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;(선택 사항) gpg 키를 통해 다운로드 받은 ISO 를 검증할 수 있다.&lt;/p&gt;
&lt;p&gt;rufus 를 통해 dd 모드로 부팅 USB 를 만든다.&lt;/p&gt;
&lt;h3 id=&#34;설치&#34;&gt;설치&lt;/h3&gt;
&lt;h3 id=&#34;bios-설정-및-usb-로-부팅&#34;&gt;BIOS 설정 및 USB 로 부팅&lt;/h3&gt;
&lt;p&gt;노트북을 켜면서 F2 를 누르면 삼성 BIOS 로 진입할 수 있다. 여기서 다음과 같은 것들을 설정한다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Security → Secure Boot Configuration
&lt;ol&gt;
&lt;li&gt;Secure Boot Mode 를 Custom 으로 설정한다.&lt;/li&gt;
&lt;li&gt;Factory Default Key Provisioning 을 Disabled 로 설정한다.&lt;/li&gt;
&lt;li&gt;Delete All Secure Boot Variables 를 한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Boot → Secure Boot Certificate keyset 을 Secure Boot Supported OS 로 설정한다.&lt;/li&gt;
&lt;li&gt;Boot → Secure Boot Control 를 끈다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;노트북에 USB 를 꽂고 Save 를 누르면 부팅을 시작한다. 이때 F10 을 누르면 어떤 것을 부팅할지 선택하는 창이 나온다. 여기서 아까 설정한 USB 를 선택한다.&lt;/p&gt;
&lt;h3 id=&#34;wi-fi-연결&#34;&gt;Wi-fi 연결&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;iwctl&lt;/code&gt; 명령어를 입력하고, &lt;code&gt;station wlan0 scan&lt;/code&gt; 과 &lt;code&gt;station wlan0 get-networks&lt;/code&gt; 를 입력한다. 적절한 wi-fi 를 &lt;code&gt;station wlan0 connect &amp;lt;SSID&amp;gt;&lt;/code&gt; 를 통해 wi-fi 에 연결하고 &lt;code&gt;exit&lt;/code&gt; 을 통해 iwctl 을 종료한다.&lt;/p&gt;
&lt;h3 id=&#34;archinstall-설정&#34;&gt;Archinstall 설정&lt;/h3&gt;
&lt;p&gt;인터넷이 연결된 상태에서 &lt;code&gt;archinstall&lt;/code&gt; 을 입력하면 archinstall 화면이 뜬다. 주의할 설정은 다음과 같다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;bootloader 는 GRUB 으로 설정한다.&lt;/li&gt;
&lt;li&gt;Root Password 를 설정하거나 User account 에서 user 를 만든 후 superuser 로 설정한다.&lt;/li&gt;
&lt;li&gt;Profile 은 minimal 로 설정한다.&lt;/li&gt;
&lt;li&gt;편의를 위해 Additional packages 에 git 과 sbctl 을 추가한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;나머지는 원하는 대로 설정을 한 뒤 Install 을 눌러 설치한다.&lt;/p&gt;
&lt;p&gt;(주의) 만약 Network Configureation 을 하지 않았다면 Arch Linux 로 부팅할 경우 인터넷을 사용할 수 없다. 바로 Hyprdots 를 설치할 경우 상관없으나 그렇지 않다면 나중에 부팅할 때, USB 로 부팅을 하여 chroot 를 해야한다.&lt;/p&gt;
&lt;h2 id=&#34;hyprdots-설치&#34;&gt;Hyprdots 설치&lt;/h2&gt;
&lt;p&gt;설치가 완료되면 chroot 로 설정을 할 것이냐고 물어보는데 Y 를 누른다. 그리고 &lt;code&gt;su &amp;lt;설정한 유저&amp;gt;&lt;/code&gt; 를 입력하고 &lt;code&gt;git clone --depth 1 &amp;lt;https://github.com/prasanthrangan/hyprdots&amp;gt; ~/Hyprdots &amp;amp; cd ~/Hyprdots/Scripts&lt;/code&gt; 및 &lt;code&gt;./install.sh&lt;/code&gt; 를 입력한다.&lt;/p&gt;
&lt;p&gt;설치 중간 중간에 각종 설정을 물어보는데 원하는 것을 설치한다.&lt;/p&gt;
&lt;h3 id=&#34;hidpi-설정&#34;&gt;HiDPI 설정&lt;/h3&gt;
&lt;p&gt;Hyprdots 의 설치가 완료되면 &lt;code&gt;~/.config/hyprland/hyprland.conf&lt;/code&gt; 에 다음 글을 추가한다.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# Source: &amp;lt;https://wiki.hyprland.org/Configuring/XWayland/&amp;gt;
xwayland {
  force_zero_scaling = true
}
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;secure-boot-설정&#34;&gt;Secure Boot 설정&lt;/h2&gt;
&lt;p&gt;Arch Linux 를 우선 wi-fi 를 설정하고, Window Key + T 를 눌러 터미널을 열고 다음 과정을 따른다.&lt;/p&gt;
&lt;p&gt;(주의) 앞으로 모든 명령은 sudo 없이 작성되어 있음.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;fdisk -l&lt;/code&gt; 로 Arch Linux 를 깐 드라이브의 EFI 파티션을 확인한다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mount /dev/nvme?n?p? /mnt/efi&lt;/code&gt; 를 입력한다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;grub-install --target=x86_64-efi --bootloader-id=GRUB --modules=&amp;quot;tpm&amp;quot; --disable-shim-lock&lt;/code&gt; 및 &lt;code&gt;grub-mkconfig -o /boot/grub/grub.cfg&lt;/code&gt; 를 입력한다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;reboot&lt;/code&gt; 후 &lt;code&gt;sbctl status&lt;/code&gt; 로 Secure Boot 상태를 확인한다.
&lt;ol&gt;
&lt;li&gt;Secure Boot 가 Disabled 인지 확인한다.&lt;/li&gt;
&lt;li&gt;Setup Mode 가 Enabled 인지 확인한다. 만약 아니라면, BIOS 설정 및 USB 로 부팅 항목의 Delete All Secure Boot Variables 를 수행한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sbctl create-keys&lt;/code&gt; 및 &lt;code&gt;sbctl enroll-keys -m&lt;/code&gt; 명령을 입력한다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sbctl verify&lt;/code&gt; 명령을 입력하고 나오는 unsigned files 에 다음 명령을 수행한다. &lt;code&gt;sbctl sign -s &amp;lt;파일 주소&amp;gt;&lt;/code&gt;
&lt;ol&gt;
&lt;li&gt;만약 파일이 immutable 하다는 에러가 발생하면 &lt;code&gt;chattr -i /sys/firmware/efi/efivars/&amp;lt;파일명&amp;gt;&lt;/code&gt; 명령을 입력한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;다시 &lt;code&gt;sbctl verify&lt;/code&gt; 명령을 입력한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;다시 BIOS 설정에 들어가서 Secure Boot Control 을 키면 된다.&lt;/p&gt;
&lt;h2 id=&#34;밝기-조절&#34;&gt;밝기 조절&lt;/h2&gt;
&lt;p&gt;밝기를 조절하기 위해서는 samsung-galaxybook-extras 를 이용해야 한다. &lt;code&gt;git clone &amp;lt;https://github.com/joshuagrisham/samsung-galaxybook-extras.git&amp;gt; &amp;amp; cd samsung-galaxybook-extras/driver&lt;/code&gt; 를 입력한다. 그리고 &lt;code&gt;sudo pacman -S linux-headers&lt;/code&gt; 를 입력하고 &lt;code&gt;make -C /lib/modules/\&lt;/code&gt;uname -r`/build M=$PWD&lt;code&gt;및&lt;/code&gt;sudo make -C /lib/modules/`uname -r`/build M=$PWD modules_install &amp;amp; sudo depmod&lt;code&gt;를 입력하고&lt;/code&gt;sudo modprobe samsung-galaxybook` 를 입력한다.&lt;/p&gt;
&lt;p&gt;그리고 &lt;code&gt;/etc/default/grub&lt;/code&gt; 에 있는 &lt;code&gt;GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;~&amp;quot;&lt;/code&gt; 을 G&lt;code&gt;RUB_CMDLINE_LINUX_DEFAULT=&amp;quot;~ i915.enable_dpcd_backlight=3&amp;quot;&lt;/code&gt; 로 바꾼다. 그리고 &lt;code&gt;grub-mkconfig -o /boot/grub/grub.cfg&lt;/code&gt; 를 입력하고 재부팅한다.&lt;/p&gt;
&lt;h1 id=&#34;가능한-기능&#34;&gt;가능한 기능&lt;/h1&gt;
&lt;p&gt;삼성 갤럭시 북 2 프로에서 Arch Linux 로 사용 가능한 것들은 다음과 같다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;화 면: 가능&lt;/li&gt;
&lt;li&gt;소 리: 일부 가능 (블루투스와 헤드폰만 가능하며 내장 스피커는 사용 불가)&lt;/li&gt;
&lt;li&gt;와이파이: 가능&lt;/li&gt;
&lt;li&gt;블루투스: 가능&lt;/li&gt;
&lt;li&gt;전원 관리: 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;참고-자료&#34;&gt;참고 자료&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://wiki.archlinux.org/title/installation_guide&#34;&gt;https://wiki.archlinux.org/title/installation_guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://wiki.archlinux.org/title/Laptop/Samsung&#34;&gt;https://wiki.archlinux.org/title/Laptop/Samsung&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.reddit.com/r/archlinux/comments/10pq74e/my_easy_method_for_setting_up_secure_boot_with/&#34;&gt;https://www.reddit.com/r/archlinux/comments/10pq74e/my_easy_method_for_setting_up_secure_boot_with/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/joshuagrisham/galaxy-book2-pro-linux&#34;&gt;https://github.com/joshuagrisham/galaxy-book2-pro-linux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://wiki.hyprland.org/Configuring/Monitors/&#34;&gt;https://wiki.hyprland.org/Configuring/Monitors/&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
</content>
    </item>
    
    <item>
      <title>Pwnable Ranking</title>
      <link>/posts/wargame/dreamhack/pwnable-ranking/</link>
      <pubDate>Thu, 27 Jun 2024 20:03:45 +0000</pubDate>
      
      <guid>/posts/wargame/dreamhack/pwnable-ranking/</guid>
      <description>&lt;p&gt;아싸 !&lt;/p&gt;
&lt;p&gt;이제 그만 해야징..&lt;/p&gt;

  &lt;figure class=&#34;center&#34; &gt;
    &lt;img src=&#34;/posts/wargame/dreamhack/pwnable-ranking/images/pwnable_top_10.png&#34;  alt=&#34;Dreamhack pwnable ranking&#34;   style=&#34;border-radius: 8px;&#34;  /&gt;
    
      &lt;figcaption class=&#34;center&#34;  style=&#34;color: white;&#34; &gt;Dreamhack pwnable ranking (2024.06.27)&lt;/figcaption&gt;
    
  &lt;/figure&gt;</description>
      <content>&lt;p&gt;아싸 !&lt;/p&gt;
&lt;p&gt;이제 그만 해야징..&lt;/p&gt;

  &lt;figure class=&#34;center&#34; &gt;
    &lt;img src=&#34;/posts/wargame/dreamhack/pwnable-ranking/images/pwnable_top_10.png&#34;  alt=&#34;Dreamhack pwnable ranking&#34;   style=&#34;border-radius: 8px;&#34;  /&gt;
    
      &lt;figcaption class=&#34;center&#34;  style=&#34;color: white;&#34; &gt;Dreamhack pwnable ranking (2024.06.27)&lt;/figcaption&gt;
    
  &lt;/figure&gt;


</content>
    </item>
    
  </channel>
</rss>
