전체 글
GO runtime 해부 #0 Monkey Patching
Go 프로그램 부트스트랩go 프로그램 시작 과정은 다음과 같다._rt0 (Entry Point) ↓_main ↓runtime.rt0_go (스케줄러 및 첫 고루틴 설정) ↓runtime.main ├→ runtime.init ├→ main.init └→ main.main (우리가 작성한 코드) ↓exit(0) 핵심 개념은 다음과 같다. 우리가 작성하는 main.main()은 진짜 시작점이 아님Go 런타임이 먼저 초기화 작업 수행:스케줄러 설정메모리 할당자 초기화GC 설정고루틴 스택 준비 진입점이 main 위에서 시작한다는 점이 중요하다. 진짜 시작점은 _rt0 이다. main()은 런타임 초기화의 끝 에 해당한다.이게 왜 중요할까 panic과 defer의 내부 구조panic은 함수가 아니다g..
SIMD #0 SIMD의 기본 개념과 병렬 처리 원리
SIMD란 Single Instruction, Multiple Data의 약자하나의 명령어로 여러 데이터를 동시에 처리하는 병렬 처리 기법 기본 원리일반 스칼라 연산:a[0] + b[0] = c[0] // 1번 실행a[1] + b[1] = c[1] // 2번 실행a[2] + b[2] = c[2] // 3번 실행a[3] + b[3] = c[3] // 4번 실행SIMD 벡터 연산:[a0, a1, a2, a3] + [b0, b1, b2, b3] = [c0, c1, c2, c3] // 1번에 실행! CPU 아키텍처와 벡터 연산의 관계레지스터 크기와 처리 능력128비트 레지스터 (SSE): 4개의 32비트 float 동시 처리256비트 레지스터 (AVX/AVX2): 8개의 32비트 float 동시 처리..
LLVM tutorial #0 Architecture
전통적인 컴파일러는 소스 언어와 타겟 아키텍쳐가 강하게 결합되어있어 새로운 언어나 새로운 하드웨어를 지원하기 위해선 컴파일러 전체를 다시 작성해야했다.이 구조의 문제점은 당연히 N개의 언어와 M개의 타겟을 지원하려면 N × M개의 컴파일러가 필요하다는 것이다. LLVM 3단계 설계LLVM을 활용하면 N + M개만 필요하다.전통적 방식:C 컴파일러 → x86 코드C 컴파일러 → ARM 코드Rust 컴파일러 → x86 코드Rust 컴파일러 → ARM 코드(4개 필요)LLVM 방식:C → LLVM IR ┐Rust → LLVM IR ┼→ LLVM IR → x86 ┼→ LLVM IR → ARM(2개 프론트엔드 + 2개 백엔드 = 4개) 각 단계를 간단히 설명하자면 1단계 Frontend역할..
x86 Instruction Set, SIMD, Image Processing Algorithms, DSP Routines, MMX, SSE, AVX #0 Simple Assembly Program
1. Project 생성Visual Studio에서 파일 -> 새로 만들기 -> 프로젝트 -> Windows Console Application 선택하여 프로젝트를 생성한다. 2. Source Files 작성cpp 파일을 삭제 후 Windows MASM 32비트 어셈블리 코드 를 작성한다.// main.asm.386.model flat.codestart PROC mov eax,213 add eax,432 retstart endpend start 3. masm 빌드 설정- project 우클릭 -> Build Dependencies -> Build Customizations... -> masm 선택- assmebly 파일 우클릭 -> Properites(속성..
vmware와 hyper v 동시에 쓰기
VMware와 Hyper-V는 동시에 사용하기 어렵습니다. 둘 다 설치 할 경우 아래와 같은 에러를 볼 수 있습니다. VMware Workstation and Hyper-V are not compatible. Remove the Hyper-V role from the system before running VMware Workstation. VMware를 선택하실 분들은 명령프롬프트를관리자 권한으로 실행해서 아래 작업을 수행하십시오. bcdedit /set hypervisorlaunchtype off 재부팅 제어판\모든 제어판 항목\네트워크 연결에서네트워크 어댑터 중에서 vEthernet (기본 스위치) 를 사용 안함 상태로 바꿈 Hyper-V를 선택하실 분들은 명령프롬프트를관리자 권한으로 실행해..
CUDA #0 환경 구성
1. Labnvidia-smi Sun Sep 7 20:37:56 2025 +-----------------------------------------------------------------------------------------+| NVIDIA-SMI 560.94 Driver Version: 560.94 CUDA Version: 12.6 ||-----------------------------------------+------------------------+----------------------+| GPU Name Driver-Model | Bus-Id Disp.A | Volat..
Linux의 DMA에 대한 간략한 분석
DMA는 CPU 개입없이 주변 장치와 시스템 메모리 간의 양방향 데이터 전송을 가능하게 하는 하드웨어 메커니즘이다. DMA를 사용하면 시스템 CPU가 실제 I/O 데이터 전송 프로세스에서 벗어나 시스템 처리량을 크게 향상시킬 수 있다. DMA는 하드웨어 아키텍처, 특히 주변장치의 버스기술과 밀접한 관련이 있다. How to Use DMA(1) DMA 클록 및 EIP93 엔진 초기화mtk_eip93_probe() { // 1. DMA descriptor 링 초기화 eip93->tx_ring = dma_alloc_coherent(...); eip93->rx_ring = dma_alloc_coherent(...); // 2. DMA 작업 버퍼 초기화 ctx->src = dma..
[OS] I/O처리 방식: Non-Blocking
논 블로킹 모드로 프로그래밍을 한다는 것은 먼저 블로킹의 의미 부터 명확히 해야한다. 일반적으로 블로킹은 "운영체제(커널)에게 어떤 요청을 하고 결과를 운영체제가 알려줄 때까지 기다린다" 를 의미한다. 예를 들어 데이터베이스 서버에 요청하고 그 결과를 데이터베이스 서버가 알려줄 때까지 기다린다도 같은 얘기이다.블로킹: 프로그램이 운영체제(커널) 또는 외부 서비스(DB, 네트워크 등) 에 요청을 보내고, 해당 요청의 결과가 반환될 때까지 대기(멈춤) 하는 상태. connect() 를 호출하면 보통은 운영체제가 원격 서버와 연결하고 그 결과를 알려준다. 연결하는데 지연가능한 시간은 1초 이내, 수초 또는 수분이 될 수 있다. 하나의 연결을 위해 이를 수행하는 프로세스는 장시간을 대기(블로킹)할 수 있으며 그..
[C/interrupt] IRQs: Hardware, Software
장치들은 처리할 작업이 준비되었음을 컴퓨터 시스템의 다른 부분에 알리기 위해 여러가지 방법을 사용한다.하드웨어와 소프트웨어 간의 비동기 통신을 효율적으로 처리하기 위해 IRQ가 필요하다. IRQ는 하드웨어 장치에서 이벤트가 발생했을 때 CPU가 이를 처리하도록 알려주는 역할을 한다. IRQ 정보를 확인하기 위해 다음 명령어를 사용할 수 있다.$ cat /proc/interrupts또는$ mpstat -A handle_IPI는 ARM 아키텍처에서 다중 프로세서 간 인터럽트(IPI)를 처리하는 함수이다.void handle_IPI(int ipinr, struct pt_regs *regs){ switch (ipinr) { case IPI_TIMER: tick_receive..