전체 글 99

컴퓨터는 'a = 10'을 어떻게 이해할까?

우리는 코딩을 할 때 너무나도 당연하게 a = 10과 같은 코드를 작성합니다. 개발자에게 'a'는 10이라는 값을 담는 그릇처럼 직관적으로 이해됩니다. 하지만 컴퓨터에게 'a'라는 이름은 아무 의미가 없습니다. 컴퓨터는 오직 0과 1, 그리고 메모리 주소로 세상을 이해합니다.그렇다면 우리가 작성한 이 간단한 한 줄의 코드는 어떻게 컴퓨터가 이해하고 실행할 수 있는 기계어 코드로 변환될까요? 변수 'a'와 'b'를 더하는 간단한 과정을 통해, 그 깊고 흥미로운 내부 동작 원리를 단계별로 파헤쳐 봅시다.1단계: 개발자와의 약속, '변수 선언'a = 10b = 20프로그래밍에서 a = 10과 같은 변수 선언은 특정 데이터를 저장할 공간에 사람이 이해하기 쉬운 이름을 붙여주는 과정입니다. 'a'라는 이름은 컴퓨..

[리눅스 뻘짓 일기] 루트 파티션 변경 하기

LVM 파티션 재구성 및 GRUB 부트로더 복구 작업 기록이 문서는 1TB 서버의 100GB LVM 루트 파티션 용량 부족 문제를 해결하기 위해 시스템 파티션을 재구성하고, 변경된 환경에 맞게 GRUB 부트로더를 복구한 전체 과정을 기술합니다.1. 초기 문제 정의 및 해결 계획 수립초기 상황: 1TB 디스크를 장착한 서버가 100GB 크기의 LVM(논리 볼륨)으로 루트(/) 파티션이 설정되어, IntelliJ Gateway 및 LXC 컨테이너 사용으로 인해 용량 부족 현상이 발생했습니다.초기 목표: 호스트 OS와 LXC 컨테이너의 스토리지를 분리하기 위해, 기존 LVM 볼륨 그룹(VG)을 확장하고 논리 볼륨(LV)을 분리하는 것을 목표로 설정했습니다.기술적 한계: LVM 확장을 시도하는 과정에서, LVM..

인프라 2025.04.08

[문제 해결] 라즈베리파이 USB 가젯 설정: `echo`의 함정과 `printf`

라즈베리파이로 USB 가젯(Gadget), 특히 키보드나 마우스 같은 HID 장치를 만드는 프로젝트를 진행하다 보면 이런 막막한 상황에 부딪히곤 합니다. 분명히 모든 단계를 똑같이 따라 했는데도, 정작 PC에 연결하면 장치가 인식되지 않거나 "먹통"이 되는 문제입니다. 이 문제의 주범은 기본적인 명령어 하나일 가능성이 높습니다. 바로 echo -ne 입니다.문제의 코드: echo -ne로 Report Descriptor 작성하기USB HID 장치를 설정할 때, 가장 핵심적인 부분은 리포트 디스크립터(Report Descriptor)를 시스템 파일에 써주는 과정입니다. 이 디스크립터는 장치가 어떤 종류의 데이터를(예: 키보드 키 눌림, 마우스 좌표) 어떻게 보낼지 정의하는 일종의 '설명서'이며, 바이너리..

인프라 2024.12.11

[크래프톤 정글 Week 08 ] Pintos-project1-Priority Scheduling 키워드 정리

PintOS 프로젝트 가이드: 우선순위 스케줄링 정복하기 (기초부터 심화까지)지난 Alarm Clock 과제가 시간을 기준으로 스레드를 관리하는 법을 배웠다면, 이번 Priority Scheduling은 운영체제 스케줄링의 핵심인 우선순위(Priority)를 다루는 과제입니다. 우선순위가 높은 스레드가 CPU를 먼저 할당받도록 스케줄러를 수정하는 것이 목표입니다.1. 스케줄링을 위한 기본 지식본격적인 구현에 앞서, 운영체제의 기본 동작 원리를 이해해야 합니다.프로세스와 스레드 (Process and Thread)프로세스 (Process): 실행 중인 프로그램의 인스턴스로, 각자 독립된 메모리 공간을 가집니다. 안정적이지만, 이 때문에 프로세스 간 통신은 비용이 비쌉니다.스레드 (Thread): 프로세스 ..

[크래프톤 정글] Pintos-project1-AlaramClock 구현 하기

PintOS 프로젝트: 타이머 인터럽트로 알람 시계(Alarm Clock) 구현하기본 포스트는 PintOS Project 1의 기능 중 하나인 알람 시계(Alarm Clock) 구현에 대한 상세한 내용을 다룹니다. 이 기능은 운영체제의 핵심 개념인 인터럽트와 스레드 스케줄링을 깊이 있게 이해하는 데 큰 도움이 됩니다. 관련 용어에 대한 기본 지식이 있다고 가정하고, 기능 구현에 초점을 맞춰 딥다이브하는 내용이므로 다소 복잡하게 느껴질 수 있습니다.핵심 개념: 타이머 인터럽트와 ISR알람 시계를 구현하기 위해선 먼저 컴퓨터의 '시간' 개념을 관리하는 두 가지 핵심 요소를 이해해야 합니다.1. 타이머 인터럽트 (Timer Interrupt)타이머 인터럽트는 시스템 타이머 칩에 의해 일정 주기(Pintos에서..

[크래프톤 정글 week 08] Pintos-Project1 키워드 정리

Pintos-kaist-project1 Alaram Clock 키워드 정리이 포스트에서는 project1의 Alarm Clock을 구현하는 데 있어 필요한 키워드만 정리한다.ProcessCS 전반을 깊게 다루어 보면서 이전에도 마찬가지 였지만 항상 이 추상화 라는 개념이 항상 잘 이해가 되지 않았었는데 다른 여러 개념을 다루면서 어느정도 감을 잡을 상태였다.내가 생각했던 프로세스는 단순히 커널에서 이루어지는 작업을 분류 하고 운영체제가 작업의 관리 를 수월 하게 하기 위한 거라고만 생각하고 있었는데 도무지 이 프로세스가 운영체제 에서 어떻게 사용되는지 감이 잡히지 않고 있었다. 그러다 운영체제 책 을 읽던중 추상화 에 대한 내용을 읽었는데 자바에서도 추상화를 이용해 클래스의 구현 내용을 숨기는 것 처럼 ..

[크래프톤 정글] 메모리 관리 기법

1. 프로그램 실행사용자가 쉘에 ./hello를 입력하여 hello 프로그램을 실행한다.2. Fork 호출쉘 프로세스는 새로운 프로세스를 생성하기 위해 fork() 시스템 콜을 호출한다.이 호출로 인해 두 개의 프로세스가 존재하게 된다:부모 프로세스: 쉘.자식 프로세스: hello 프로그램을 실행하기 위해 생성된 프로세스.3. 메모리 공유부모와 자식 프로세스는 처음에 같은 가상 메모리 주소 공간을 공유한다.이때, 두 프로세스는 같은 물리 메모리를 참조하고 있어 메모리 사용이 효율적이다.4. 쓰기 발생부모 또는 자식 프로세스 중 하나가 가상 메모리에 쓰기를 시도할 경우 페이지 폴트가 발생하게 된다.이때, COW(Copy-On-Write) 메커니즘이 개입하여 두 프로세스 간의 물리 메모리 공유를 분리한다.5..

[크래프톤 정글] 동적 메모리 할당기 총정리

블로그 글: 동적 메모리 할당기 총정리: Implicit/Explicit List부터 단편화까지우리가 C언어에서 malloc과 free를 사용할 때, 그저 필요한 메모리를 요청하고 돌려주는 편리한 함수라고 생각하기 쉽습니다. 하지만 그 이면에서는 프로그램의 성능과 안정성을 좌우하는 복잡하고 정교한 동적 메모리 할당기(Dynamic Memory Allocator)가 쉴 새 없이 움직이고 있습니다.이번 포스트에서는 동적 메모리 할당기의 기본 개념부터 대표적인 구현 방식, 그리고 메모리 관리의 영원한 숙적인 단편화(Fragmentation) 문제와 해결책까지, 그 내부 동작 원리를 총정리해 보겠습니다.1. 동적 메모리 할당기의 기본 원리동적 메모리 할당기는 프로그램 실행 중에(runtime) 사용할 메모리 공..

[크래프톤 정글] 컴퓨터 시스템 hello.c 실행 전체 플로우 정리

우리가 프로그램을 실행하기까지의 전체 과정을 설명하면, 먼저 hello.c 파일을 작성한 후 빌드를 시키면 다음과 같은 과정들이 차례대로 진행된다.1. 전처리 과정헤더 파일 확장: #include로 포함된 헤더 파일들이 실제 코드로 확장된다.매크로 확장: #define으로 정의된 매크로가 코드에 삽입된다.주석 제거: 소스 코드 내 모든 주석이 제거된다.이 과정을 통해 전처리가 완료되며, 그 결과물은 .i 파일로 저장된다.2. 컴파일 과정구문 분석: 소스 코드의 문법을 검사하여 파싱한다.구문 트리 생성: 구문 트리를 생성하여 코드의 구조를 분석한다.중간 표현(IR): 구문 트리를 기반으로 중간 표현(Intermediate Representation)으로 변환된다.어셈블리 코드 생성: 중간 표현을 기반으로 ..

[크래프톤 정글]4주차 회고

회고를 몰아쓰는거 같이 느껴진다면 그건 기분탓이다.Clang4주차 부터 c 언어를 시작하게 되었다.이번 주차 부터 c언어의 기본 문법 부터 c언어를 가지고 앞에 주차 에서 했던 LinkedList,Statck,Queue 등을 직접 구현 해보는 주차였다.펌웨어 를 다루면서 c언어를 다루기는 했지만, 그걸 가지고 알고리즘을 구현 하려고 하니 쉬운 과정은 아니었다.특히 포인터와 구조체 에 대한 개념을 이해 하는데 오랜 시간이 걸렸던거 같다.다만 한가지 느낀건 확실히 하드웨어 에 가까운 언어인 만큼 직접 디버깅 을 해보면서 메모리에 할당되는 과정이나 , 개념으로 만 알고있던 호출 스택이 쌓이는 과정을 직접 확인 해보는 과정은 좀 흥미롭게 느껴졌다.최근에는 진행했던 프로젝트를 다시 보고 있는데 공부할때는 머리에 ..

크래프톤 정글 2024.10.15