System Programming

    Linux Device Driver 기초 #5 문자 드라이버

    문자 드라이버는 블록 드라이버나 네트워크 드라이버보다 이해하기 쉽고 간단한 편이다. scull(Simple Character Utility for Loading Localities)scull은 메모리 영역을 디바이스처럼 취급하는 문자 드라이버이다. scull은 커널에서 할당받은 메모리 상에서 동작하기 때문에 하드웨어에 의존적이지 않다는 장점이 있다. 누구나 scull을 컴파일하고 실행시킬 수 있으며 리눅스를 돌릴 수 있는 컴퓨터 아키텍쳐라면 어디나 이식도 가능하다. 하지만 커널과 드라이버 사이에 인터페이스를 보여주고 사용자가 테스트를 할 수 있다는 점을 제외한다면 디바이스 자체는 별다ㅏ른 쓸모가 없다. 드라이버 작성에서 첫단계는 디바이스가 사용자 프로그램에게 제공할 기능을 정의하는 일이다.여기서 작성할 ..

    Linux Device Driver 기초 #4 system daemon과 라이브러리 개발

    IPC프로세스간 통신은 서로 다른 프로세스가 데이터를 교환할 수 있도록 하는 통신 메커니즘이다.  pipe부모 프로세스와 자식 프로세스 사이에서 간단하게 데이터를 주고 받기 위해 사용되는 단방향 통신 방법이다. 한쪽 프로세스가 쓰고 다른 쪽 프로세스가 읽는 방식으로 작동하며 기본적으로 데이터를 한방향으로만 전달한다. socket네트워크 통신을 위한 양방향 통신 방법으로 동일한 시스템 뿐만 아니라 네트워크를 통해 다른 시스템과도 통신할 수 있다. TCP/IP 와 같은 프로토콜을 사용하며 클라이언트와 서버간의 통신을 설정하고 데이터를 주고 받을 수 있다.  named pipenaemd pipe는 이름이 붙어있어 부모-자식 관계가 아닌 프로세스 간에도 사용할 수 있는 통신 방식이다. named pipe는 다음..

    Linux Device Driver 기초 #3 Linux Device Driver 추가하기

    Linux Device Driver 기초 #3 Linux Device Driver 추가하기

    Kernel Module 만들기리눅스 커널 모듈은 커널 코드를 보다 쉽게 로드할 수 있게 함으로써 리눅스 커널 개발에 유용한 인터페이스를 제공하고,동적 로드와 특정한 기능만 선택적으로 로드할 수 있어 리눅스 커널이 차지하는 메모리의 양을 줄일 수 있는 효과가 있다.동적 로드:리눅스 커널 모듈은 시스템이 부팅될 때 커널 이미지에 포함되지 않고 필요 시점에만 메모리에 로드된다.예를 들어 특정 하드웨어 장치가 연결될 때만 해당 장치를 지원하는 모듈을 메모리에 로드하고 사용이 끝나면 unload하여 메모리에 제거할 수 있다.선택적 기능:모든 커널 기능을 한꺼번에 커널 이미지에 포함시키는 대신 커널 모듈을 통해 특정 기능만 선택적으로 사용할 수 있어 부팅 시간과 메모리를 절약할 수 있다.예를 들어 특정 네트워크 ..

    BPF 를 통한 Linux Performance 분석 #1 BPF Program 구성요소

    BPF 를 통한 Linux Performance 분석 #1 BPF Program 구성요소

    BPF란?BPF는 리눅스의 subsystem으로 리눅스 커널 코드를 실행할 수 있는 샌드박스 엔진이다.어떤 면에서는 jvm이나 chrome의 v8엔진과도 비슷하다. BPF를 실행하는 과정은 간단하게 3단계로 이루어진다.Load: BPF 프로그램을 커널에 로드, Verifier를 통해 검증Attach: BPF 프로그램을 특정 이벤트에 연결(BPF는 이벤트 드리븐 방식임)Callback: 이벤트가 발생할 때 BPF 프로그램이 실행됨BPF ProgramBPF를 사용하기 위해 필요한 dependency 는 다음과 같다.# 리눅스 소스코드$ uname -aLinux toor-virtual-machine 6.8.0-45-generic #45~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Se..

    GCC Compiler Manual

    GCC Compiler Manual

    컴파일 과정소스코드는 다음과 같은 과정으로 컴파일되어 실행파일이 된다.전처리기(preprocessor): 소스코드의 주석제거, define을 치환하는 기능컴파일러(compiler): 어셈블리 파일로 변환(어셈블리어는 CPU 명령어 조합으로 CPU에 의존적)어셈블러(assembler): object 코드 파일로 변환. object 파일은 0과 1로 이루어진 바이너리 코드(아직 주소 정보가 확정되지 않음)링커(linker): object 파일을 묶어 실행 코드 파일로 변환. 운영체제가 로딩할 수 있도록 주소 정보를 할당한 파일을 만들어 낸다.(링커는 운영체제에 의존적)GCC 명령어명령창에서 gcc 매뉴얼을 확인해보자.GCC(1) GNU ..

    Linux Inside #1 BIOS

    Linux Inside #1 BIOS

    커널이 메모리로 이동하여 첫 번째 사용자 프로세스가 시작될 때까지 커널이 수행하는 작업을 알아보자.로우레벨이 내부적으로 어떻게 동작하는지 프로그램이 컴퓨터에서 어떻게 실행되는지 어떻게 그것들이 메모리에 적재되는지 커널이 프로세스와 메모리 관리를 어떻게 하는지, 네트워크 스택이 로우레벨에서 어떻게 동작하는지 등... 부팅 프로세스를 간단히 살펴보면 다음과 같다.장비의 BIOS 또는 부팅 펌웨어가 로드되어 부트 로더를 실행.부트로더는 디스크에서 커널 이미지를 찾아 메모리에 로드하고 시작.커널은 장치와 드라이버를 초기화.커널은 루트 파일 시스템을 마운트.커널은 프로세스 ID 1로 init 이라는 프로그램을 시작. 이 지점은 사용자 공간 시작.init은 나머지 시스템 프로세스를 동작시킴.어떤 시점에서 init는..

    BuildRoot 사용법 요약

    BuildRoot 사용법 요약

    Buildroot는 uClibc 개발자들이 uClibc를 테스트하기 위해 작은 임베디드 리눅스 시스템을 빌드할 수 있도록 만든 도구 cross compile을 사용하여 임베디드 시스템을 위한 리눅스 시스템을 빌드하는 과정을 단순화하고 자동화하는 도구이다. Buildroot는 cross compile toolchain, root file system, linux kernel image, bootloader를 생성할 수 있다. 또한 옵션을 통해 독립적으로 사용가능하여 이미 존재하는 툴체인을 사용하고 buildroot를 통해 root file system만 빌드할 수 있다.  buildroot 는 특히 임베디드 분야에서 유용하다. 임베디드 시스템은 일반적인 x86 processor가 아닌 PowerPC, MI..

    linux에서 process 간 통신 #1 program and process

    linux에서 process 간 통신 #1 program and process

    운영체제의 근본 개념 중 하나는 프로세스이다. 프로세스는 운영체제에 의해 스케쥴링 되고 제어되는 동적 entity이다.추상적으로 프로세스는 실행 중인 프로그램, 현재 값, 상태 정보, 운영체제가 프로세스를 관리하는 데 사용하는 리소스로 구성된다.Linux와 같은 Unix 기반 운영체제에서 특정 시점에 여러 프로세스가 동시에 실행되고 각 프로세스는 독립된 환경에서 모든 시스템 리소스에 접근하고 제어할 수 있는 것으로 보이지만, 실제로 어느 한순간에 단일 프로세스만이 실행되고 있다.현재 실행 중인 프로세스를 빠르게 전환(context switching)함으로써 운영체제는 동시 프로세스 실행이 이루어지는 것처럼 보이게 한다. 멀티 프로그래밍(멀티 태스킹) : os가 여러 실행단계에 있는 프로세스들 간에 자원을..

    Linux Device Driver 기초 #2 System Call 추가하기

    Linux Device Driver 기초 #2 System Call 추가하기

    운영체제의 구성: user mode와 kernel mode운영체제는 하드웨어 자원을 효율적으로 관리하고 자원에 대한 인터페이스를 제공한다. 그렇기 때문에 운영체제는 하드웨어와 어플리케이션 사이에서 동작한다. 다음은 운영체제의 기본적인 구성이다.커널은 하드웨어 자원 직접 관리하고 어플리케이션은 시스템 콜을 통해 커널에 자원을 요청한다.어플리케이션은 보통 user mode에서 동작하며 시스템 자원에 접근할 수 있는 권한이 제한되어있다. 시스템 자원에 접근할 때 어플리케이션은 시스템 콜을 통해 kernel mode로 전환된다. kernel mode에서 운영체제는 요청된 자원을 처리하고 다시 user mode로 돌아 간다.  운영체제에서 커널 모드와 사용자 모드는 시스템의 안전성을 보장하고 자원을 효율적으로 관..