自作プログラム集 (Linux編)

English page is here.

このページは、Cプログラミングの勉強がてら、Linuxでしこしこと作ってみたプログラムを集めたものです。 xmmsの改造については、xmms 3DNow!/MMXパッチへ、自作のRPMパッケージはプライベート パッケージへどうぞ。 Windows関係のものはガラクタ部屋にあります。

大したものはありませんが、ご興味のある方は試してみてください。

ちなみにライセンスはそれぞれGPLとなっております。

Return to topこのページのTOPに戻る


athcool

Linuxや最近のWindowsでは、CPUの使用率が下がるとアイドルループでHALT命令を発行し、CPUを休止させ、省電力・低発熱化をはかるようになっています。 ですが、Athlon/Duronプロセッサ環境では、HALT命令を受けてもこの機能が働きません。 私も初めてDuronにした時には、監視ソフトを見ながら「CPU使用率が下がってもちっとも温度が下がらんな〜」と思ったものです。

この問題には、AMD-761やらVIA KT133等のチップセット(ノースブリッジ)の設定レジスタを変更することにより、対処することが出来ます。 ただし、サウンドに問題が出たり、キャプチャー系に影響が及んだり、ハードディスクの書込みが遅くなるなど、不具合が出る場合もあるようです。 まぁ問題が何も無ければ、マザーボードベンダーもBIOSレベルで有効にするでしょうしね。 私の環境では特に問題は出ていませんが、何かトラブルが発生しても当方では責任を負いかねます。 このソフトのご利用は自己責任でお願いします

このあたりの原理や問題については、Windows用ソフトのCoolOnのページに詳細な解説があります。

私も、Linux環境でAthlonの省電力機能を有効にするために、Athlon Powersaving HOWTOのカーネルパッチや、LVCool等を試してみましたが、ブート時にしか指定できなかったり、最新のチップセットに対応していなかったりしてたので、またまたいい加減なソフトを作ってみました。

このathcoolは、どのディストリにも入っているpciutilsのソースを参考に(というかライブラリも使ってますが)PCIレジスタにアクセスする部分を作った上で、各チップセットのIDやレジスタのアドレス等の情報を元に、必要なビットを操作するものです。 チップセットごとの定義情報はCoolOnのiniファイル等を参考にさせてもらってます。

ただし、このソフトはあくまでもチップセットのレジスタを操作するだけなので、Athlonの省電力モードを利用するには、(他の誰かに(^^;)Idle時にSTPGNT信号を出してもらわなければなりません。 そのため、ACPIをサポートしたカーネルが必要です(APMではダメなようです)。

使い方は、省電力機能を有効にするときは athcool on、無効にするときは athcool off、現在のステータスを見るには athcool stat です。何もオプション指定しなければ簡単な使用法が出てきます。 ちなみに、root権限がないと実行できません。

対応チップセット

各チップセットの定義情報は、上記の通りCoolOnのiniファイルを参考にしています。 ただし、私はVIA KT266A (EPoX EP-8KHA+), nVIDIA nForce2 (EPoX EP-8RDA+)でしか動作確認していません。 ユーザの方から動作したとご報告を受けたものもいくつかあります。

チップセット動作確認備考
VIA KX133, KT133/KM133/KL133/KN133(A)OK (KT133)Thanks X
OK (KX133)Thanks Brainstorm (EPoX EP-7KXA)
OK (KT133A)Thanks Masa (ABIT KT7A)
VIA KT266/333(A), KM266, P/KN266OK (KT266)Thanks Sargeant (MSI K7T266, on-board AC97, NVIDIA FX5200)
OK (KT266A)EPoX EP-8KHA+
OK (KT333A)Thanks Kronos (EPoX EP-8K3A)
OK (KM266)Thanks Connelly (Biostar M7VIQ)
OK (KN266)Thanks Schachtschabel
VIA KT400(A)/600, KM400OK (KT400)Thanks Fiedler (MSI KT4V-L)
OK (KT600)Thanks Campbell (Gigabyte 7VT600)
Thanks Pittich (Microstar KT6)
Thanks Larson (Soyo KT600 DRAGON Ultra Platinum)
OK (KM400)Thanks toki (GA-7VM400M)
NG (KM400A)Seeing freezes (Thanks Jacobson. athcool-0.3.10, A7V400-MX SE, Duron 1GHz)
SiS 730/733OK (SiS730)SiS730とモバイルAthlon XPで動作したそうです (Thanks Mueller)
VIA KT880OK (KT880)Thanks VBird (ASUS A7V880, Athlon XP 3000+)
SiS 735/740/745/755OK (SiS740)音の再生が切れ切れになる現象が発生。PCI Latency Timerを64にしてかなり改善したそうです (Thanks Herrmann)
OK (SiS740)サウンドも含めて特に問題なし (Thanks Kronos. ASUS L3D series)
NG (SiS735)ECS K7S5Aで、(スピーカーからでなく)マザー上から異様な高周波音が発生し、ディスプレイもチラつくなど、非常に怪しい状態になったそうです (Thanks Carlo)
NG (SiS740)athcool onしたらハードディスクに異様なアクセスが発生してクラッシュ。リブート後にファイルシステムが破壊されたとのことです (Thanks bonacci. ASUS L3350M)
SiS 741/741GX/M741OK (741)Thanks Bezerra
NG (741GX)すぐにフリーズ (Thanks Fausto. athcool-0.3.10, PCChips M863G)
SiS 746(FX)/748OK (746)少々ハードディスクのパフォーマンスが低下したような気がするとのこと (Thanks Michaelsen, ECS L7S7A2)
OK (746FX)Thanks toki (Iwill K7S2)
OK (SiS748)Thanks Peichl (ASRock K7S8XE+)
nVIDIA nForceOKThanks Herrmann
nVIDIA nForce2OKThanks Herrmann
OKEPoX EP-8RDA+
NGハードディスクの動作がおかしくなりデータも一部破損したとのこと (Thanks Santos. athcool-0.3.9, ASUS A7N8X-E Deluxe)
OK約8ヶ月利用しているが特に問題はないとのこと (Thanks Werner. athcool-0.3.11 w/ SuSE 10.0, ASUS A7N8X-E Deluxe)
AMD-751/761OK (AMD751)Thanks Smith
NG (AMD751)フリーズ (Thanks Bornemann, Asus A7M)
NG (AMD760)2、3分後から2、3時間後にハングしてしまうとのこと (Thanks Krecicki, Asus A7M-266)
OK (AMD761)Thanks Nakata
AMD-762OKHalt Disconnectに対応してないらしいのでアイドル時の省電力モード遷移ができません。S1/S3時の対応のみです (Coolonより)
HALT Disconnectも大丈夫だったそうです (Thanks Lorenz. Asus A7M-266D)

一部のチップセットやマザーで音の再生がおかしくなったりする場合は、BIOSの設定で

  1. PCI Delayed TransactionEnable にする
  2. PCI Master Read CachingEnable にする
  3. サウンドカードの差しているスロットの PCI Latency Timer64 にする

等の対策により症状が改善する場合があります。

ダウンロード&インストール

コンパイルは、ソースを展開して makeし、make installして下さい(root権限が必要です)。 RPM化したい場合は 例によって rpm -tb athcool-x.x.x.tar.gz または rpmbuild -tb athcool-x.x.x.tar.gz (RPM-4.x)です。

ちなみに、PCIのコンフィグレーション・レジスタのアクセスにpciutilsを利用しているため、make時にはpciutilsのスタティックライブラリとヘッダファイル(つまりpciutils-develパッケージ)が必要です。

使い方

/usr/sbin/athcool [オプション]

指定可能なオプション

on省電力モードを有効にする
off省電力モードを無効にする
stat現在の省電力モードの状態を表示する
listサポートしているチップセットの一覧を表示する
fixupサウンドが割れる問題など特定のハードで発生する問題を改善します (EXPERIMENTALなので注意して下さい)

注: athcoolをインストール、実行するにはroot権限が必要です。

変更履歴

0.3.12 : 2007/11/05
  • SiS741系のチップセットでシステムがフリーズする不具合を修正しました
    (該当ハードを持ってないのでテストしてませんがこれで問題ないようです。(Thanks Aisenbrey and Gajownik)
  • athcool.specでCopyrightタグをLicenseタグに変更しました(Fedora Core 4のため)。プログラム自体はまったく前バージョンと変わってません。
0.3.11 : 2005/06/18
  • athcool.specでCopyrightタグをLicenseタグに変更しました(Fedora Core 4のため)。プログラム自体はまったく前バージョンと変わってません。
0.3.10 : 2005/02/19
  • TP_LONGの代わりにTP_WORDを使うように変更 (AMD-751/761/762)
    32bitで読書きするのがうまくいってなかったみたいです (Thanks Lorenz)。
  • AMD-762で 'Halt Disconnect' を有効にしました (Thanks Lorenz)
  • CoolOnのWebサイトが移動したのでURLを変更しました
0.3.9 : 2004/12/31
  • レジスタの読み書き部分を変更
    • レジスタに書き込んだ後、正しく値が書き込まれたかチェックするようにした
  • Fedora Core 3でコンパイルできない問題を修正
0.3.8 : 2004/09/04
  • VIA KT880のサポートを追加 (Rjeousskiさん情報より)
  • 警告メッセージの書き換え
    ASUS L3350M (SiS 740ベースのラップトップ)で、athcool onしたらハードディスクが吹っ飛んだという報告を受けました
  • manの書き換え (Thanks Boullis)
0.3.7 : 2004/06/26
  • SiS 741/741GX/M741のサポートを追加(Bezerraさん情報より)
0.3.6 : 2004/06/12
  • nForce2環境でfixupオプション付で実行した際にレジスタに書き込む値を修正(Nakamuraさんありがとうございます)
0.3.5 : 2004/05/15
  • fixup オプションを追加(テスト。環境によってはさらに不安定になるかもしれないのでご注意)
    • nForce2でごく短い間隔でHALT命令が発行されると不安定になる不具合を直すそうです(Thanks Herrmann)
    • VIA系チップセットで音の再生に問題が出る場合があるのを改善するそうです(0.3.4のときとは違うbitも操作しています)
  • forceid オプションで、0x1を指定すると 0x10と認識してしまうバグを修正(Thanks Boullis)
0.3.4 : 2004/04/24
  • VIA系チップセットで athcool が操作するレジスタを追加しました。オーディオ関係の問題が発生する場合、症状が改善する可能性があります(Prayitnoさんのパッチです。ありがとうございます)
  • Makefileの「DEF += -DFIX_AUDIO=1」をコメントアウトすればこの変更を元に戻せます。
0.3.3 : 2004/01/24
  • VIA P/KN266のサポートを追加(Schachtschabelさん情報より)
  • Makefileを少々変更
  • init.dスクリプトを追加 (標準ではインストールされません)
    ( athcoolで省電力モードにしても安定して動作することを確認してからでないと危険です )
  • チップセットの強制指定(forceid オプション)を追加 (標準では無効)
    athcool on|off|stat force RegID
    指定するチップセットと実行環境とで設定レジスタが同じであることが確認できる限り使わないでください。危険です。
0.3.2 : 2003/12/20
  • VIA KM400のサポートを追加(mikellさん情報より)
  • とりあえずmanを追加
0.3.1 : 2003/09/23
  • athcoolをonにする際などに危険性を警告するメッセージを追加
  • Makefileに環境変数DESTDIRを追加
  • Zuckschwerdtさん提供のgcc-3.3環境での問題を修正するパッチをマージ
0.3.0 : 2003/06/21
  • SiS 748のサポートを追加(未テスト) : CoolOn 1.2.2 beta3から設定情報をいただきました
  • レジスタに書き込む前後の値を表示するようにしました
  • 中田さんによる修正パッチをマージ (ありがとうございます)
    • 一部の環境でチップセットの認識が正常に動作しないため、設定を有効にできないバグを修正
    • ソース全般のインデントその他を修正し、読みやすさの向上、潜在的バグの修正
0.2.0 : 2003/03/01
  • サポートしているチップセットの一覧表示機能を追加
  • nVIDIA nForceシリーズ/nForce2のサポートを追加(当然持ってないんで未テスト)。CoolOn 1.2.2 beta2から設定情報をいただきました
  • チップセットのIDリストとレジスタ情報を分離(違うIDでも同じ設定のチップセットが結構あるので)
0.1.1 : 2002/10/12
  • 省電力モードを無効にするのに失敗していたバグを修正
0.1.0
  • 1stリリース

Return to topこのページのTOPに戻る


mp3lib

mp3libは、MP3デコード・ライブラリです。

元々は、優れもののマルチメディア・プレイヤー、MPlayerのソースに含まれているMP3デコーダは、mpg123をベースにしたもので、SSEや3DNow!、MMXへの独自の拡張を施しているのを発見したのがきっかけです。

今まで私がイジってきたxmms 3DNow!/MMXパッチ、mpg123-pre0.59sの3DNow!/MMX/FPUデコーダ統合パッチも、同じくmpg123をベースにしたMP3デコーダを実装しているXMMSに、mpg123の最近のCVSで実現された機能拡張を移植したものでした。

これだけmpg123ベースのMP3デコーダがあるなら、そのエンジン部分を共有ライブラリにしてしまえばメンテするのも楽だし、バイナリの容量的にもわずかですが有利だなぁ、と考えて、どうやら一番SIMD実装が進んでいるMPlayerのものをベースにすることにしました。 MPlayerではMP3デコーダはスタティックリンクされているので、これをshared化した上で、作業を進めています。

現時点では、メインである共有ライブラリは一応動作しています。 mpg123、xmmsへパッチを作るのはかなり面倒そうなので、MPlayer仕様のAPIをコールして動く、簡易版のものを独自に作ってみています。 もちろん、歴史と実績のあるこれらのアプリを完全に代替できるものなどは私ごときには作れませんので、自分に必要そうな機能から少しずつ実装していくつもりです。

ダウンロード&インストール

コンパイルは、ソースを展開して make; make install すればOK。 RPM化したい場合は 例によって rpm -tb mp3lib-x.x.x.tar.gz です。

ちなみに、x86cpucapsが必要です。 ソース内の設定を少々いじれば無くても動きますが、SIMDデコーダ等の自動選択ができなくなります。

内容備考
libMP3.so (mp3lib本体)MP3デコードライブラリMPlayerでは実装されてないVBRまわりやseek関係を充実させないといけないかな
mp3decコンソール上で動作する簡易MP3プレイヤー今のところOSS又はesound経由で出力可能。-z, ZオプションとSIMDデコーダの自動・手動選択は実装済
libmpg123alt.soXMMS用のInputプラグイン今のところPlayとStop、デコーダの選択等の基本的機能は実装済。ただし、Seekは未実装なのでプログレスバーでの曲の途中へ移動しようとすると落ちます(^^;
(mplayer-xx-usemp3lib.patch)MPlayerにこのパッチをあて、./configure --enable-external_mp3lib してから make すればこのライブラリを使うようになります

変更履歴

0.2.1 : 2003/12/20
もう興味がなくなったんで放置してたんですが、SIMDデコーダで音にノイズが乗ってる不具合を見つけてしまったんで修正
Pentium(i586)最適化デコーダが使えなかった不具合を修正(ただしデフォルトでは無効になってます)
最新のMPlayer(1.0prex)とは互換性がないようです。追跡するのも面倒なので(^^;
1.0pre2までの変更点を反映(1.0pre3は反映してません)
layer1のサポートを追加
dct36_3dnow, dct36_k7をgcc埋め込みのアセンブラコードに変更
layer3.cほか、いくつか細かい変更
0.2.0 : 2003/02/15
MPlayer-0.90rc4の変更を反映して一部ソースを変更(layer2.c)
MPlayer用patchを0.90rc4用に変更
mp3lib.specの修正
(xmms plugin) xmms用プラグインにデコーダの設定を追加
0.1.11 : 2003/02/01
MPlayer-0.90rc3の変更を反映して一部ソースを変更(dct64_k7.c, decod386.c)
MPlayer-0.90rc3の変更を反映して 変数名'decwin[s]'を'mp3lib_decwin[s]'に変更(decod386.c, decode_MMX.c, decode_i586.c, tabinit.c tabinit_MMX.c)
SIMDデコーダを手動選択するときに、自動認識と同じデコーダを選ぶと落ちる不具合を修正(sr1.c)
MPlayer用patchを0.90rc3用に変更
0.1.10
MPlayer-0.90rc2の変更を反映して一部ソースを変更(dct64_MMX.c, deco386.c, decode_i586.c, tabinit_MMX.c, sr1.cの一部)
MPlayer用patchを0.90rc2用に変更
0.1.9 : 2002/12/22
MPlayer-0.90rc1の変更を反映して一部ソースを変更(dct64_3dnow.c, dct64_k7.c)
MPlayer用patchを0.90rc1用に変更
0.1.8 : 2002/11/09
MPlayer-0.90pre9の変更を反映して一部ソースを変更(sr1.c, decod386.c)
MPlayer用patchを0.90pre9用に変更
0.1.7 : 2002/10/05
なんかMP3_samplerateとか、いろんな変数がexternされてるのがどうかなぁということでMP3Infoという構造体を作ってまとめてみた
MPlayer用のパッチも上記の新仕様に合わせて変更
gettag、printtagあたりの仕様を変更
(mp3dec) setlocaleを追加
(xmms plugin) 曲の長さ等が正常に表示されない不具合を修正
0.1.6 :
jconv対応機能を追加。これでShift JISのID3タグもきちんと表示できます
(mp3dec) esound対応モードでmakeした場合、複数の曲を指定しても1曲目しか再生できない不具合を修正
0.1.5 : 2002/09/28
MPlayerからMP3ライブラリを使えるようにするパッチをソースに同梱しました
0.1.4 :
MP3_GetSongLength()関数を追加。VBR関係のヘッダを読み取るあたりはXmms-1.2.7を参考にさせてもらいました
0.1.3 :
mp3decとxmms_pluginのディレクトリを掘ってソースをそれぞれ分離
(オリジナルからの仕様変更もあって、MPlayerから利用できなくなってしまいました)
0.1.2 :
Xmmsの入力プラグインを作ってみた
0.1.1 :
fastmemcpyで、毎回SIMD対応をifで分岐してたら全然早くないような気がするので、MP3ライブラリ初期化時に指定ちゃうよう変更
0.1.0 :
(mp3dec) esound経由で音を出力できる機能を追加(make時に指定)
0.0.11:
複数の曲を指定しても1曲目で終了しちゃうバグを修正
0.0.10:
MPlayer-0.90pre8の変更を反映して一部ソースを変更(dct64_k7.c, decod386.c)
0.0.9:
ライブラリだけじゃ意味がないので、簡易MP3プレイヤー mp3decを作ってみた
mpg123-pre0.59sを参考に、-zや-Zオプション(ランダムやシャッフル再生)を実装
各SIMDデコーダの強制選択(--force-sseとかね)を実装
(あれ?複数の曲を指定しても1曲目の再生後、終了しちゃうバグが)
0.0.8:
sr1.cを少しいじって tabinit.cとgetbits.cを分離してみた
0.0.7: (0.0.5をベース)
MP3ライブラリの初期化時に行ったCPUの判定結果やらをexternして後々再利用するようにしてみた。
SIMDを利用したfastmemcpyを有効にしてみた
0.0.6:
sr1.cというメインのソースファイルって layer2やらlayer3をincludeしてて、さらにlayer3がdct12,36,64やらdecod386をincludeして...って感じでかなり見難い。試しに切り離していこうとしてみたんだけど、変数を追っかけてくのはかなり面倒だし、途中で音が少しノイジーになったりして収拾つかなくなったのでヤメヤメ
0.0.5:
FPUデコーダを選択すると落ちるバグを修正(synth1to1xxx関係の関数で、SIMD系とFPU系の引数が統一とれてなかったのね(^^;)。
0.0.4:
CPUの自動認識をMPlayerのものから、拙作のx86cpucapsを利用するよう変更
0.0.3:
MPlayerのfastmemcpy(aclibXXX.c)関係を整理
0.0.2:
各種SIMDデコーダを自動認識や手動指定で選択できるようにしてみた。でもFPUデコーダだけは選択すると落ちてしまうバグが
MPlayerのcpudetectやmp_msgxxx関係を整理
0.0.1:
MPlayer-0.90pre7のmp3libディレクトリ以下をベースに、sharedライブラリ化。
MPlayerではCPUの自動認識を有効にしてmakeした時に、何故かSIMDデコーダの選択が機能していないことが判明。この辺も今後の改良点ですね。

Return to topこのページのTOPに戻る


sensor_applet

Cなぞさっぱりわからぬ私ですが、勉強のためにlm_sensorsの値を読み取って表示するGNOMEアプレットを作ってみました。

動作無保証。アドバイス歓迎。

sensor_applet

ダウンロード

インストール

ダウンロードしたソースを解凍して、./configure; make; make installでOK。 RedHat系なら rpm -tb sensor_applet-xxx.tar.bz2 で作れるようになってます。 使い方は...、まぁ説明は要らないでしょ。

GNOME2対応の0.2.0は、GAIが必要です(0.5.2で動作確認)。

変更履歴

0.2.0 : 2004/03/13
GNOME2に対応
GAI (General Applet Interface library)を利用させてもらうことで、GNOME2に対応しました(GAI-0.5.2で動作確認)
GAIに実装されていないみたいなので、設定画面のリストボックスは、ただのテキストボックスになってます。
0.1.0 : 2001/12/15
いろいろ実験しているうちにバージョン番号が0.0.16とかスゴイことになってきたので、とうとうマイナーバージョンをアップ。とはいえ完成度は相変わらずです(^^;
main.c : find_chip, read_val
fgets, sscanf を使って読込むように書き換えてみた
main.c : main
今やほとんどすることがないmain.c の main を削除し、sensor_applet.c の g_main を mainに変更(コンソールアプリで実験していたころの名残でした)
sensor_applet.c : update_val
センサー名称の表示文字列を左詰め表示するよう変更(これでコンフィグ側でスペースを入れて調整しなくて済むように)
その他細かいバグ修正
0.0.6 : 2001/11/17
0.0.5aで同梱したパッチが腐っていた(私のバータリーな処置のせい(^^;)ようだったので、find_chips関数を書き直しました。>Thanks 新井様
0.0.5a : 2001/11/10
i2c経由での値を取得させるようにするパッチを同梱しました。必要な方はどうぞ。>Thanks 槌本様
0.0.5 : 2001/03/10
すんません。配列変数の宣言を間違えてました...。
0.0.4 : 2000/07/22
センサーの読みとり間隔もプロパティで指定できるようにしてみた。グラフ表示する前段階として、センサーの値を配列変数に格納してみた。lm_sensorsの上限/下限を逸脱したら赤字で表示するようにしてみた。
0.0.3 : 2000/07/15
読みとるセンサー名の設定はコンボボックスを使うようにしてみた。Cでのcharの扱いが良くわかってない(^^;)のだが、gnome-applets等を参考にg_free, g_strdupを使ってみた。これでSEGVらないようになっていればいいなぁ。
0.0.3-pre1 : 2000/07/10
表示するセンサーを設定するためのプロパティウィンドウを追加。実験のためソースを分離してみた。
0.0.2 : 2000/07/08
Makefileがすんげえバータリーだったので、automake/autoconfを使って作るようにしてみた。Dr. Kに教えてもらったokuji's web siteをみながら頑張ったのだが、こんな感じでいいのだろうか?
0.0.1 : 2000/06/24
gnome-applet等を参考に、GNOMEアプレット化してみた。小さい面積にできるだけ情報を表示するため、wmhealth等を参考に苦心惨憺(^^;
0.0.1-pre2 : 2000/06/03
「GTKチュートリアル」を参考に、読んだ値をGTKのダイアログに表示し、GTK_TIMEOUT_ADDを使って定期的(3秒ごと)に更新させるようにしてみた。
0.0.1-pre1 : 2000/05/27
/proc/dev/sys/sensors 以下を読んでコンソールに表示する部分を作ってみた。 フルスクラッチなのでかなりヘボいですが(^^;。

TODO (予定は未定(^^;)

Return to topこのページのTOPに戻る


vfatswap

Linuxではスワップファイルを専用パーティションだけでなく、ファイル上に作成することもできます。 で、指定したディレクトリにスワップファイルを作成するスクリプトを書きました。

VFATのパーティションにスワップを作りたいのがそもそものきっかけ(Linux日記 「WindowsとLinuxでスワップ領域を共有」参照)だったが、もはや意味無いのでどこのディレクトリでも作れるようにし、ついでにMTRRを設定できるようにしたりしました。 まぁ私以外使う人間はいないよね。

ちなみに私が最初にスワップファイルを作る実験をしてた頃にはミスってパーティションごととばしてしまったこともあります。 そういう危険が伴う可能性があることはご承知ください。 動作無保証。作者不負責任。 アドバイス歓迎。

ダウンロード

vfatswap-0.5.1-1ok.src.rpm (2000/04/14, 7KB)

インストール

ダウンロードして、rpm --rebuild vfatswap-0.5.1-1ok.src.rpmでOK。 私の環境はKondaraです。 他の環境で使う場合は、/etc/init.dの位置等の設定を見直してください。

設定方法

/etc/vfatswap/vfatswap.confに置く設定ファイルのオプション

スワップファイル関連
SWAPDIR(デフォルト値) /mnt/swap
スワップファイルを置くディレクトリ。 vfatswapは $SWAPDIR/linux.swp をスワップファイルとして作成します。
SWAPSIZE(デフォルト値) 128
スワップファイルのサイズ(MB単位)
DELWINSWAP(デフォルト値) no
$SWAPDIR/win386.swpを見つけたら削除するかどうか
CHECKSWAP(デフォルト値) yes
mountする前にスワップファイルをチェックするかどうか
MTRR関連
SETMTRR(デフォルト値) no
MTRRの設定をvfatswapで制御するかどうか。
事前に自分のハードウェアでの設定を確認してからMTRRADR、MTRRSIZEを正確に記述する必要があります。
MTRRADR(デフォルト値) 0xec000000
ビデオカードのメモリのベースアドレス
MTRRSIZE(デフォルト値) 0x1000000
ビデオカードのメモリサイズ

変更履歴

0.5.1 : 2000/04/14
内部での数値計算を expr を使うようにして、bcを使わないよう変更
スクリプトを/etc/rc.d/init.dではなく、/etc/init.d以下に置くように変更
細かいバグ修正
0.5.0 : 2000/11/04
設定ファイルのフォーマットを変更しました
0.4.0 : 2000/10/28
設定ファイルの位置を/etcではなく、/etc/vfatswap以下に変更
シェルスクリプトを/etc/rc.d/init.d以下に置く制御部分と、各機能の実行部に分離
スワップファイルをマウントするときにチェックする/しないオプションを追加
0.3.x : 未公開
シェルスクリプトではなく、Cで書いてみる実験
0.2.1 : 2000/04/22
スワップファイルの指定方法を変更
0.2.0 : 2000/04/15
MTRRを設定する機能を追加
スワップファイルのサイズを表示する機能を追加
設定ファイルを分離
0.1.3 : 1999/12/31
スワップファイルのサイズと位置を設定ファイルから設定できるように変更
0.1.2 : 1999/12/30
statusで状態が確認できる機能を追加
0.1.1 : 1999/12/18
vfatswapがchkconfigコマンドでrunlevel毎の実行/非実行を設定できるように書き方を修正
0.1.0 : 1999/12/11
最初のリリース

Return to topこのページのTOPに戻る


x86cpucaps

アセンブラのcpuid命令を使って、CPUのID(Family - Model - Stepping)、ベンダー文字列( GenuineIntelとか、AuthenticAMDとかね)、SIMD命令の有無等を調べるライブラリ。 CPUを判定して、最適なカーネルのProcessorType、gccの最適化オプションを出力する機能もあります。

ちなみに、拙作のxmms 3DNow!/MMXパッチ、mpg123-pre0.59sの3DNow!/MMX/FPUデコーダ統合パッチでも、このライブラリを利用することができるようになってます。

ろくなドキュメントはありませんが、一応ソース内のREADMEに多少の説明はあります。 まぁ大したことはしていないので、x86cpucaps.hやサンプルアプリのcpucapsを見れば、戻り値や引数の見方はなんとなく見当がつくと思います。 そこまでしてライブラリの使い方を知りたいなんて奇特な人がいるかどうかは別にして。

ダウンロード&インストール

コンパイルは、ソースを展開して make; make install すればOK。 RPM化したい場合は 例によって rpm -ta x86cpucaps-x.x.x.tar.gz です。

ライブラリに実装した機能

  1. CPUのSIMD対応の検出
    サンプル
    int x86cpucaps_simd(int)
    概要
    CPUのSIMD命令の対応状況を検出します
    引数と戻り値
    引数に GET_AMDSIMD を与えるとAMD 3DNow!及び拡張3DNow!の対応状況、GET_INTELSIMD を与えるとIntelのSIMD命令(SSE2/SSE/MMX)の対応状況を調べます。
    戻り値は、HAS_NOSIMD, HAS_MMX, HAS_SSE, HAS_SSE2, HAS_3DNOW, HAS_3DNOWEXT として定義してあります。
  2. CPUのSIMD対応を全て検出
    サンプル
    int x86cpucaps_simdall(struct simdcaps *simd, int i)
    概要
    CPUのSSE2, SSE, MMX, 拡張3DNow!, 3DNow!への対応の有無をそれぞれ検出します
    引数と戻り値
    第一引数は、simdcapsとして定義する構造体で、x86cpucaps_simdallで調べた個別の対応状況が格納されて返されます。
    第二引数は、0を指定するとSSEが現在のOSで利用可能であるかチェックし、利用できない場合はhas_sseフラグを0にします(0以外の場合はチェックしません)。
    戻り値はCPUがcpuid命令に対応していれば0が、対応していない場合は1が返ります。
  3. CPUのFamily、Model、Steppingの取得
    サンプル
    int x86cpucaps_cpumodel(int)
    概要
    CPUを判別する基本中の基本、CPUのFamily、Model、Steppingを取得する関数です。 EAX=0でCPUIDを実行した後のEAXレジスタを見るものです。
    引数と戻り値
    引数に GET_FAMILYを与えるとcpuidのうちFamilyの値、GET_MODELを与えるModelの値、GET_STEPPINGを与えるとSteppingの値、をそれぞれ返します。 引数をGET_ALLIDとすると、(Family*256) + (Model*16) + Stepping の値が返ってきます。
  4. CPUベンダーの取得
    サンプル
    int x86cpucaps_cpuvendor(char *)
    概要
    CPUの各ベンダーに対応した値を返す関数です。 CPUのベンダー文字列も取得します。
    引数と戻り値
    引数は、呼び出す前に char vendorname[LEN_VENDORNAME]; 等で定義しておく必要があり、cpuidで取得したベンダー文字列が格納されます。 戻り値は、VENDOR_INTEL, VENDOR_AMD, VENDOR_CYRIX, VENDOR_CENTAUR, VENDOR_TRANSMETA, VENDOR_OTHERS のいずれかです。
    参考
    EAX=0でCPUIDを実行した後の各レジスタを見ていますが、詳しい見方については、www.dinop.com さん等でまとめておられるようです。
    カーネルmake時の最適化オプション判定に利用することを念頭においているので、他のCPUは今のところ無視です。
  5. CPUの名称を推定
    サンプル
    char *x86cpucaps_getcpuname(int vendor_id, int cpu_id)
    概要
    CPUのベンダー、Family - Model - Stepping の情報からCPUの名前を推定します。
    引数と戻り値
    第一、第二引数は、事前に x86cpucaps_cpuvendor, x86cpucaps_cpumodel(GET_ALLID)でそれぞれ取得したもの等です。
    戻り値は内部でベンダーとCPUのIDから判定したCPU名称の文字列が格納され、最大サイズはLEN_CPUNAMEになります。 malloc()されてるので、使用後はfree()する必要があります。
    参考
    すべてを網羅するのは大変なこともあり、カーネルmake時の最適化オプションの決定に関係するもの以外は大雑把です。 ちなみに、ベンダーごとのFamily - Model - Steppingと実際のCPUの対応については、sandpile.org に非常に詳しく載っているのを見つけましたので、参考にしてます。 いずれにしても、私が動作確認したのはAthlon XPとPentum III(Katmai)環境においてのみで、他のCPUについても正しく実装されたかどうかは不明(^^;。
  6. カーネルmake時の最適なProcessorTypeを推定
    サンプル
    char *x86cpucaps_getkernelopt(int vendor_id, int cpu_id)
    概要
    カーネルmake時のProcessorTypeとして最適なものを推定します。
    引数と戻り値
    第一、第二引数は、事前に x86cpucaps_cpuvendor, x86cpucaps_cpumodel(GET_ALLID)でそれぞれ取得したもの等です。
    戻り値は内部でベンダーとCPUのIDから判定した、ProcessorTypeとして推奨する文字列( ex. CONFIG_MPENTIUMIII )が格納され、最大サイズはLEN_KERELOPTになります。 malloc()されてるので、使用後はfree()する必要があります。
    備考
    現在の最新カーネル(2.4.19)を前提に書いてるので、古いバージョンだと CONFIG_MCRUSOE とかはないかもしれませんが、そこまでは考慮してません。
  7. 推奨するgccの最適化フラグを推定
    サンプル
    char *x86cpucaps_getgcctarget(float gccver, int vendor_id, int cpu_id)
    概要
    gccの最適化フラグとして、指定すべきオプションを推定します。 (ex. -march=pentium3とか)
    引数と戻り値
    第一引数は、gccのバージョンをあらわすfloat型変数で、gcc-3.1.1であれば 3.11、gcc-2.95.3であれば 2.953という形で指定します。
    第二、第三引数は、事前に x86cpucaps_cpuvendor, x86cpucaps_cpumodel(GET_ALLID)でそれぞれ取得したもの等です。
    戻り値は、内部でベンダーとCPUのIDから判定したgccの推奨オプションの文字列が格納され、最大サイズはLEN_GCCTARGETになります。 malloc()されてるので、使用後はfree()する必要があります。
    参考
    gccのオプションはバージョンに依存します。 一応、適当なバージョン判定は行っていますが、あまりテストしてません。
  8. 推奨するgccのSIMD最適化オプションを推定
    サンプル
    char *x86cpucaps_getgccsimdopt(float gccver, int vendor_id, int cpu_id)
    概要
    gccのSIMD関係の最適化フラグとして、指定すべきオプションを推定します。 (ex. -m3dnowとか)
    引数と戻り値
    第一引数は、gccのバージョンをあらわすfloat型変数で、gcc-3.1.1であれば 3.11、gcc-2.95.3であれば 2.953という形で指定します。
    第二、第三引数は、事前に x86cpucaps_cpuvendor, x86cpucaps_cpumodel(GET_ALLID)でそれぞれ取得したもの等です。
    戻り値は、内部でベンダーとCPUのIDから判定したgccの推奨オプションの文字列が格納され、最大サイズはLEN_GCCSIMDOPTになります。 malloc()されてるので、使用後はfree()する必要があります。
    参考
    gccのオプションはバージョンに依存します。 一応、適当なバージョン判定は行っていますが、あまりテストしてません。 SIMD関係のフラグは3.1以降から実装されたんだっけ?

サンプルアプリ (cpucaps)

サンプルの cpucaps を実行すると、以下のような結果が出力されます。

引数なしだと全結果を出力しますが、いくつかオプションも指定できます。 一応、いい加減なヘルプは -h で見られます。

gcc関係はgccのバージョンに依存するので、gccのバージョンを指定することもできるようにしました。 2.95.3 の場合は、正式には-w 2.953としなければなりませんが、cpucaps -w `gcc -dumpversion`としても、2個目の.以下が無視され2.95と認識されるだけで、実用上は問題ないでしょう。

cpucapsのオプション
-kカーネルmake時のProceccorType (CONFIG_MK7等)のみ出力
-ggccの最適化オプション( -march=athlon-xp等)のみ出力
-sgccのSIMDオプション( -m3dnow等)のみ出力
-wgccのバージョンを与える(ex. -w 2.953)
Athlon XP環境での実行結果

$ cpucaps

CPU info : 6 - 6 - 2 (AuthenticAMD)
CPU Model Name : AMD Athlon XP/MP/4 (Palomino)
Recommended Kernel building option : CONFIG_MK7
Recommended gcc (3.1100) target : -march=athlon-xp -m3dnow
checking Intel SIMD capability : SSE
checking AMD 3DNow! capability : 3DNow! extensions

Testing OS support for SSE... yes.
Testing OS support for SSE unmasked exceptions... yes.
Tests of OS support for SSE passed.

SIMD capabilities checking results
SSE2:0 SSE:1 MMXext:1 MMX:1 3DNow!Ex:1 3DNow!:1

$ cpucaps -k
CONFIG_MK7

$ cpucaps -gs
-march=athlon-xp -m3dnow

$ cpucaps -gs -w2.95
-march=pentiumpro

Pentium III (Katmai) 環境での実行結果
$ cpucaps

CPU info : 6 - 7 - 2 (GenuineIntel)
CPU Model Name : Pentium III/Pentium III Xeon/Celeron
Recommended Kernel building option : CONFIG_MPENTIUMIII
Recommended gcc (3.1100) target : -march=pentium3 -msse
checking Intel SIMD capability : SSE
checking AMD 3DNow! capability : none

変更履歴

0.3.6: 2004/04/24
GCC-3.4のOpteron/Athlon64用最適化フラグ(-march=k8)に対応してみました(どちらも持ってないのでテストしてません)
0.3.5: 2003/03/01
Zagoracさんから報告のあったcheck_sse.cのコンパイルに失敗するバグを修正しました(0.3.4は私のミスでエンバグしてました(^^;)。ありがとうございます。
0.3.4 : 2002/12/22
Lichvarさんから報告があったSSE検出まわりの細かいバグを修正しました。ありがとうございます。
0.3.3 : 2002/11/17
Vladimirさんから報告があったSSE検出まわりのバグを修正しました。単なるtypoだったんですが、何せ私のテスト環境はみなSSEサポートなので気づきませんでした。ありがとうございます。
0.3.2 : 2002/10/05
意味はありませんが MinGW環境でコンパイルできるようにしました。ただし、Linuxでのsharedライブラリに相当するもの(dllか?)をどう作るのか良くわからないのでスタティック版しか作りません。
0.3.1 : 2002/09/14
SSE2からMMXまでのSIMD命令の対応状況を全て一度にチェックするx86cpucaps_simdallを追加
x86cpucaps_simdは、CPUがSSE対応でもSSEがOSでサポートされていない場合は、非対応と判断するよう変更
SSEのサポートチェックはMPlayerのソースを参考にして適当に作ったものです。わざわざ古いカーネルをインストールするのも面倒なので正常に機能するかどうかは確認してません。
0.3.0 : 2002/09/07
x86cpucaps_simdで拡張3DNow!の検出に対応しました。
x86cpucaps_simdの戻り値の値を変えたほか、getcpuname, getkernelopt, getgcctarget, getgccsimdoptは文字列を直接返すように変更したため、以前のバージョンとは互換性がありません。
0.2.2 : 2002/08/31
pgccやegcsでは -dumpversionすると、pgcc-2.95.3等と返してくるため、バージョンを認識できず 0 になってしまう不具合を修正( -w オプションのoptargをそのまま atof()に渡さず、先頭のnot numericな部分は無視するようにしました)。
sprintf()を使わず、strncpy()で文字列をコピーするよう変更
0.2.1 : 2002/08/24
使用可能な最適化フラグは gccのバージョンによって異なるので、gccのバージョンを指定する -w オプションを追加。cpucaps -w `gcc -dumpversion`でも一応受け渡し可能
0.2.0
CPUの判別結果を使って、gccの最適化フラグを推定して出力する機能を追加( 最適なarchitectureを返す -g オプション、利用可能なSIMDオプションを返す -s オプションを追加
cpucapsでオプションを受け取るのに getopt_long()を使うよう変更
0.1.8 : 2002/08/16
CPUの判別結果を使って、カーネルをmakeする際の最適なProcessor Typeを推定して出力する機能( -k オプション)を追加。 本当は使用可能な Processor Typeはもろにカーネルのバージョン依存なんですが、面倒なので無視(^^;。とりあえず現在の最新安定版 2.4.19あたりなら問題ないと思う。
( CPUIDやベンダーとカーネルProcessor Typeの対応、その他の作り込み)
0.1.1
CPUID(Model, Family, Stepping)を取得する機能、CPUのベンダーを判別する機能を追加
0.1.0
まずは1のsharedライブラリ化は達成。ライブラリにアクセスするテスト用として、サンプルアプリの cpucapsを同梱
以下の3つを開発目標として、作業スタート
  1. 以前作成したCPUのSIMD有無の判別ルーチンをsharedライブラリ化
  2. CPUを自動判別し、カーネルmake時の最適なProcessorTypeを返す
  3. CPUを自動判別し、gccの最適なコンパイルオプションを返す

Return to topこのページのTOPに戻る


Linux日記で出てきた「いい加減なパッチ」シリーズ


Return to Previous page一つ前のページに戻る / Return to topこのページのTOPに戻る