리눅스 커널(Linux kernel)은 모놀리딕 유닉스 계열 컴퓨터 운영체제 커널이며 자유-오픈 소프트웨어이다. - Wikipedia (리눅스 커널) 필자는 예전부터 리눅스를 매우 좋아했다. 커널을 무료로 배포하여 누구나(솔직히 아무나 못하지만) 커널을 수정하고 공부
이전 글에서 어떻게 리눅스 커널을 빌드하는지 알아 보았다. 이번 글에서는 빌드한 리눅스 커널을 설치해서 부팅하는 법을 알아보겠다. 1. 커널 모듈 설치하기 가장 먼저 커널 모듈(*.ko)과 이미지 파일(arch/x86/boot/bzImage)을 설치해야 한다.
리눅스 커널 코딩 스타일 페이지를 번역했더니 메모장 기준으로 655줄, 5289단어가 나왔다. 상당히 긴 내용이므로 필자는 이를 3장에 걸쳐 출간할 예정이다. 0. 읽기 전 주의사항 읽기 전 독자들이 알아둬야 할 내용과 주의사항에 대해 밝히도록 하겠다. 1. 어
5. 작명 (Naming) C 는 스파르타 언어이기에 너는 작명 관습을 따라야 한다. Modula-2 와 Pascal 프로그래밍 언어와 달리, C 프로그래머는 ThisVariableIsATemporaryCounter 와 같은 뽑내는 이름을 사용하지 않는다. C 프로그래
소스 트리 전체에 걸친 모든 Kconfig\* 설정 파일에서, 들여쓰기는 다소 다르다. config 이 정의된 행 아래는 하나의 탭으로 들여써지는 반면, help 에선 추가적인 두 공백으로 들여써진다. 예시:정말로 위험한 특징 (예를 들어 특정 파일 시스템에 대한 지원
https://gcc.gnu.org/onlinedocs/gcc-9.3.0/gcc/Function-Attributes.html#Function-Attributes 1. GNU 함수 속성 (Function Attributes)
컴퓨터(영어: computer, 문화어: 콤퓨터, 콤퓨타, 순화어: 전산기)는 전자 회로를 이용하여 프로그램과 정보를 전자적 형태(electronic form)로 저장하고 빠르게 계산하고, 입력된 데이터를 정해진 프로그래밍에 따라 처리하고 정보로 출력하는 전자 기기(p
6장에서 언급했듯이 long 자료형의 크기는 다른 자료형에 비해 훨씬 더 가변적이다. (C 의 모든 정수 기본 자료형의 크기는 앞서 말했듯 가변적이지만 아키텍처가 정해지면 그 크기는 고정된다. 하지만 long 은 같은 아키텍처라도 32-bit CPU 인지, 64-bi
비트맵(Bitmap)이라 하면 흔히 이런 이미지를 생각할 수 있다. 물론 이것도 비트맵은 맞지만 이번 장에서 말하고자 하는 리눅스 커널의 비트맵은 이것과는 살짝 다르다. 물론 근본 개념은 bit + map 이라는점에서 같다. 아무튼 비트(bit)를 지도처럼 쭉 늘
지금까진 리눅스 커널의 코드를 긁어와서 그 내용을 테스트했다. 하지만 이런 식으론 복잡하게 연결되어 있는 헤더파일을 불러와서 컴파일하기도 어렵고, 실제 커널 내부에선 동작시킬 수 없다. 결국 커널 소스를 모두 다시 빌드하고 재부팅해서 결과를 확인하는 방법을 거쳐야 하
이번 장에서는 커널 라이브러리 함수인 sort 를 사용해서 데이터를 정렬해보겠다. 리눅스 커널 소스트리 lib/sort.c 에 가면 그 내용을 확인할 수 있다. 리눅스 커널에서 사용하는 정렬은 heap 정렬 이다. 주석의 설명처럼 힙 정렬은 퀵 정렬에 비해 평균 속
이번 글에서는 리눅스 커널 성능 측정 도구인 perf 를 사용해볼 예정이다. perf 는 리눅스 커널 소스의 tools/perf/ 경로에 있다. 글을 쓰는 현재(2021-05-23) 기준으론 apt 명령어로 5.12.2 의 perf 를 다운받을 수 없다. 그래서 우선
ftrace 는 커널 소스들의 실행을 추척하는 도구이다. ftrace 는 커널에서 제공하는 tracefs 파일 시스템을 활용하여 동작하기 때문에 커널 소스코드를 수정하지 않고도 디버깅할 수 있다는 장점이 있다. 해당 글에서는 ftrace 에 대한 간략한 소개와 사용법
crash 는 리눅스 커널 소스를 GNU gdb 와 연동하여 디버깅할 수 있는 도구다. gdb 는 다양한 기능을 제공하지만 커널 덤프 파일을 분석하기에는 불편하다. crash 는 이러한 덤프 파일을 분석하는데 도움이 되는 다양한 기능을 제공한다. crash 는 아
Kprobes 는 리눅스 커널의 디버깅과 성능 측정에 사용할 수 있는 좋은 인터페이스이다. Kprobes 는 커널 루틴에 동적으로 중단점을 삽입해 디버그와 성능 정보를 수집한다.
이번 장에서 설명할 내용은 debugobjects 이다. Documentation/core-api/debug-object.rst 에 자세하게 기술되어 있는데 이들의 내용을 간단하게 요약하여 설명토록 하겠다. 공식 문서에 따르면 debugobjects 를 아래와 같이
리눅스 커널 소스를 가장 간단하게 디버깅 하는 방법은 소스코드 중간에 printk() 함수를 삽입하여 그 값을 직접 출력하는 것이다. 하지만 이러한 방식은 printk() 함수를 추가하고 삭제하는 과정이 매우 번거롭다. 리눅스 커널은 이러한 문제를 해결하고자 prin
드라이버 모델과 이것 위에 설계되어진 kobject 추상성을 이해하는 어려움 중 하나는 명백한 시작 지점이 없다는 것이다. kobject 를 다루기 위해선 서로를 참조하는 몇 가지 자료형에 대한 이해를 필요로 한다. 이를 쉽게 만들기 위해 애매모호한 표현으로 시작하여
기본적으로 운영체제의 메모리와 사용자의 메모리 영역은 분리되어 있다. 주로 보안의 문제로 사용자는 커널 영역의 메모리에 접근할 수 없다. (사용자가 임의로 커널 메모리에 접근하여 커널의 데이터를 훼손하면 시스템에 치명적인 에러를 발생할 수 있다) 그러나 알다시피 우리
리눅스 커널에서 취급하는 대부분의 자료형은 연결 리스트(linked list) 로 연결되어 사용된다. 리눅스 커널의 연결 리스트는 그 구현이 매우 간단하다. 오직 양방향으로 연결된 prev 포인터와 next 포인터만으로 모든 것을 표현한다. 1. 연결 리스트 구조
이번 장에서는 리눅스 커널의 또 하나의 자료구조, 레드-블랙 트리(red-black tree) 에 대해서 살펴 보도록 하겠다. 레드-블랙 트리는 그 자체로 두-세개 이상의 글을 할애해야 할 정도로 그 내용이 많기에, 알고리즘을 직접적으로 설명하진 않고 커널에서 어떻게
XArray 는 매우 큰 포인터 배열처럼 동작하는 추상 데이터 타입이다. 이는 해쉬와 전통적인 가변 크기 배열들의 요구 사항을 만족한다. 해쉬와 달리, 이는 현명하게 캐쉬 효율성을 지키며 앞과 뒤의 요소로 이동하는 것을 허용한다. 가변 크기 배열과 달리, 배열을 키우
이번 장에서는 리눅스 커널의 radix tree 에 대해 살펴 볼 것이다. 리눅스의 radix tree 는 (포인터) 값에 연관되어질 수 있는 (long) 정수 키이다. 이는 저장의 측면에서 그리고 탐색에 있어서도 합리적인 효율성을 가진다. 추가적으로, 리눅스 커널에
해결해야 하는 흔한 문제 중 하나는, 일반적으로 무언가를 나타내는 작은 수인 식별자(`ID`) 를 할당하는 일이다. 이들은 파일 식별자(`file descriptor`), 프로세스 ID, 네트워크 프로토콜의 패킷 식별자, SCSI 태그들과 장치 객체 번호 등을 포함한
이번 장에서는 percpu 에 대해 알아볼 것이다. percpu 는 리눅스 커널 2.6 버전부터 추가된 기능으로 각 CPU 코어 별로 독립적인 메모리 공간을 제공한다. 싱글 코어 CPU 에서 멀티코어 CPU 로 발전하면서, SMP(Symmetric Multi-Pro