2011年4月24日

Gentoo Linuxで python をアップデート (2.6 -> 2.7)

Gentoo LinuxのPortageでPythonが2.6から2.7にアップデートがありました。アップデートしたら見事に(案の定?)トラブったので、僕が対応した方法をメモしておきます。

現象
portageによるpythonのアップデート(python-2.7.1-r1)後、emergeコマンドが一切動作しなくなる。x86-stableパッケージ(x86)を利用しており、python-2.7はSlotでインストールされていた。

解決方法
僕の場合は以下の方法で解決することができました。
まず、eselectでpythonパッケージを2.7に変更する
  $ eselect python list   (python2.7の番号を確認。僕の環境では[1])
  $ eselect python set 1  (確認した番号[1]で設定する)
続いて python-updater コマンドで旧pythonに依存するパッケージの再ビルドを行う
  $ python-updater

これで解決しました。長らく使っていた2.6系はこれで不要に。--depcleanでアンインストール

NetBSDのUSBホストコントローラのドライバIF

NetBSDカーネル内部の話になります。

NetBSDのUSB(ホスト)ドライバでは各種ホストコントローラ(以下、HC)とUSBプロトコルドライバ間でIFが切られています。上位のプロトコルドライバからはHC種別(ehci, ohci, uhci)は意識せず、このIF関数をコールすることでホストコントローラを制御しています。今回、このIF形式と各IF関数で行う処理内容に関して簡単にまとめます。

なお今回、NetBSD-5.1を対象に記載しています。NetBSDでUSBホストドライバがサポートされてからIFは大きく変わっていません。

インタフェース形式
HCドライバのIFは、usbd_bus_methods構造体とusbd_pipe_methds構造体で宣言されています。本構造体は dev/usb/usbdivar.h で型宣言されており以下のような構造になります。



struct usbd_bus_methods {
    usbd_status         (*open_pipe)(struct usbd_pipe *pipe);
    void                (*soft_intr)(void *);
    void                (*do_poll)(struct usbd_bus *);
    usbd_status         (*allocm)(struct usbd_bus *, usb_dma_t *, u_int32_t bufsize);
    void                (*freem)(struct usbd_bus *, usb_dma_t *);
    struct usbd_xfer *  (*allocx)(struct usbd_bus *);
    void                (*freex)(struct usbd_bus *, struct usbd_xfer *);
};

struct usbd_pipe_methods {
    usbd_status      (*transfer)(usbd_xfer_handle xfer);
    usbd_status      (*start)(usbd_xfer_handle xfer);
    void              (*abort)(usbd_xfer_handle xfer);
    void              (*close)(usbd_pipe_handle pipe);
    void              (*cleartoggle)(usbd_pipe_handle pipe);
    void              (*done)(usbd_xfer_handle xfer);
};

構造体名から想像できますが、usbd_bus_methodsはHCに紐付けられたHCとして行うべき関数をまとめた構造体です。一方usbd_pipe_methodsはUSBの転送パイプ(コントロール転送とかバルク転送)として行うべき関数をまとめた構造体になります。

各関数で行うべき処理に関して、以下に記載します。

open_pipe
  USB転送パイプのオープンを行います。上位で転送パイプを用いてデータ転送する場合にはまず本IFで転送パイプの初期化処理を行います。HCごとに転送パイプの取扱いおよび必要なデータ構造が異なるため本IFが用意されています。また本関数内部でUSB転送パイプとusbd_pipe_methodsの紐付けを行います。

soft_intr
  割り込み処理を行う関数です。NetBSDのUSBホストドライバではUSB関連の割り込み処理はハード割り込みのコンテキストではなく、ソフト割り込みのコンテキストで実行することが設計ポリシーとなっており、ソフト割り込み実行時にも本関数が実行されます。各HCドライバ内での動きとしては、ハード割り込みが発生した際にソフト割り込みのスケジューリングを行い、そのソフト割り込み内で割り込み処理を行う流れになります。

do_poll
  割り込をソフト側でポーリングするためのIFです。割り込み禁止状態でハードからのイベント(=割り込み)待ちが必要となるような場合に利用するIFです。

allocm
  HCに渡す送受信用データ領域のメモリ確保を行う際のIFです。メモリ領域確保自体はHCに依存する部分は少なくNetBSD-5.1でも各HCでほとんど共通の処理を行っています。(HCによって送受信データのアライメントがある場合や特殊制御が必要な場合には本IFが意味を持ちます。)

freem
  allocmで確保したメモリ領域を解放する際のIFです。

allocx
  USB転送(usbd_xfer)を確保する際のIFです。HCでは転送単位で必要となる処理が多いたえめ、本IFは(allocmと異なり)HCごとに大きく異なるため、各HCごとに必要なデータ領域の確保等を行います。

freex
  allocxで確保したUSB転送データ構造を解放する際のIFです。

transfer
  上位USBプロトコルドライバからUSB転送を開始する際のIFです。

start
  実際にHCに対してUSB転送を行う際のIFです。上記transferとstartの差異について説明しますが、NetBSDのUSBドライバの作りとしてUSB転送はパイプごとにキューイングする作りになっています。transfer()はこのキューにデータをエンキューするためのIFで、start()はキューのデータを実際に転送するIFです。またNetBSDのUSBドライバはデータ転送が終了した際にコールバック内でstart()を実行することで次の転送を開始するような作りにもなっています。

abort
  転送中のUSB転送を中止する際のIFです。

close
  open_pipe()でオープンしたパイプをクローズするIFです。

cleartoggle
  USBプロトコルで定められているトグルをクリアするIFです。トグルの制御方法はHCごとに異なっておりHC(ハード)が完全制御するもののありますが、ソフト側で制御が必要なものもあるため本IFが存在します。

以上。

2011年4月23日

USB3.0とUSB2.0の差異 その1 (USBハブクラスのStatusフィールド)

今、USB3.0の仕様を色々と見ています。「プロトコル層より上位は互換性がある」といったことも聞きますが、実際には細かなところに差異があります。特にUSB3.0ではハブの仕様が大きく変更されておりクラスリクエストも見直されています。
その違いの1つとして、ハブクラス仕様で決められているPort Status Field(wPortStatus)とPort Change Fileld(wPortChange)を以下で比較してみます。

  • USB3.0:wPortStatus
    •   Bit 0 : Current Connect Status
    •   Bit 1 : Port Enabled/Disabled
    •   Bit 2 : Reserved
    •   Bit 3 : Over-current
    •   Bit 4 : Reset
    •   Bit 5-8 : Port Link State
    •   Bit 9 : Port Power
    •   Bit 10-12 : Negotiated speed
    •   Bit 13-15 : Reserved


  • USB3.0:wPortChange
    •   Bit 0 : Connect Status Change
    •   Bit 1-2 : Reserved
    •   Bit 3 : Over-Current Indicator Change
    •   Bit 4 : Reset Change
    •   Bit 5 : BH Reset Change
    •   Bit 6 : Port Link State Change
    •   Bit 7 : Port Config Error
    •   Bit 8-15 : Reserved
  • USB2.0:wPortStatus
    •   Bit 0 : Current Connect Status
    •   Bit 1 : Port Enabled/Disabled
    •   Bit 2 : Suspend
    •   Bit 3 : Over-current
    •   Bit 4 : Reset
    •   Bit 5-7 : Reserved
    •   Bit 8 : Port Power
    •   Bit 9 : Low-Speed Device Attached
    •   Bit 10 : High-Speed Device Attached
    •   Bit 11 : Port Test Mode
    •   Bit 12 : Port Indicator Control
    •   Bit 13-15 : Reserved
  • USB2.0:wPortChange
    •   Bit 0 : Connect Status Change
    •   Bit 1 : Port Enable/Disable Change
    •   Bit 2 : Suspend Change
    •   Bit 3 : Over-Current Indicator Change
    •   Bit 4 : Reset Change
    •   Bit 5-15 : Reserved


違いを明確化するために色付けしてみた。青字はUSB3.0で拡張あるいは無効になったフィールド、赤字が互換性の無いフィールド。この違いはUSB3.0でリンク層が追加され、リンク層制御をハブクラスで行わなければならないことに起因すると考えられます。

2011年2月11日

GRUBが立ち上がらなくなったときの対応(Gentoo Linux インストールCD)

現在、Windows 7/Gentoo Linux/NetBSDという3つのOSをPCにインストールしていて、ブートローダにGRUBを利用しています。OSの再インストール等を実施していると稀にMBRが書き換えられてGRUBが立ち上がらないあるいはOSが何も立ち上がらないという状況になります。そんなときの対処方法に関して記載します。

僕はいつも、Gentoo Linuxをインストールした際に利用したインストールCDを利用してます。基本的な流れとしては、

  • インストールCDから起動
  • Gentoo Linuxのパーティションをマウント、chroot
  • GRUBの再設定

という流れです。以下がインストールCD起動からGRUB再設定までに必要なコマンドです。

    # swapon  /dev/sda2
    # mount /dev/sda3 /mnt/gentoo
    # mount /dev/sda1 /mnt/gentoo/boot
    # cd /mnt/gentoo
    # mount -t proc none /mnt/gentoo/proc
    # mount -o bind /dev /mnt/gentoo/dev
    # chroot /mnt/gentoo /bin/bash
    # grub


    grub>  root (hd0, 0)
    grub>  setup (hd0)

以上でMBRへのGRUB最設定が完了です。上記の方法はKnoppix等のLiveCDでもつかえるはずです。

2011年1月19日

とある場所で行われた会話

某メーカー新入社員 : 『いったい僕は、誰にために仕事をしているんだろう』

評論家 : 『お客様のためさ。それがメーカーが追及すべき唯一のことだから』
経営学者 : 『上司のために仕事するんだ。組織として機能するために必要だ』
哲学者気取り : 『自分のためにやりなよ。幸せを追及しないと、人生は無意味だよ』

某メーカー新入社員 : 『あぁ…、いったい僕はどうすればいいんだ』

通りすがりの英国人 : 『Take it easy. Que sera sera』

USB3.0ホストチップ(xHCI)の調査

USB3.0ホスト(xHCI)のチップってどんなのが市場に出ているのだろう?
ってことで、調べてみた。(2010/01/18時点の情報)

ルネサスエレクトロニクス
μPD720200  : PCIe Gen2 x 1、2ポート、
μPD720200A  : μPD720200に対して消費電力低減

FLESCO LOGIC
FL1009 : PCIe Gen1 x 1、2ポート
FL1010 : PCIe Gen2 x 1、2ポート

VIA Labs
VL800 : 4ポート

チップだと、これだけ。IPだとどうなんだろう。
PLDA : ホスト、デバイス両方のIP
Arasan : 同じくホスト、デバイス両方のIP

なお、ルネサスエレクトロニクスもIPを持っているらしい。
個人でこんなこと調べてどうなるわけでもないけど、念のため。

2011年1月9日

OProfileで取得可能なイベント

先日OProfileを初めて触ったが、どのようなイベントを取得できるのか調べてみた。OProfileで取得できるイベント種別は利用しているCPUにより異なる。
詳細はOProfileのドキュメントに記載されている『Event type reference』に記載されている。また、opcontrol コマンドの --list-events オプションで確認可能(あるいは ophelp コマンドでも確認できる)。私の環境だと以下のようになった。



% opcontrol --list-events
oprofile: available events for CPU type "Intel Architectural Perfmon"

See Intel 64 and IA-32 Architectures Software Developer's Manual
Volume 3B (Document 253669) Chapter 18 for architectural perfmon events
This is a limited set of fallback events because oprofile doesn't know your CPU
CPU_CLK_UNHALTED: (counter: all)
        Clock cycles when not halted (min count: 6000)
INST_RETIRED: (counter: all)
        number of instructions retired (min count: 6000)
LLC_MISSES: (counter: all)
        Last level cache demand requests from this core that missed the LLC (min count: 6000)
        Unit masks (default 0x41)
        ----------
        0x41: No unit mask
LLC_REFS: (counter: all)
        Last level cache demand requests from this core (min count: 6000)
        Unit masks (default 0x4f)
        ----------
        0x4f: No unit mask
BR_INST_RETIRED: (counter: all)
        number of branch instructions retired (min count: 500)
BR_MISS_PRED_RETIRED: (counter: all)
        number of mispredicted branches retired (precise) (min count: 500)



私が使っているCPU(Intel Core i5-560M)の場合だと、他のCPUに比べて取得できるイベント種別が少ない模様。

2011年1月3日

OProfileを使ってみる

LinuxカーネルのプロファイラであるOProfileを使ってみることにする。
始めて利用するので、今回はセットアップと超簡単な使い方のみ試してみる。

今回試した環境は、

  • システムは Gentoo Linux。カーネルバージョンは 2.6.36-gentoo-r6(Linux-2.6.36にGentoo向けパッチが当たっている)
  • PCは、ThinkPad X201を利用。CPUはIntel Core i5-540M


まずは環境のセットアップ。OProfileを利用するためにはLinuxカーネルでのサポートと専用ユーザランドのインストールが必要。Linuxカーネルのサポートは、CONFIG_OPROFILE と CONFIG_HAVE_OPROFILE のサポートがあれば最低限OKらしい。続いてユーザランドのインストール。Portageを使ってインストールする


  $ emerge  dev-util/oprofile


インストールしたらOProfileで簡単なプロファイルを行ってみる。


  $ sudo opcontrol  --vmlinux=/usr/src/linux/vmlinux
  $ sudo opcontrol  --start
  # プロファイルをとる任意のプログラムを実行
  $ sudo opcontrol --stop


以上でプログラムのトレース取得は成功。
なお、opcontrolで各種処理を行うにはroot権限が必要な模様。そのため、sudoコマンドを用いて行っている。

続いてプロファイル結果の表示


  $ opreport    # 全体の結果を表示
  $ opreport  (プログラム名)    #  該当するプログラムのみ
  $ opreport  -l  (プログラム名)  # ??
  $ opreport  -c (プログラム名)  # ??



opreportでの各種コマンドラインオプションの詳細は今回は未確認。今日のところはこれで終了。もっと詳細を後日見ていきたいと思う。

参考ページ
OProfile : http://oprofile.sourceforge.net/news/
OProfile Documents : http://oprofile.sourceforge.net/docs/

備考
OProfileのサポートCPUを見るとCore-i5は十分なサポートされていないのか??この点も後日確認したいと思う。
またOProfileの実行に伴い、/root/.oprofile/ ディレクトリが作成されて設定が保持される。
さらに実行時の各種詳細情報は /var/lib/oprofile/ ディレクトリ配下に記憶さえる模様。

2010年6月17日

Gentoo Linux の world を調べる方法

Gentoo Linux で portage を使用していると、依存するパッケージ等を自動で解決・インストールしてくれます。では、インストールしているパッケージで「自身で指定したパッケージ」と「依存しているためにインストールされたパッケージ」を調べたい場合にはどうするか?という話。
自身で指定したパッケージは、"world" に指定されます。この world はファイルとして保持されていて、/var/lib/portage/world のファイルを確認すれば分かります。

2010年5月9日

Androidアプリのメニューに標準アイコンを指定する方法(xml編)

Androidアプリを作成するにあたって、アプリのメニューで利用するアイコンを他のアプリと共通にする目的でAndroidの標準アイコンを使いたいことがあると思います。(アイコンを作るのが大変というケースもあるかと思いますが…)

xmlでアイコン指定をする方法は、iconとして"android:drawable/アイコン名" を指定します。
例えば、以下のような形で res/menu/menu.xmlファイルを指定します。
  android:icon="@android:drawable/ic_meu_info_details"


指定可能なアイコン名については、タオソフトウェアさんのブログが参考になります。
  参考リンク:Android メニューアイコン (タオソフトウェアさんブログ)