Linux Kernel Tree内で自作Kernelモジュールをビルドする方法(MakefileとKconfigの書き方)

Linux Kernel Tree内で自作Kernelモジュールをビルドする方法(MakefileとKconfigの書き方)

前書き 過去の記事(環境構築: Linux Kernelモジュールの作成準備)では、 Linux Kernelソースコード 自作Kernelモジュール を分離して管理していました。ディレクトリ構成は、以下のような状態です。 ...

July 15, 2019 · 7 min
Linux Kernel: mutex APIによるロック(排他)方法

Linux Kernel: mutex APIによるロック(排他)方法

前書き:mutexとは Linux Kernelに限らず、様々なプログラミング言語やライブラリはロック機構を提供しています。ロック機構は、複数のプロセスが同時に共有データを書き換え、意図しないデータ状態となる事を防ぎます。代表的なロック機構には、 ...

July 7, 2019 · 8 min
Linux Kernelの簡単なCharacter Deviceを作成する方法(Linked List APIの使用方法サンプル)

Linux Kernelの簡単なCharacter Deviceを作成する方法(Linked List APIの使用方法サンプル)

前書き 本記事では、Linux KernelにおけるCharacter Device向けのDevice Driverを作成する方法を示します。専用のHardware(例:シリアルデバイスのUARTなど)を用いず、メモリ上のデータ読み書きのみを行います。そのため、擬似デバイス(/dev/nullや/dev/zeroなど)を操作するDriverと同等です。 ...

June 23, 2019 · 13 min
Linux Kernel: __initマクロ、__exitマクロの役割(メモリの有効利用)

Linux Kernel: __initマクロ、__exitマクロの役割(メモリの有効利用)

__initマクロ、__exitマクロが使われるケース 一般的に、__initマクロはKernelモジュールの初期化時、__exitマクロはKernelモジュールの終了時に付与します。以下の例では、初期化関数がdebimate_init()、終了関数がdebimate_exit()で、それぞれにマクロを付与しています。 ...

April 29, 2019 · 4 min
Linux Kernel: List構造を操作するためのAPI(Listの使い方)

Linux Kernel: List構造を操作するためのAPI(Listの使い方)

前書き C言語は、言語としてList構造およびList操作APIをサポートしていません。ここでのList構造とは、「次のデータ(前のデータ)へのポインタ」を意味します。本記事では、データとList構造(nextポインタ、prevポインタ)をセットにした状態をノードと呼びます。 ...

April 7, 2019 · 13 min
Linux Kernel: 構造体メンバポインタから構造体の先頭ポインタを得るcontainer_ofマクロ

Linux Kernel: 構造体メンバポインタから構造体の先頭ポインタを得るcontainer_ofマクロ

container_ofマクロとは container_ofマクロは、Linux Kernelで用いられ、「構造体メンバポインタ」から「そのメンバを含む構造体の先頭ポインタ」を得られるマクロです。C言語では、offsetofマクロによって構造体メンバアドレスのオフセット(構造体先頭アドレスからメンバ変数までのオフセット)を算出できます。container_ofマクロは、このオフセットを利用し、構造体の先頭アドレスを算出しています。 ...

April 6, 2019 · 5 min
Linux Kernel: NULLポインタエラーハンドリング(ERR_PTR, IS_ERR, PTR_ERR)

Linux Kernel: NULLポインタエラーハンドリング(ERR_PTR, IS_ERR, PTR_ERR)

“返り値がNULL” = “情報量がない” C言語には、返り値としてポインタを返す関数があります。 User空間の関数で例を挙げれば、メモリを確保するmalloc()、ファイルを開くfopen()などです。これらの関数は、エラー時にNULLを返します。 ...

March 2, 2019 · 6 min
Linux Kernel: エラー番号の一覧

Linux Kernel: エラー番号の一覧

前書き 本記事では、Linux Kernelが用いるエラー番号を説明します。 Linux Kernelがエラー番号(errno)を正しく返す意義 Linux Kernelでは、エラーの種類に応じて、返すべきエラー番号が定められています。例えば、ファイルが存在しない場合は、“ENOENT(No such file or directory、 エラー番号2)“を返します。Linux Kernel内のエラー内容は、変数errnoを通してUser空間にも伝わります。 ...

February 24, 2019 · 10 min
Linux Kernel: prink(print kernel)によるメッセージ出力

Linux Kernel: prink(print kernel)によるメッセージ出力

printk()とは printk(print kernel)は、ユーザ空間のprintf( print formatted )に相当します。注意すべき点として、printf()と以下の点が異なります。本記事では、この差異を説明します。 ...

February 2, 2019 · 6 min
環境構築: Linux Kernelモジュールの作成準備

環境構築: Linux Kernelモジュールの作成準備

前書き 本記事は、「Linux Kernel Device Driverの雛形作成」や「Linux Kernel内APIを試すためのモジュール作成」を目的として、最低限必要な環境構築手順を記載しています。 ...

January 27, 2019 · 10 min
Raspberry Pi3(Linux Kernel)のBoot Sequence Step1:アーキテクチャ依存部

Raspberry Pi3(Linux Kernel)のBoot Sequence Step1:アーキテクチャ依存部

前書き シングルボードコンピュータのRaspberry Pi3を用いて、Linux KernelのBoot Sequenceを調査します。その調査結果を複数回に分けて、記事にします。対象のLinux Kernelは、Raspberry Pi(OS)のソースコード rpi-4.1.yとします。 ...

December 31, 2018 · 3 min