System Programming

    sanitizer interceptor의 구현 원리

    c/c++ 개발자들은 버퍼 오버플로우, 댕글링 포인터 등의 메모리 오류, data race, dead lock 등의 멀티 스레드 오류를 자주 접하게 된다. 이런 버그들은 바로 크래시가 나지 않고 나중에 엉뚱한 곳에서 터지기 때문에 찾기가 매우 어려워 이런 문제를 빠르게 찾아내는 것은 항상 골칫거리였다. google이 opensource로 공개한 sanitizer 동적 분석 도구는 c/c++ 개발자들이 효율적으로 문제를 찾아내어 개발 효율성을 높이는 데 도움을 준다. Sanitizer란sanitizer는 google이 오픈소스로 공개한 동적 코드 분석 도구로 Clang 3.1과 GCC 4.8 부터 Clang과 GCC에 통합되었다. 프로그래머가 런타임에 프로그램의 메모리 오류와 멀티스레드 오류를 빠르고 정확..

    Bochs v2.2.1 소스 코드 분석 #2 Bochs 구조와 동작방식

    Bochs는 C++로 작성된 IA-32 아키텍쳐 PC 에뮬레이터이다. 쉽게 말해 소프트웨어로 PC 하드웨어 전체를 흉내내는 프로그램이다. Intel x86 CPU, 일반적인 IO 장치 및 BIOS를 에뮬레이션한다. 현재 Bochs는 386, 486, Pentium, Pentium Pro, AMD64 CPU를 에뮬레이트할 수 있으며 MMX, SSESSE, 3DNow! 명령어 세트를 포함한다.Bochs가 실행할 수 있는 운영체제에는LinuxDOSWindows가 포함된다. 다양한 모드의 컴파일을 사용할 수 있으며 일부는 아직 개발 중이다. 전형적인 응용은 완전한 x86 PC 에뮬레이터를 제공하는 것으로 x86 CPU, hw 장치 및 저장장치를 포함한다. http://bochs.sourceforge.net/ 에..

    LLVM Compiler Under the hood #1 컴파일 흐름 이해

    Compiler 구현 사고방식: 계산기계산기는 수식을 인식할 수 있으므로 이를 기능이 단순한 컴파일러로 볼 수 있다. 계산기 구현을 통해 컴파일러의 구현 사고 방식을 분석해볼 수 있다. 설계할 목표 계산기의 주요 기능 파라미터는 다음과 같다. 피연산자: 정수와 소수 지원연산자: 덧셈, 뺄셈, 곱셈, 나눗셈의 사칙연산 및 지수 연산 지원괄호: 소괄호 지원위의 계산기를 구현하려면 일반적으로 다음의 기본 단계를 거쳐야한다. 어휘 분석: 수식 내의 피연산자, 연산자 및 괄호를 스캔하여 토큰 스트림 생성구문 분석: 연산자의 우선순위, 결합 법칙 등의 규칙에 따라 토큰을 조직하여 구문 분석 트리 구축해석 실행: 구문 분석 트리에 따라 연산 결과 계산 어휘 분석: 피연산자와 연산자 식별수석 123+456 을 예로 ..

    Compiler 개발 #1 컴파일러 동작 원리

    컴파일러란컴파일러: 소스 언어 → 타겟 언어로 번역하는 프로그램┌──────────────┐ ┌──────────────┐ ┌──────────────┐│ Source Code │ ──▶ │ Compiler │ ──▶ │ Target Code ││ (C, Java) │ │ │ │ (기계어/어셈블리)│└──────────────┘ └──────────────┘ └──────────────┘ 인터프리터와의 차이구분컴파일러인터프리터동작전체 번역 후 실행한 줄씩 즉시 실행속도실행 빠름 ✅실행 느림디버깅에러 위치 파악 어려움에러 진단 쉬움 ✅예시C, C++, GoPython, Ruby 컴파일러 구조두 부분으로 나뉨Analysis (..

    linux vm stack 개발 노트 #1 kvm 내부 구조

    Referenceshttps://zserge.com/posts/kvm/https://www.kernel.org/doc/Documentation/virtual/kvm/api.txthttps://zserge.com/posts/containers/https://github.com/spotify/linux/blob/master/Documentation/kvm/api.txthttps://iovec.net/2024-01-29https://lwn.net/Articles/658511/https://david942j.blogspot.com/2018/10/note-learning-kvm-implement-your-own.html

    LLVM #1 IR 이해 하기

    llvm 은 컴파일러의 중간 단계에 위치한다. 언어 기능을 단순화한 후지만, 특정 머신 아키텍처(x86, ARM 등)를 타겟으로 하는 백엔드 이전 단계다.llvm의 ir은 꽤 저수준이다. 일부 언어에는 있지만 다른 언어에는 없는 언어 기능을 포함할 수 없다. (예: 클래스는 c++에는 있지만 c 에는 없다.) 명령어 집합을 접해본적이 있다면 llvm ir은 RISC 명령어 집합이다. 결과적으로 LLVM IR은 어셈블리를 좀더 읽기 쉽게 만든 형태로 보인다. LLVM IR은 머신 독립적이므로 레지스터 개수, 데이터 타입 크기, 호출 규약이나 기타 머신별 세부사항들을 걱정할 필요가 없다. 따라서 고정된 개수의 물리 레지스터 대신 LLVM IR 에서는 무제한의 가상 레지스터 세트(%0, %1, %2, %3...

    LLVM #0 LLVM 구조와 동작원리

    #include int factorial(int n) { if (n 1단계: Clang으로 LLVM IR 생성clang -O3 -emit-llvm hello.c -c -o hello.bc -O3: 최대 최적화 수준 (인라이닝, 루프 언롤링 등)-emit-llvm: C 코드를 기계어 대신 LLVM IR로 변환-c: 컴파일만 하고 링크는 안 함-o hello.bc: 출력 파일 (비트코드 형식)생성된 파일:hello.bc: LLVM 비트코드 (바이너리 형식)비트코드를 사람이 읽을 수 있는 형태로 보려면llvm-dis hello.bc -o hello.ll hello.ll 내용; ModuleID = 'hello.bc'source_filename = "hello.c"define dso_local i32 @..

    xv6 #1 booting in xv6

    커널 시작 과정 linker와 entry 설정kernel.ld 파일은 링커 스크립트로 커널 코드를 메모리에 어떻게 배치할지 알려준다. kernel.ld 에서는 대상 아키텍쳐 와 Entry point (코드 실행 시작 지점)을 지정한다.CPU가 실행하는 첫 번째 코드 블럭은 _entry 로 entry.S에 정의되어있다.이 _entry 섹션의 시작 주소는 0x80000000 다.주소 0x00000000 ~ 0x80000000 영역은 QEMU/RISC-V 구조 상 디바이스 IO 용 영역으로 사용되고 실제 커널 코드는 0x80000000 부터 시작된다. 커널 코드 블럭 종류다음과 같은 4가지 세그먼트가 커널에 포함된다.text: kernel coderodata: 읽기 전용 상수 데이터data: 읽기/쓰기 가능한..

    KVM 가상화 환경 구성

    KVM 가상화 환경 구성

    커널 기반 가상 머신(KVM)은 물리적 Linux 시스템에 설치하여 가상 머신을 생성할 수 있는 소프트웨어 기능이다. 가상 머신은 물리적 시스템과 CPU 사이클, 네트워크 대역폭 및 메모리와 같은 리소스를 공유한다. KVM은 Linux에서 가상 머신에 대한 네이티브 지원을 제공하는 Linux 운영 체제 구성 요소이다.  KVM 설치 사전 환경 구성Lab SetupManufacturer: eSlim KoreaOperating System: CentOS Linux 7 (Core)processor-version: Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHzKernel: Linux 3.10.0-1160.el7.x86_64 사전 환경 체크1. Processor 가상화 지원 활성화 확..