본문 바로가기

분류 전체보기1074

QEMU 기반 커스텀 PCIe 장치 에뮬레이션 - (4) DMA + MSI 이전 글에서 작성한 커스텀 PCIe 장치의 기본 구조와 기능은 유지한채로, 데이터 전송 방식과 인터럽트 방식을 변경하였다.데이터 전송 : 장치의 RAM을 BAR1 영역에 할당하던 방식에서 DMA(Direct Memory Access) 전송 방식으로 변경인터럽트 : 레거시 INTx 방식에서 MSI(Message Signaled Interrupt) 방식으로 변경 PCI DMA의 이해PCI DMA는 CPU의 개입 없이 하드웨어가 시스템 메모리에 직접 접근한다는 점에서 일반적인 생각하는 DMA와 동일하지만, DMA 엔진의 위치와 작동 방식에서 차이가 있다. 보통 임베디드 환경에서 말하는 DMA는 SoC/MCU 내부에 DMA 컨트롤러가 존재한다. 그래서 CPU가 초기 설정만 해두면 이후에는 DMA 컨트롤러.. 2026. 6. 14.
1553B (MIL-STD-1553) 개요MIL-STD-1553은 군용 항공기 내부의 전자 장비 간 통신을 위해 설계된 차동 직렬 데이터 버스 프로토콜이다.1970년대 항공기 내 다양한 서브시스템 간 통신 방식을 표준화하고, 체계 수준에서 데이터 흐름을 예측 가능하게 관리하기 위해 도입되었다.초기 버전인 MIL-STD-1553A가 발간된 이후, 개정된 MIL-STD-1553B가 현재까지 사용되는 표준으로 자리 잡았기 때문에, 통상적으로 짧게 1553B라고도 부른다. 이중화 (Redundancy)1553B는 단일 버스의 고장이 발생하더라도 통신의 연속성과 데이터의 무결성을 확보하기 위해 이중화 구조를 채택하고 있다.Primary Bus (Bus A)Backup Bus (Bus B)두 버스는 전기적으로 완전히 독립되어 있으며, 동일한 네트.. 2026. 6. 7.
TL16C752C, Dual UART (16550 호환 칩) 일단 이 칩은 16550 아키텍처를 기반으로 64-Byte FIFO를 탑재한 Dual UART 컨트롤러 칩이다. 16550이 무엇인가?1980년대 시절 PC의 Serial Port 구현을 위한 외장 UART 컨트롤러로 널리 쓰이던 칩이 National Semiconductor사에서 출시한 8250, 16450, 16550 시리즈였다. 8250, 16450 계열은 데이터 레지스터를 제외한 송수신 버퍼가 따로 없어서 인터럽트 부담이 컸고, 16550에서 16-Byte FIFO가 최초 도입되면서 실사용성이 크게 좋아졌다. 이후 여러 제조사에서 "16550 compatible"을 표방하는 호환 칩이 대량으로 나오며 레지스터 구조가 사실상 표준처럼 굳었다. 현재에도 16550 IP가 널리 쓰이고 있고, 리눅스 .. 2026. 5. 31.
Git ] fatal: detected dubious ownership in repository at '경로' 이 에러는 여러 사람이 함께 사용하는 컴퓨터 환경에서 발생할 수 있는 보안 문제를 막기 위해, Git에 새롭게 추가된 검사 로직 때문에 생긴 것이다.예를 들어, 해커가 공용 폴더나 상위 디렉토리에 몰래 .git 폴더를 만들고 config 파일에 악성 코드를 심어두면, 이후 해당 폴더나 하위 폴더에서 git status 같은 명령어만 실행해도 내 권한으로 악성 코드가 실행될 위험이 있다. 이를 막기 위해 Git은 현재 명령어를 실행하는 로그인한 사용자와 해당 디렉토리의 소유자(Owner) 가 다를 경우 의도적으로 이 에러를 발생시켜 실행을 차단한다. 해결 방법은 다음과 같다. 해결 방법 1. 특정 폴더만 예외 등록하기이 폴더는 신뢰할 수 있는 폴더이니 검사하지 말라고 예외 설정하는 방법이다. git c.. 2026. 5. 27.
UART 흐름제어 (RTS/CTS, DTR/DSR, XON/XOFF) UART 컨트롤러는 자체적으로 흐름 제어(Flow Control) 신호를 처리할 수 있는 기능을 포함하고 있다. 여기서 흐름제어란 데이터가 수신 측의 처리 속도보다 너무 빠르게 들어와서 버퍼 오버플로우가 발생하는 걸 막는 매커니즘을 말한다. 1. 과거의 UART 흐름제어과거 RS-232 통신 규격이 정립되던 시기에는 DTE 장치(PC)가 DCE 장치(모뎀)에 연결되는 것이 기본이었다. 데이터 송수신 자체는 DTE, DCE 모두 할 수 있지만 데이터 전송을 시작하고 종료하는 쪽은 DTE 였으며, 이러한 역할 구분에 따라 TXD, RXD를 포함한 각 신호 핀의 용도가 정의되었다. DTE (Data Terminal Equipment) : 단말기, 컴퓨터DCE (Data Circuit-terminating .. 2026. 5. 24.
인터넷 안되는 폐쇄망 PC에서 Local LLM으로 클로드 코드 무료로 쓰기 (Gemma4 + Ollama) 얼마 전 구글이 Gemma 4를 공개하면서 꽤 화제가 됐다. 그리고 유튜브에서 "Gemma 4를 활용해 로컬에서 무료로 AI 돌리는 법"에 대한 영상이 쏟아져 나왔는데 대부분은 인터넷이 되는 환경에서 손쉽게 설치한 뒤 퍼포먼스를 테스트하는 내용이었다. 나는 업무 특성상 인터넷이 차단된 환경에서 작업할 일이 많기 때문에, 폐쇄망 PC에서도 Local LLM으로 코딩 어시스턴트를 쓸 수 있다면 상당히 유용하겠다 싶었고, 직접 시도해본 뒤 그 과정을 정리한다. Gemma 4는 왜 화제가 됐나?첫 번째는 오픈소스 라이선스다. Gemma 4는 Apache 2.0 라이선스로 공개됐는데, 소스코드 공개 의무가 없고 상업적 사용이 자유로우며 2차 가공 후 라이선스 변경이나 특허 출원도 가능하다는 점 때문에 개발자들.. 2026. 5. 17.
클로드 코드 (Unable to connect to API) - USB 이더넷 어댑터 연결 시 통신 오류 Wi-Fi로 클로드 코드를 사용하던 중 PC에 특정 USB 이더넷 어댑터를 꽂는 순간 API 연결이 끊기는 일이 있었다. 당시 브라우저로 claude.ai에 접속하면 채팅기능은 멀쩡히 쓸 수 있는데 클로드 코드 사용 시에만 네트워크 오류가 발생하는 것이다. 원인을 확인해보니 라우팅 테이블 문제였다. 원인Windows에서 네트워크 어댑터가 여러 개 연결되면 각 어댑터에 default route(0.0.0.0/0)가 생길 수 있다. 이 경우 메트릭이 낮은 쪽이 우선으로 트래픽을 처리하는데, '자동메트릭'으로 설정되어 있으면 어댑터의 Link speed(대역폭)을 기준으로 메트릭이 설정되기 때문에 Wi-Fi보다 유선 연결이 더 낮은 메트릭 값을 할당받는 경우가 많다. 즉, USB 이더넷 어댑터 쪽의 메트릭이.. 2026. 5. 16.
리셋 신호가 Low Active인 이유 리셋 신호가 99% 이상 Low Active로 설계되는 이유는? 회로 안정성과 구현의 용이성, 그리고 역사적인 배경 때문이다. 구체적으로 다음과 같다. 1. 전원 인가 시의 안정성회로에 처음 전원이 공급될 때, 전압이 0V에서 목표 전압까지 올라가는 불안정한 구간에서는 신호가 자연스럽에 'Low' 상태에 머문다. 이 때 리셋 신호가 Low Active이면 칩은 전압이 완전히 안정될 때까지 안전하게 리셋 상태를 유지할 수 있다. 반면 칩이 High에서 리셋상태가 되고 Low에서 리셋이 해제된다면, 전원이 불안정한 초기 단계에서 리셋이 제대로 걸리지 않아 칩이 오작동할 위험이 있다. 2. 노이즈 내성디지털 회로에서 일반적으로 GND(0V)는 회로의 기준 전위로 사용되며, High 레벨보다 전기적으로 더 .. 2026. 5. 14.
PCA9555, I2C 16-bit I/O Expander PCA9555는 I2C 인터페이스를 지원하는 16채널 I/O Expander이다. 이전에 올린 TCA9538(PCA953x 계열)칩과 기본 구조와 제어 방식이 상당히 유사한데, 가장 큰 차이는 I/O 포트 수가 두 배인 16bit(2 x 8bit)로 확장된 것이다. 2025.03.03 - [임베디드 개발/임베디드 리눅스] - TCA9538 데이터시트 및 리눅스 드라이버 분석 (Tested on Raspberry Pi 4) 지난번에 올린 TCA9538 칩과의 차이와 해당 글에서 언급하지 않았던 주요 특징을 중심으로 정리해 본다. 1. 공급 전압공급 전압은 2.3V ~ 5.5V이다. 2. 3개의 하드웨어 주소 핀 제공 A0, A1, A2의 3개의 하드웨어 주소 핀이 있어 최대 8개의 디바이스를.. 2026. 5. 10.
LDD ] PCIe 디바이스 드라이버 작성하기 - Char with ioctl & mmap (2/2) 테스트파일 준비테스트용 이미지 파일은 GPT한테 컬러풀한 코딩하는 펭귄 이미지 그려달라고 해서 준비했다. RAW 파일 생성과 뷰어로는 ffmpeg를 사용한다. # ffmpeg 설치$ sudo apt update && sudo apt install ffmpeg# PNG to RGB24 RAW 변환$ ffmpeg -i -f rawvideo -pix_fmt rgb24 # PNG to BGR24 RAW 변환$ ffmpeg -i -f rawvideo -pix_fmt bgr24 RAW 변환 시 출력 로그로 파일 사이즈가 나오는데 이부분도 잘 기억해둔다. 나의 경우 1024x1536 이었다. QEMU 호스트와 게스트 간 파일 공유 설정이제 호스트에서 개발한 드라이버와 앱을 게스트로 옮겨야 하고, 테스트.. 2026. 5. 3.
LDD ] PCIe 디바이스 드라이버 작성하기 - Char with ioctl & mmap (1/2) 이전 글에서 작성한 가상의 커스텀 PCI 장치를 다룰 디바이스 드라이버를 작성해본다. 설계 요건은 이렇다.캐릭터 디바이스(Character Device) 드라이버 형태로 구현한다.여러 장치를 동시에 지원할 수 있어야한다.제어 명령은 ioctl로, 대용량 이미지 데이터는 mmap으로 주고받는다.장치의 처리 완료 신호는 PCI 레거시 INTx 방식 인터럽트로 받아서 유저 스페이스 통지하는 식으로 구성한다.개발 환경가상화 환경 : QEMU호스트 : x86_64 Ubuntu 22.04게스트 : ARMv7 32-bit BusyBox 기반 최소 Linux 실행 환경에뮬레이션 보드 : virt-11.0with 커스텀 가상 PCI 장치 (Virtual Image Processor) 우선 구현에 필요한 개념에 대해 하.. 2026. 4. 26.
QEMU 기반 커스텀 PCIe 장치 에뮬레이션 - (3) 커스텀 PCI 장치 설계QEMU에서 커스텀 디바이스를 에뮬레이션하려면 QOM(QEMU Object Model) 프레임워크에 맞춰 소스코드를 작성해야 한다. 처음부터 모든 구조를 직접 구현할 필요는 없고, qemu/hw/misc 안에 다양한 예제들이 있기 때문에 이를 참고해 수정해 나가면 된다.공부 목적이라면 교육용 예제 장치인 edu가 기본 제공되어 그대로 써도 되긴 하지만, 이 장치는 단순히 팩토리얼 연산 기능만 있고 레지스터 구조가 단순해서 드라이버를 작성하는 재미가 없을 것 같았다. 이러한 이유로 보다 그럴듯한 PCI(e) 리눅스 드라이버를 개발해보기 위해 커스텀 PCI 장치 설계부터 시작하기로 한다. 장치 이름은 Virtual Image Processor라는 뜻으로 pci-vip로 정했다. 동작 .. 2026. 4. 19.
QEMU 기반 커스텀 PCIe 장치 에뮬레이션 - (2) qemu 소스 설치 경로의 miscellaneous를 모아둔 hw/misc 경로로 이동하면 Custom PCI 장치를 만들 때 참고할만한 소스들이 있다. $ cd $ ls qemu/hw/misc/pci-testdev.c$ ls qemu/hw/misc/edu.c pci-testdev.c는 간단히 게스트 OS에서 PCI I/O 기능을 테스트해 볼 수 있는 간단한 장치고, edu.c는 DMA, IRQ의 기능까지 테스트해볼 수 있는 교육용 장치다. 일단 비교적 간단한 pci-tesdev 장치를 살펴보자 pci-testdev.c 소스 분석먼저 *_register_types 함수로 PCI 장치를 QEMU 타입 시스템에 등록하고, *_class_init 함수에서 해당 PCI 장치가 시스템에서 어떻게 인식될지를 설.. 2026. 4. 12.
한글에서 그림/표 번호가 이어지지 않고 새로 시작할 때의 해결법 한글 프로그램에서 그림/표 번호가 이어지지 않고 1로 다시 시작되는 이유는 대개 특정 지점에 번호를 새로 매기도록 하는 조판부호가 삽입되어 있기 때문임 보기 > 조판 부호 체크 본문에 주황색 글씨로 [새 * 번호]이라는 표시가 있는지 확인하고 삭제함 해당 방법으로 해소되지 않는 경우 그림/표 번호가 새로 시작하는 쪽이 이전 그림/표와 다른 구역에 있는 지 확인하고, 쪽 > 구역설정에서 개체 시작 번호가 '이어서'가 아닌 다른 옵션으로 선택되어 있으면 '이어서'로 바꿀 것 2026. 4. 7.
VxWorks 셸에서 부트 파라미터 확인 및 설정 방법 1. 부트로더 셸에서의 확인 및 변경기본 부트 프롬프트([VxWorks Boot]:) 상태에서 기본 명령어 사용해 확인/변경 하는 법은 다음과 같다.? : 부트로더에서 지원하는 전체 명령어 리스트를 확인p : 현재 저장되어 있는 부트 파라미터 정보를 화면에 출력c : 부트 파라미터를 단계별로 수정 2. VxWorks 셸에서 부트 파라미터 확인bootParamsShow는 VxWorks 셸에서 부트로더의 p 명령어와 동일하게 부트 파라미터를 출력해주는 함수로, 이때는 부트 정보 문자열이 저장된 주소인 sysBootLine을 인자로 넘겨줘야한다. -> bootParamsShow sysBootLine 3. VxWorks 셸에서 부트 파라미터 변경VxWorks 셸에서 bootChange 함수를 사용하면 부트.. 2026. 4. 6.
QEMU 기반 커스텀 PCIe 장치 에뮬레이션 - (1) x86 리눅스 호스트 PC AArch32(ARMv7) 타겟을 대상으로 QEMU 기반 가상 개발환경을 만들고 커스텀 PCI 장치를 에뮬레이션하는 방법에 대해 정리한다. 준비물ARM 머신 에뮬레이션을 위한 QEMU크로스 컴파일을 위한 툴체인리눅스 커널 소스루트 파일 시스템을 만들기 위한 busybox QEMU 설치2026.01.18 - [임베디드 개발/임베디드 리눅스] - Linux 호스트에서 QEMU 빌드 툴체인 다운로드https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads Downloads ->Arm GNU Toolchain Downloads ->최신 버전 -> aarch64 Linux hosted cross toolchain.. 2026. 4. 5.
Linux 호스트에서 QEMU 빌드 대부분 리눅스 배포판 저장소에는 이미 QEMU 바이너리 패키지를 제공하기 때문에 sudo apt install qemu-system-arm 등으로 간단히 설치할 수 있다. 단, 저장소 버전보다 최신 버전을 사용하고 싶거나 커스텀 하드웨어를 추가하는 등 소스 코드를 수정해야 하는 경우 직접 빌드 해야 한다. 이번 글에서는 QEMU 소스를 다운받고 직접 빌드하는 방법에 대해 정리한다. 참고:https://wiki.qemu.org/Hosts/Linux Required Package 설치sudo apt-get install git libglib2.0-dev libfdt-dev libpixman-1-dev zlib1g-dev ninja-build Recommended Package 설치sudo apt-.. 2026. 3. 29.
QEMU (Quick Emulator) QEMUQEMU는 Quick Emulator의 약자로, 오픈소스 머신 에뮬레이터이자 가상화 프로그램이다.잘 알려진 VMware나 VirtualBox 같은 가상화 도구와의 가장 큰 차이점은 머신 에뮬레이션 기능이다. VMware나 VirtualBox는 호스트 PC가 Intel x86 CPU라면 가상 머신 역시 동일한 Intel x86 아키텍처로 동작해야 한다. 반면, QEMU는 호스트 시스템과 다른 아키텍처(ARM, RISC-V 등) 머신을 가상으로 에뮬레이션하고, 그 위에서 해당 아키텍처용 운영체제를 실행할 수 있다는 장점이 있다. QEMU 가상화 방식공식 문서에서 소개하는 QEMU의 가상화 방식은 크게 두 가지로 나뉜다. 1. System Emulation (qemu-system-*)Syst.. 2026. 3. 22.
Eye Opening Monitor (EOM) Eye Opening Monitor(EOM)는 고속 직렬 통신 IC에 내장된(On-Chip) 신호 품질 모니터링 기능이다. EOM을 이해하려면 먼저 Eye Diagram에 대해 알고 있을 필요가 있다. Eye Diagram이란?아이 다이어그램(Eye Diagram)은 오실로스코프 등 계측기를 이용해 고속 디지털 신호를 기준 클록에 동기화하여 샘플링한 뒤 1 비트 구간(Unit Interval)의 파형들을 화면에 중첩해 표시한 것이다. 파형이 마치 사람의 눈 모양과 비슷해 보인다해서 붙여진 이름이다. 신호의 품질, 지터, 노이즈, 상승/하강 시간 등을 한눈에 파악하고 평가하기 위해서 사용한다. 눈의 개방도(Eye Opening)눈이 크게 열려 있을수록 신호의 품질이 좋고 비트 오류율(BER, Bit Er.. 2026. 3. 15.
ARM 아키텍처의 발전 ARM 아키텍처 버전의 발전과 주요 변화를 정리함 1. ARMv7 (2005)32비트 아키텍처 : 모든 범용 레지스터가 32비트이며, 32비트 데이터 처리와 주소 공간(최대 4GB)을 지원Thumb-2 명령어 지원 : 16비트 Thumb 명령어와 32비트 ARM 명령어를 혼합해 사용함으로써 코드 밀도를 높이고, 메모리 자원이 제한적인 초기 임베디드 기기에서의 효율성 크게 향상 시킴NEON (Advanced SIMD) 기술 도입: 64비트 또는 128비트 레지스터를 사용해 정수 및 단정밀도 부동 소수점(float) 연산을 병렬로 처리하는 기술로, MP3 인코딩, 비디오 가속, 2D/3D 그래픽 등 멀티미디어 처리 성능을 크게 개선함TrustZone : 하드웨어 차원에서 ‘일반 영역’과 ‘보안 영역’을 .. 2026. 3. 14.
MAC 주소 (UAA, LAA) MAC(Media Access Control) 주소의 정의MAC 주소는 네트워크 인터페이스 카드(NIC)에 부여된 하드웨어 고유 식별 번호이다. OSI 7계층 중 2계층(데이터 링크 계층)에서 작동하며, 같은 공유기나 스위치에 연결된 로컬 네트워크 범위 내에서 장치를 식별하는 용도로 쓰인다.6바이트(48비트) 길이로 구성되며, 통상적으로 16진수 12자리로 표기한다. MAC 주소의 구조OUI (Organization Unique Identifier) : MAC 주소 앞의 3바이트로, 해당 네트워크 장비를 제조한 제조업체(Vendor)를 식별한다. IEEE에서 관리하고 할당한다.Serial Number : 뒤의 3바이트는 제조사가 각 장비에 부여하는 일련번호로, 동일한 OUI 내에서 중복되지 않도록 할당.. 2026. 3. 12.
리눅스 디바이스 모델과 디바이스 드라이버의 종류 1. 서론 리눅스 디바이스 드라이버를 공부하다 보면 가장 먼저 접하게 되는 책이 Linux Device Drivers(https://lwn.net/Kernel/LDD3/)다.이 책에서는 디바이스 드라이버를 크게 char, block, network 세 가지로 분류한다. 이 분류는 지금도 유효한 개념이지만, 리눅스 BSP 개발을 처음 경험하면서 느낀 점은 이 세 가지 분류만으로는 현대 리눅스 드라이버의 구조를 설명하기 부족하다는 것이었다.특히 V4L2나 ALSA 같은 서브시스템 위에서 동작하는 복잡한 드라이버들을 보다 보면 “이 드라이버는 도대체 어디에 속하는거지?” 라는 질문을 하게 된다.이 글은 그런 고민에서 출발해, 리눅스에서 디바이스(하드웨어 장치)가 어떤 모델로 동작하고, 어떤 방식으로 드라이버랑.. 2026. 3. 8.
오실로스코프 AC / DC 커플링 모드 얼마 전 스코프로 신호를 측정하다가 파형이 이상하게 나와서 확인해보니 스코프가 AC 커플링 모드로 설정되어있던 일이 있었다. 생각난 김에 해당 설정에 대해 정리해보려고 한다. 오실로스코프의 입력 커플링 설정DC CouplingDC 커플링은 입력 신호를 그대로 측정하는 방식이다. 신호에 포함된 DC 성분과 AC 성분이 모두 화면에 표시된다.AC CouplingAC 커플링은 입력 신호에서 DC 성분을 제거하고 AC 성분만 통과시켜 보여주는 방식이다. 아래 그림은 스코프 입력단의 블록도다. AC 커플링 모드를 선택하면 입력 신호는 직렬로 배치된 커패시터를 통과하게 되는데, 이 커패시터가 스코프 내부의 입력 저항과 결합되서 고역통과 필터(HPF)처럼 동작한다. 이 때문에 DC 성분이 통과 못하는 것.. 2026. 3. 1.
C++ ] lvalue와 rvalue 그리고 std::move() 1. lvalue와 rvaluelvalue : 메모리 주소를 가지고 있어 위치를 식별할 수 있는 객체로, 이름이 있고 계속 쓸 수 있는 값rvalue : 잠깐 쓰이고 사라지는 임시 값int a = 10; 위 코드에서 a는 lvalue이고, 10은 rvalue이다. 대입문의 왼쪽에 오면 lvalue, 오른쪽에 오면 rvalue라고 봐도 대부분의 경우 틀리진 않지만 더 정확히는 이름을 통해 메모리 주소를 참조할 수 있으면 lvalue, 표현식이 끝나면 사라지는 일시적인 값은 rvalue다. ✓ lvalue와 rvalue의 구분이 중요한 이유는?언제 복사가 발생하는지언제 이동이 발생하는지어떤 API 설계가 불필요한 복사를 줄이는지명확히 알 수 있기 때문이다. 2. lvalue와 rvalue의 r.. 2026. 2. 22.
C++ ] Overlapped IO 모델의 시리얼 통신 클래스 이번에 Overlapped I/O 모델에 대해 정리도 할겸 C++ 시리얼 통신 클래스를 구현해 보았다. 지난 글에 올린 링버퍼 클래스를 활용한다. 먼저 Overlapped I/O 모델의 개념과 동작 방식, 그리고 왜 시리얼 통신에서 Overlapped I/O를 사용하는지 정리하고 시작하자. Overlapped I/OOverlapped I/O는 윈도우에서 제공하는 완전한 비동기(Asynchronous) I/O 모델이다. 고성능 네트워크 서버 구축에 사용되는 IOCP(I/O Completion Port) 역시 이 Overlapped I/O를 기반으로 동작한다. Overlapped I/O의 핵심은 I/O 요청을 커널에 맡긴 뒤 I/O 완료를 기다리지 않고 바로 반환된다는 점이다. 실제 I/O가 끝났을 때는.. 2026. 2. 15.
네트워크 I/O 모델 네트워크 I/O 모델 네트워크 시스템의 성능을 결정짓는 핵심 요소 중 하나가 I/O(Input/Output) 모델이다. 이번 글에서는 UNIX 시스템에서 전통적으로 나누는 5가지 I/O 모델에 대해 알아보고, 각 모델의 차이를 정리하고자 한다. 먼저 5가지 기본 I/O 모델은 다음과 같다. Blocking I/ONonblocking I/OI/O Multiplexing (select, poll)Signal Driven I/O (SIGIO)Asynchronous I/O (aio_) 보통 I/O 모델에 대해 논할 때는 출력보다는 입력 위주로 설명한다. 출력(Write)의 경우 커널의 송신 버퍼에 빈공간이 있으면 대부분 즉시 커널로 데이터를 복사하고 리턴되지만, 입력(Read)의 경우 데이터가 언제 도착할지는 .. 2026. 2. 10.
C++ ] 템플릿을 활용한 thread-safe 링버퍼 클래스 C++ 템플릿을 활용해 여러 데이터 타입으로 재사용이 가능하고 멀티 스레드환경에서도 안전하게 사용할 수 있는 링버퍼 클래스를 작성해보았다. 내부적으로 고정 크기의 std::vector 버퍼를 사용하며, 일반적인 vector가 앞의 요소를 제거하면 메모리 이동 비용이 발생하는 것과 달리 head, tail 포인터 순환 구조를 통해 메모리를 효율적으로 사용할 수 있다. 이미 STL에 존재하는 컨테이너인 std::deque(Not thread-safe)와 std::mutex를 함께 쓰는 방법도 있긴 하지만, 직접 구현하는 링버퍼 클래스에는 다음과 같은 장점이 존재한다. 1. 고정 크기 버퍼를 사용하므로 예측이 가능std::deque의 경우 capacity를 초과할 때마다 메모리를 재할당하거나 재배치하는 과정.. 2026. 2. 5.
Linux ] nc (netcat) 사용법 정리 nc (netcat)터미널의 입출력을 네트워크 소켓에 연결하여 명령줄에서 데이터를 송수신할 수 있도록 지원하는 네트워크 도구리눅스 환경에서 네트워크 애플리케이션을 개발할 때, 서버나 클라이언트 한 쪽이 없는 상태에서 해당 애플리케이션이 프로토콜에 따라 의도한대로 동작하는지 간단히 테스트하는 용도로 유용하게 쓸 수 있다. 이 외에도 Ncat, socat 등 유사한 도구들이 많은데, 전부 터미널 입출력을 기반으로 제어하는 특성상 텍스트 기반 프로토콜에 최적화되어 있고, 바이너리 프로토콜 검증용으로 쓰기엔 좀 까다롭다. 따라서 바이너리 프로토콜을 다루는 경우라면 아래 도구를 사용하는 걸 추천한다. 혹은 직접 프로그램을 짜는게 더 빠를 수도 있다. 송신용 : Packet Sender수신용 : Wireshark.. 2026. 1. 30.
Linux의 부팅 과정 정리 이 글에서는 임베디드 리눅스가 아닌 일반적인 x86 PC 리눅스 배포판을 기준으로 부팅 과정을 정리해보았다. 1. BIOS / UEFI : 하드웨어 점검먼저 시스템 전원을 켜면 BIOS(레거시) 또는 UEFI가 POST(Power-On Self-Test)을 수행하여 CPU, 메모리, 그래픽 카드 등 주요 부품이 정상인지 확인하고 사용할 준비를 마친다. 2. BIOS / UEFI : 부팅 가능한 디스크 탐색BIOS / UEFI 설정에 저장된 부팅 우선순위(Boot Priority Order)에 따라 어떤 저장장치(HDD, SSD, USB 등)에서 부팅할 것인가가 정한다. 3. BIOS / UEFI : 부트로더 실행BIOS의 경우 : MBR(Master Boot Record.. 2026. 1. 25.
Ubuntu ] 한글 2020 Beta 설치 방법 Ubuntu 22.04에서 정상동작 확인됨 다운로드curl -H "Host: cdn.hancom.com" -H "Referer: https://www.hancom.com/cs_center" -fLO https://cdn.hancom.com/pds/hnc/DOWN/gooroom/hoffice_hwp_2020_amd64.deb 설치sudo dpkg -i ./hoffice_hwp_2020_amd64.deb 설치 후 실행파일 위치 (참고)/opt/hnc/hoffice11/Bin/hwp 출처 : https://hamonikr.org/index.php?mid=Free_Board&m=0&page=1&document_srl=137118 2026. 1. 21.
반응형