전체 글
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초 이내, 수초 또는 수분이 될 수 있다. 하나의 연결을 위해 이를 수행하는 프로세스는 장시간을 대기(블로킹)할 수 있으며 그..
[Crypto] NEAT, NES
NEAT (National Encryption AlgoriThm) 알고리즘 분석 요약NEAT은 대한민국 국정원이 설계한 비공개 국가 표준 암호 알고리즘으로, 1997년에 국가기관용 표준 암호로 제정되었다. 이 알고리즘은 정부 기관에서 내부 데이터와 문서 암호화를 위해 사용되며, security through obscurity(암호화 원리를 숨김으로써 보안을 유지하는 방식)를 부분적으로 의존하고 있다. 128비트 블록 암호화 알고리즘으로, IDEA(International Data Encryption Algorithm)와 구조적으로 유사하다. 특징암호 구조Feistel 네트워크 기반: 암호화와 복호화 과정이 거의 동일12.5 라운드: 12번의 full-round 연산과 1번의 half-round 연산으로 ..