<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko">
	<id>http://junhoahn.kr/noriwiki/index.php?action=history&amp;feed=atom&amp;title=Intel_Memory_Protection_Key</id>
	<title>Intel Memory Protection Key - 편집 역사</title>
	<link rel="self" type="application/atom+xml" href="http://junhoahn.kr/noriwiki/index.php?action=history&amp;feed=atom&amp;title=Intel_Memory_Protection_Key"/>
	<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=Intel_Memory_Protection_Key&amp;action=history"/>
	<updated>2026-05-22T00:08:53Z</updated>
	<subtitle>이 문서의 편집 역사</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=Intel_Memory_Protection_Key&amp;diff=23&amp;oldid=prev</id>
		<title>Ahn9807: Ahn9807님이 Intel Memory Portection Key 문서를 Intel Memory Protection Key 문서로 이동했습니다</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=Intel_Memory_Protection_Key&amp;diff=23&amp;oldid=prev"/>
		<updated>2023-02-03T06:29:02Z</updated>

		<summary type="html">&lt;p&gt;Ahn9807님이 &lt;a href=&quot;/noriwiki/index.php?title=Intel_Memory_Portection_Key&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Intel Memory Portection Key (없는 문서)&quot;&gt;Intel Memory Portection Key&lt;/a&gt; 문서를 &lt;a href=&quot;/noriwiki/index.php?title=Intel_Memory_Protection_Key&quot; title=&quot;Intel Memory Protection Key&quot;&gt;Intel Memory Protection Key&lt;/a&gt; 문서로 이동했습니다&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ko&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← 이전 판&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2023년 2월 3일 (금) 06:29 판&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;ko&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(차이 없음)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Ahn9807</name></author>
	</entry>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=Intel_Memory_Protection_Key&amp;diff=21&amp;oldid=prev</id>
		<title>Ahn9807: 새 문서: 분류: 하드웨어 기반 보안  == 개요 == Intel MPK는 intel에 의해서 skyylake이후부터 적용되기 시작한 Memory Protection 방식중에 하나로, protection key를 통해서 메모리를 보장하는 방식이다. (기존 방식인 segmentation, Paging에 추가함). MPK는 PTE에 기존에 사용하지 않은 비트 PK(32~35)의 4개의 비트를 사용해서 지금 메모리가 어디에 속해있는지 마킹한다. 이떄 이러한 마킹은...</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=Intel_Memory_Protection_Key&amp;diff=21&amp;oldid=prev"/>
		<updated>2023-02-03T06:28:25Z</updated>

		<summary type="html">&lt;p&gt;새 문서: &lt;a href=&quot;/noriwiki/index.php?title=%EB%B6%84%EB%A5%98:%ED%95%98%EB%93%9C%EC%9B%A8%EC%96%B4_%EA%B8%B0%EB%B0%98_%EB%B3%B4%EC%95%88&quot; title=&quot;분류:하드웨어 기반 보안&quot;&gt;분류: 하드웨어 기반 보안&lt;/a&gt;  == 개요 == Intel MPK는 intel에 의해서 skyylake이후부터 적용되기 시작한 Memory Protection 방식중에 하나로, protection key를 통해서 메모리를 보장하는 방식이다. (기존 방식인 &lt;a href=&quot;/noriwiki/index.php?title=Segmentation&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Segmentation (없는 문서)&quot;&gt;segmentation&lt;/a&gt;, &lt;a href=&quot;/noriwiki/index.php?title=Paging&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Paging (없는 문서)&quot;&gt;Paging&lt;/a&gt;에 추가함). MPK는 PTE에 기존에 사용하지 않은 비트 PK(32~35)의 4개의 비트를 사용해서 지금 메모리가 어디에 속해있는지 마킹한다. 이떄 이러한 마킹은...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;새 문서&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[분류: 하드웨어 기반 보안]]&lt;br /&gt;
&lt;br /&gt;
== 개요 ==&lt;br /&gt;
Intel MPK는 intel에 의해서 skyylake이후부터 적용되기 시작한 Memory Protection 방식중에 하나로, protection key를 통해서 메모리를 보장하는 방식이다. (기존 방식인 [[segmentation]], [[Paging]]에 추가함). MPK는 PTE에 기존에 사용하지 않은 비트 PK(32~35)의 4개의 비트를 사용해서 지금 메모리가 어디에 속해있는지 마킹한다. 이떄 이러한 마킹은 kernel mode로 이루어져야 한다. 이러한 변경은 pkey_mprotect란 시스템콜을 이용하여 이루어진다. &lt;br /&gt;
&lt;br /&gt;
MPK는 각각의 키들이 어떤 Protection group에 속해있는지 표기하기 위해서 PKRU레지스터를 사용한다. PKRU 레지스터는 u32로 표현되며 각각의 2비트가 해당하는 키에 대한 permission을 나타낸다. 각 비트는 (AD_access disable, WD_write disable)로 나타내지며, &lt;br /&gt;
* read/write: (0,0)&lt;br /&gt;
* read only: (0,1)&lt;br /&gt;
* no access: (1,x) (만약 mprotect가 execute 로 되어 있다면, 이 부분의 메모리 영역은 execution only 영역이 된다.)&lt;br /&gt;
로 permission을 구별한다. &lt;br /&gt;
&lt;br /&gt;
WRPKRU는 PKRU의 permission정보를 업데이트 하며, RDPKRU명령어는 현재 PKRU레지스터의 permission정보를 읽어 온다. 이를 위해서 EAX레지스터로 정보를 소통하며 특히 ECX, EDX레지스터를 0으로 초기화 하여 넘겨주어야 한다. RDPKRU/WRPKRU는 이 3개의 레지스터를 사용하여 PKRU에 접근하고 permission을 수정한다.  &lt;br /&gt;
&lt;br /&gt;
== MPK ==&lt;br /&gt;
Memory protectino key방식은 physical memory를 여러 특정한 크기의 청크로 나누고, 각각의 청크에 지정된 키를 제공함으로써 주어진 키에 대한 access permision을 변경하는 방식으로 메모리 접근을 조절할 수 있다. Intel MPK는 메모리 페이지 마다 protection key를 4개의 비트를 사용함으로써 즉 16개의 구분되는 키로 페이지들을 구분한다. 같은 키에 소속된 페이지들은 같은 page group에 소속된다고 볼 수 있으며 WRPKRU를 통해서 키에 대한 permission을 설정하고 WRPKRU를 통해서 키에 대한 permission을 읽어온다. &lt;br /&gt;
&lt;br /&gt;
== MPK in Linux ==&lt;br /&gt;
리눅스 시스템콜은 pkey_mprotect, pkey_alloc, pkey_free의 3가지 시스템콜을 통해서 MPK기능을 제공한다. (kernel version &amp;gt; 4.6 libc &amp;gt; 2.27 부터 제공함)&lt;br /&gt;
&lt;br /&gt;
=== 시스템 콜 ===&lt;br /&gt;
 int pkey_alloc(unsigned long flags, unsigned long ini_access_rights);&lt;br /&gt;
 pkey alloc은 주어진 flag와 access right에 대한 key를 발급받는다.&lt;br /&gt;
&lt;br /&gt;
 int pkey_free(int pkey);&lt;br /&gt;
 key를 등록 해제 한다.&lt;br /&gt;
&lt;br /&gt;
 int pkey_mprotect(unsigned long start, size_t len, unsigned long protection, int pkey);&lt;br /&gt;
 주어진 key에 대하여 memory protection을 설정한다. &lt;br /&gt;
&lt;br /&gt;
=== libc ===&lt;br /&gt;
 int pkey_set (int key, unsigned int rights)&lt;br /&gt;
 현재 스레드의 key에 대한 access right을 설정한다. (pkey_alloc으로 할당된 키를 사용해야 한다.)&lt;br /&gt;
&lt;br /&gt;
 int pkey_get (int key)&lt;br /&gt;
 현재 스레드의 key의 permission을 가져온다. &lt;br /&gt;
&lt;br /&gt;
== 성능 ==&lt;br /&gt;
* RDPKRU는 일반적인 register접근과 비슷한 성능&lt;br /&gt;
* WDPKRU는 pipeline flushing과 같은 serialization을 수행하기 때문에 out-of-order수행을 저지함. 즉 성능 하락이 있음.&lt;br /&gt;
* pkey_mprotect와 mprotect는 내부적으로 동일한 로직을 사용하기 때문에 성능이 비슷함.&lt;br /&gt;
* pkey_alloc과 pkey_free의 로직은 단순함. 즉 kernel context swtiching cost가 대부분의 성능하락의 원인임.&lt;br /&gt;
* mprotect와 다르게 pkey는 내부 커널 VMA (virtual memory area)구조체의 파편화에 영향을 받지 않음. 따라서 pages크기가 증가함에 따라 linear하게 성능이 하락하는 mprotect와는 다르게 constant한 성능하락을 보여줌.&lt;br /&gt;
&lt;br /&gt;
== 참고 ==&lt;br /&gt;
# https://charlycst.github.io/posts/mpk/&lt;br /&gt;
# https://www.gnu.org/software/libc/manual/html_node/Memory-Protection.html&lt;br /&gt;
# LibMPK: Software abstraction for intel memory protection keys (Intel MPK)&lt;/div&gt;</summary>
		<author><name>Ahn9807</name></author>
	</entry>
</feed>