본문 바로가기

전체 글149

Process Address Space 이 글에서는 리눅스에서의 프로세스 주소 공간을 관리하는 자료구조를 알아볼 것이다. 이 글에서는 page table isolation / address space isolation은 고려하지 않는다. outdated된 내용이 조금 있을 수 있지만 우선은 프로세스 주소 공간에 대한 큰 그림을 그려보자. Address Space 주소 공간은 주소의 범위를 의미한다. 주소 공간의 크기는 32비트에서 4G, 64비트에서 16EB이다. 그리고 이 주소 공간을 어떻게 잘 나눠서 사용할지는 아키텍처에서 정한다. 예시) x86_64, aarch64 주소 공간은 크게 user (process) address space와 kernel address space로 나뉜다. kernel과 user의 address space를 어.. 2022. 11. 5.
[나는 리뷰어다] 전문가를 위한 C 이 글은 한빛미디어 활동을 위해서 책을 제공받아 작성된 서평입니다. 개요 나는 처음 프로그래밍을 배울 때 나중에 어떤 언어를 배우든 C언어가 가장 기초가 된다는 이야기를 많이 들었던 것 같다. 물론 새로운 언어는 계속 생겨나고있고 첫 번째 언어에 정답이 있다고 생각하지는 않는다. 다만 나는 C언어가 프로그래밍 언어의 발전의 중심에 있었으며, 다른 언어에 비해 하드웨어, 운영체제와 가까운 만큼 배울 점이 많은 언어라고 생각한다. 그리고 C언어는 만들어진지 이제 50년이 되었지만 아직도 많은 프로젝트에서 사용된다. "전문가를 위한 C"라는 제목처럼 이 책은 초심자를 위한 책은 아니다. 처음 C 언어를 배운다면 쉬우면서 사람들이 많이 읽은 책을 읽고, 그 다음 더 깊이있는 책을 읽어야 한다고 생각한다. 이 책.. 2022. 10. 30.
compound page 정리 struct page 메모 struct page에 대한 간단한 노트 참고로 64비트 리눅스는 LP64를 사용한다. 이 글에서 자료형의 크기는 LP64에 따라서 서술되었다. Introuction struct page는 페이지 프레임 하나 (보통 4096 바이트)에 대한 정 hyeyoo.com 앞선 글에서는 struct page가 어떻게 생겼는지 간단하게 살펴봤다. compound page에서는 이 자료구조가 어떻게 처리되는지 알아보자. What is compound page 일반적인 non-compound page (order == 0)와는 달리 compound page는 2^n개의 페이지 프레임을 하나의 페이지로 취급한 것이다. 아래 사진은 order-2 compound page를 그림으로 나타내 보았다.. 2022. 10. 5.
[나는 리뷰어다] 동시성 프로그래밍 이 글은 한빛미디어 활동을 위해서 책을 제공받아 작성된 서평입니다. 동시성 프로그래밍 Rust 언어를 중심으로 어셈블리어, C 언어를 사용해 CPU 아토믹 처리, 소프트웨어 트랜잭셔널 메모리, async/await 등 동시성 프로그래밍과 관련된 이론적 배경부터 구현까지 설계자 입장에서 살펴본 hanbit.co.kr 개요 2000년대에 들어서면서 그 유명한 무어의 법칙이 깨지고 프로세서의 clock rate 향상에 한계가 생기면서 multi-core/many-core 프로세서가 트렌드로 접어든지 오래이다. 프로세서가 하나라고 가정하고 짠 프로그램은 더 많아진 프로세서를 제대로 활용하지 못하기 때문에, 이제는 많은 개발자들이 병렬 프로그래밍에 대해서 잘 알아야한다. 이 책은 동시성 프로그래밍의 개념을 전체적.. 2022. 10. 2.
struct page 메모 struct page에 대한 간단한 노트 참고로 64비트 리눅스는 LP64를 사용한다. 이 글에서 자료형의 크기는 LP64에 따라서 서술되었다. Introuction struct page는 페이지 프레임 하나 (보통 4096 바이트)에 대한 정보를 나타내며 64비트 환경에서 일반적으로 64 바이트이다. struct page는 부팅 과정에서 동적으로 할당된다. 부팅이 끝나면 64/4096 = 1.56%의 메모리가 struct page에 사용된다. memory model & struct page page frame number conversion 물리 메모리는 페이지 프레임들의 집합이기 때문에 struct page는 배열의 형태로 관리하는데,어떤 물리 메모리 모델(FLATMEM, SPARSEMEM)를 [1].. 2022. 9. 14.
메모리 일관성 모델 (Memory Consistency Model) 이 글에서는 메모리 일관성 모델이 무엇이며, 컴퓨터 구조에서 store buffer와 invalidate queue가 어떤 역할을 하고, 메모리 접근 연산의 일관성을 어떻게 유지할 수 있는지 알아본다. 메모리 배리어도 자세하게 정리하려고 했으나 글 하나에 담기엔 너무 길어져서 따로 정리해야겠다. 용어 정리 글을 쓰다보니 용어 하나 하나의 의미를 구분하는 게 생각보다 중요했다. 용어를 헷갈리기 시작하면 내용 전체가 헷갈린다. 그러니 용어를 먼저 정리해보자. program order, execution order, perceived order [1]에서는 메모리 연산이 코드에 명시된 순서를 program order, 메모리를 참조 명령어들이 실행되는 순서를 execution order, 메모리 연산의 결과가.. 2022. 8. 4.
Virtual Memory: vmalloc(), vm_map_ram() 분석 vmalloc(), vfree()란 커널에는 메모리를 할당하는 다양한 방법이 있다. 페이지 할당자는 물리적으로 연속적인 페이지 프레임을 할당하며, 슬랩 할당자는 order-n 페이지 하나를 같은 크기로 쪼개서 슬랩 객체를 할당한다. 페이지 할당자와 슬랩 모두 물리적으로 연속적인 메모리를 할당한다. 다만 물리 주소로 접근하지는 않고, direct map 영역의 주소를 사용하여 접근한다. 하지만 항상 물리적으로 연속적인 메모리를 할당할 수는 없는데, 할당하려는 메모리의 크기가 클 수록, 메모리가 단편화될 수록 물리적으로 연속적인 메모리를 할당하기가 어려워진다. vmalloc()은 물리적으로 연속적인 메모리를 할당하는 대신, 물리적으로 흩어진 메모리들을 가상 주소 상으로 연속적이도록 페이지 테이블을 초기화한다.. 2022. 7. 13.
PIPT / VIVT / VIPT 캐시와 flush_dcache_folio() 오랜만에 글을 쓴다. 이번 글에서는 PIPT, VIPT, VIVT 캐시의 특성을 정리하고 페이지 캐시에서 언제 flush_dcache_folio()를 호출해야하는지 정리해본다. 캐시 복습 우선 캐시를 간단하게 복습해보자. (자세하게는 다루지 않는다!) 캐시는 너무 thrashing이 잦은 direct mapped 캐시나 현실적으로 너무 비싼 fully associative 캐시보다는 set associative 캐시가 주로 사용된다. 아주 엉성하게 그림을 그려봤는데... 위 그림은 같은 인덱스를 갖는 캐시 라인들을 set이라고 부르고, 4-way라서 하나의 set에 4개의 캐시 라인이 있다는 걸 표현하고자 했다. direct mapped 캐시와는 달리 N-way set associative 캐시는 인덱스.. 2022. 6. 25.
Direct Map Fragmentation 문제 Direct Map x86 Documentation에서 27.3. Memory Management을 보면 x86_64에서 4단계 or 5단계 페이징이냐에 따라서 가상 주소 공간이 각각 어떤 용도로 쓰이는지 명시되어있다. 이 가상 주소 공간 중 64TB (4-level paging) or 32PB (5-level paging)은 시스템 전체의 물리 메모리를 매핑하는 용도로 사용된다. 이 영역은 가상주소와 물리 주소가 직접 매핑된다. 다시 말해 물리 주소와 가상 주소가 PAGE_OFFSET 만큼만 차이난다. 실제로 물리 주소를 가상 주소로 바꿔주는 __va() 함수의 정의를 보면 #define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET)) 이렇게 물리 주소에서 P.. 2022. 5. 11.