shimada-kの日記

ソフトウェア・エンジニアのブログです

clistを使ってカーネル側とユーザ側で通信させてみました

以前の記事で作成したカーネル側の循環リストライブラリ(clist)を使って、実際にカーネル空間とユーザ空間でデータ通信をしてみました。LinuxカーネルではftraceやSystemTapなどのトレーサが使えます。両者とも非常にすばらしいツールなのですが、リングバ…

xconfigとgconfigを使ってみました

GUIベースのカーネル設定ツール(ようは.configに書いてあるカーネルコンポーネントのn/m/yを切り替えるGUIフロントエンド)を使ってみたのでそのことについてのメモです。この記事を9割くらい書き終わった段階でid:meechさんの記事*1を見つけてしまいました。…

ページキャッシュのミスはどこで起きているのか

あけましておめでとうございます。これは「カーネル/VM Advent Calendar2011」35日目の記事です。そして2012年一発目の記事になります。この記事ではページキャッシュミスについて書きます。ページキャッシュとDB(主にtmpfsと絡めたお話)についてはid:naoy…

clistのカーネル版を作りました

前回このブログに書いた循環リストのライブラリのカーネル版の実装を作りました。本体はここ(github)にあるので、ヘッダファイルをさらしておきます。clist.h #include <linux/spinlock_types.h> /* spinlock_t */ #define CLIST_STATE_COLD 0 #define CLIST_STATE_HOT 1 #define C</linux/spinlock_types.h>…

循環リストのライブラリを作成しました

循環リストのライブラリを作成しました。いずれはカーネル空間で捕捉されたイベントをユーザ空間のアプリケーションに通知させる際に使用するつもりです。似たようなデータ構造でリングバッファがあるのですが、カーネルでもdmesgや、oprofileなどで使われて…

マイナー番号で複数のデバイスファイルを管理するコードのメモ

今までデバイスドライバを書く時はマイナー番号は0にしていました。なので「マイナー番号はメジャー番号の1つ下の階層の番号」ぐらいの理解でした。 #複数のデバイスファイルを扱う要件がなかったのでしかし、1つのドライバコードで複数のデバイスファイル…

container_ofでsysfsのコールバック関数を一元化

私が普段使っているシステムではカーネルのパラメータを出力するのにsysfsを使っています(このことは以前このブログに書きました)。しかし、出力するファイルが多くなると同じような処理をするルーチンが多数存在することになり、無駄にソースの行数が多く…

L3キャッシュミス ア‐ラ‐カルト

L3キャッシュミスを計測するプログラムを書いてみました。しかし、一口にL3キャッシュミスと言っても複数のイベントがあります。状況に応じて適切なイベントを選択できるようにそれぞれのイベントの意味を整理しておこうという趣旨のメモです。今回は6種類の…

MSRを扱うためのライブラリを作ってみました

IntelのCPUではハードウェアイベントを計測できるPMC(Performance Monitoring Counter)という仕組みがあります。PMCを使用して、イベントを計測するためには最低3つの手順でMSR(モデル固有レジスタ)に対してデータを読み書きしなければなりません。 IA32…

ImageMagickとマルチスレッドは混ぜるなキケン!?

画像処理をする要件が出たので手軽に扱えるライブラリは無いものかと探した結果、ImageMagickに行き着きました。ライブラリを利用して、油彩化とシャープネスを組み合わせた加工を施すプログラムです。この処理をスレッドに割り当て、マルチスレッドで画像処…

仮想FSはsysfsを使おう

カーネルhackで使っていたシステムをprocfsからsysfsに切り替えました。仮想ファイルはget_seconds()関数を使ってepoch時間を表示させるものを用意しました。それを行うのが以下のカーネルモジュールです。epoch_sysfs.c #include <linux/kobject.h> #include <linux/string.h> #include <linux/sysfs.h> #inc</linux/sysfs.h></linux/string.h></linux/kobject.h>…

pthread_cancel(3)を使ってみた

マルチスレッドのプログラミングをしていく時にあからさまなポーリングをしない方法についてです。後々同じ内容で悩まないためのメモです。あからさまなポーリングとは int death_flag; /* 省略 */ void *thread_main(void *arg) { /* 省略 */ while(1){ /* …

TurboBoostの周波数監視ツールを作成しました

新しいマシン(Sandy Bridge)を買ったのでTurboBoostを試してみました。Win環境だとIntelが作成&公開しているインテル® ターボ・ブースト・テクノロジー・モニターというツールがあります。Linux用だと、turbostatというツールがあります。私はLinuxユーザ…

debianでUSBメモリを実行権付きでマウントするメモ

debianでUSBメモリを扱う時のメモです。私はプログラムの開発プロジェクトをUSBメモリに保存しています。そうすると、USBメモリ内の実行ファイルを実行したいわけです。しかし、私が常用しているdebianではUSBメモリのファイルは「読み込み+書き込み権限」…

ビット演算用のライブラリを公開します

私が以前から使用していたビット演算のC言語用ライブラリを公開します。 低レイヤ技術を扱う マルチメディアを扱う オブジェクトの領域を節約したい などの場合、ビット演算を行うことがあると思います。ただ、C言語で用意されているものは演算子だけで、「…

Initial APIC IDとランキュー番号の対応を調べる

Initial APIC IDとLinuxカーネルにおけるランキューの番号との対応を調べました。Intelのマニュアルによると2C/4TのCPUが2つ載っているマシンの各CPUのInitial APIC IDは下の表の様になると書いてあります。 Initial APCI ID Package ID Core ID SMT ID 0H 0…

Linuxの組み込みカーネルモジュールを作成する方法

OSの研究をする上で、カーネルのパラメータの値を知りたい時や独自の機能を追加したい時などにカーネルモジュールとして実装することが多々あります。そして往々にして知りたいパラメータはファイルの外にEXPORTされていないので、LKM(ローダブル・カーネル…

Hello, World.

ブログを再開しました。このブログでは主に技術ネタをベースに日々思ったこと、感じたことを書いていこうと思います。そして、新しくブログをするに至っていくつか(戒めのために)のブログ規約を定めたいと思います。 「です・ます」調で書くこと 主観的な…