先日

SUSE Linux で ファイルを完全削除 - 'シュレッダ'にかける

という記事を書いたのですが、 dd if=/dev/randam ...... を実行するとえらく時間がかかり、進捗状態が見えません。「本当にやってんの?」という不安に駆られます。

ということで、 dd コマンドが実際動作しているかどうかを調べる方法 (verbose モード)がないかと調べてみたら、ありませんでした。

ありませんでしたが他の方法がありました。

ddコマンド実行途中に、何バイトコピーできたかを見る方法

を参考にしました。たなかさんありがとう。
-実例-

sles11:~/tmp # dd if=/dev/random of=deleteme.file &
 <-- '&' 付きバックグラウンド実行(しかもサイズ指定していないし...)
[1] 4111 <--- プロセス番号を覚えておきます。
sles11:~/tmp # kill -USR1 4111
0+496818 records in
124202+0 records out
63591424 bytes (64 MB) copied, 40.1854 s, 1.6 MB/s <-- 状況です。
sles11:~/tmp # ls -l
total 91252
-rw-r--r-- 1 root root 93343232 Aug 27 19:51 deleteme.file
sles11:~/tmp # kill -USR1 4111
0+802359 records in
200586+0 records out
102700032 bytes (103 MB) copied, 64.6436 s, 1.6 MB/s
 <--- 103Mb 進捗、やってるよ。
sles11:~/tmp # ls -l
total 107508
-rw-r--r-- 1 root root 109971456 Aug 27 19:51 deleteme.file 
<-- サイズもおおよそ一致
sles11:~/tmp # kill 4111
 <--- 飽きたので止めました。
[1]+ Terminated dd if=/dev/random of=deleteme.file
sles11:~/tmp # ls -l
total 151332
-rw-r--r-- 1 root root 154806784 Aug 27 19:52 deleteme.file
sles11:~/tmp #

islandcenter.jp

-keyword-

dd コマンド 進捗表示 確認 SUSE Linux SLES
[PR]
by islandcenter | 2013-08-28 16:13 | SUSE | Trackback | Comments(0)

ここでは初めて SUSE Linux Enterprise Server 他 Novell, Attachmate 製品の評価を目的とした製品の電子メディアのダウンロード方法を説明します。

※本当にやった作業ではないので一部割愛している部分があるのはご了承ください。

※ 画面のハードコピーは 2013/8 現在のものです。あまりデザインが変わらないとは思いますが数年に一度はドラスティックに変わる場合もあります。

-アカウントを作る-

まず novell.com にアクセスします。
http://www.novell.com/ja-jp/home/

右上の Login をプルダウンして 'Create New Account' します。
a0056607_9484964.jpg


必要事項を埋めていきます。アスタリスク*が付いている項目は必須項目です。
a0056607_9483833.jpg


アカウント名とパスワードをセットします。
a0056607_952477.jpg


※重要
- アカウント名は他でまず他所では利用されていないアカウント名を使ってください。 "mydomain-com" のようなアカウントが良いでしょう。アカウント名は変更できないようです。
- メールアドレスは担当者個人のアドレスではなく、 systemmanager@mycompany.com のような共用アドレスを指定します。担当者が退職したときに大変なことになります。また、このメールアドレスは、製品をアクティベーションするときに必要になりますので、半永久的に使えるものをご用意ください。ただし、登録したメールアドレスは、novell.com のカスタマセンターから後に変更できます。
- パスワードは2~3人だけに開示し、知っている担当者が退職したり不要になった場合は必ず変えておきます。私もお客様が Novell/SUSE/Attachmate アカウントにアクセスする場合は背中を見せるよう心がけています。何しろ外部からもアクセスできるサイトなので取り扱い注意です。

-たぶん-
登録先にメールが送られてアカウントがアクティベートされるはず(?)です。英文ですから、ジャンクメールも良く探してください。(実際ジャンクだと思い削除してしまった方もいらっしゃいます)


-製品評価版のダウンロード-

サービスとサポート>ダウンロード>製品 を選びます。
a0056607_1025090.jpg


製品のドロップダウンリストから、 SUSE Linux Enterprise Server を選び、バージョンを選びます。 2013/8 現在 11sp3 が選択できます。
a0056607_1051044.jpg

生の SLES11 以外にも SAP 専用チューニングされたバージョン、 VMware 用などのメディアがあることがわかりますね。

Search ボタンを押すと、プロダクトのリストが出ます。
a0056607_10101565.jpg

ここでは Intel/AMD 64 アキテクチャを選びました。もちろん、軽量な32 ビット版を選んでもかまいません。(その場合のライセンスはどうなるのかは不明)

その後簡単なアンケートに答えるとダウンロード画面に進みます。

Proceed Download ボタンを押すと、実際のダウンロードリンクに進みます。
a0056607_1016130.jpg

SLES11 のインストールは1枚目の DVD/ISO だけで行えます。

※ もし、Novell/SUSE/Attachemate アカウントにログインしていない場合、Proceed Download ボタンを押すと認証画面が出ます。ということではじめにアカウントを作っておく必要があるわけですね。

後は、回線次第、インフラ系エンジニアお得意の「待つのも私達の仕事の一つ」の時間をまったりとすごしてください。

-suse.com からのダウンロード-
https://www.suse.com/ からも同様にダウンロードできます。デザインは Novell.com とほとんど一緒です。
a0056607_10224855.jpg

※ブラウザはEN優先にしてるためこのスクリーンは英語表記ですが日本語を優先言語にするともちろん日本語で表示されます。

結局はそのまま download.novell.com にリダイレクトされてしまうので、後の作業は一緒です。

-その後は-

任意の DVD イメージライターで焼きます。
焼いた後DVDブートできるかどうか確認します。
実際のインストーラを起動したら Media Check を一度行ってください。電子メディアの場合はこのスクリーンが出てきます。
ISO ファイルも安全なところに保管するか、DVDメディアにバックアップを取っておきます。

拙い作りですが、インストールの実際の手順書を作ってみました。SLES のインストールから、XEN の準備、ハードウェア管理のコマンドの例を、一応「使える程度」に書いてみたつもりです。(たまに修正しますので悪しからずご理解ください)
http://www.islandcenter.jp/il/qa/sles/SLES11sp3Install.pdf

一応インストールもできて、ほぼ問題なく動作したら、実際のアクティベーションキーを購入します。
https://www.suse.com/shop/
2 ソケット$349(Basic) から、スタンダードサポート、プレミアムサポート、1年、3年の選択があります。(2013/8現在)

YaST の カスタマーセンターに登録し、パッチのダウンロードを行います。
SUSE Linux のカスタマー登録とパッチのダウンロード

islandcenter.jp


-Keyword-

SUSE Linux Enterprise Server SLES 11 SLES11sp3 Download 評価版 ダウンロード Novell アカウント 作成 ログイン
[PR]
by islandcenter | 2013-08-28 10:24 | SUSE | Trackback | Comments(0)

Beta of SUSE Cloud 2.0 Launches

SUSE Cloud 2.0 bata がリリースされていました。

Beta of SUSE Cloud 2.0 Launches

SUSE Cloud は openstack の言わば「商用版」です。先進的なユーザさんならオープンソース版を使うところでしょうが、ドキュメントが揃っており、有償サポートも必要なプライベートクラウドを構築し、メンテナンスするには一つの選択肢です。
[PR]
by islandcenter | 2013-08-25 11:14 | プライベートクラウド | Trackback | Comments(0)

Windows 8 のリアルタイムクロック(RTC)は CPU のクロックに影響するそうで、ほとんどあらゆるベンチマークソフトウェアの評価がおかしな値になってしまうそうです。

Windows 8はCPUクロック変更でリアルタイムクロックも変動、ベンチマーク結果にも影響

ストップウォッチが5分経過した時点でPCの時計は4分42秒しか経過しておらず、18秒もの遅れが発生しています。


これで問題になりそうなのは Hyper-V で仮想化した場合の仮想マシンの時刻同期です。5分で18秒も狂うのは「狂っている」としか言いようがありません。もっともオーバークロックした場合の結果なので、影響は少なそうですが、やはりハードウェアの持つRTCの精度は信頼できないなぁ、というのが感想です。かといって Windows の w32tm は信頼できないし。
[PR]
by islandcenter | 2013-08-22 13:40 | Windows | Trackback | Comments(0)

仮想環境のシンクライアントでWindows のVMにディスクを増設する手順です。

※ ここでは仮想VM の「新規作成」を使った方法で説明しています。実際には virt-manager > vm list > Deteail から追加することもできますが、まれに /etc/xen/vm ファイルを書き換えないことがあるため、新規作成メニューから実施しています。

ディスクの追加は

a) 一つの仮想ディスクイメージを複数のパーティションに分ける
b) ドライブレター毎に仮想ディスクイメージを作成する

の二つの方法がありますが、運用上 b) のドライブレターごとに仮想イメージを作る方法をお勧めします。

理由はさまざまですが、
- 仮想ディスクイメージの拡張ができる。
- ドライブレターごとにバックアップや他の仮想マシンへの付け替えができる

などの理由です。例えば読み出しが多いD:の内容な高速なSSDやSASドライブに作り、ログのような書き込み量が大きなドライブはNASに配置する、などの応用が利きます。

手順です。

ここでは myvpc001 という仮想インスタンスを増設するものとして説明します。

0) まず仮想マシンをシャットダウンしてください。

> コマンドプロンプトから shutdown /s /t 0

あるいは
ホストから # xm shutdown myvpc001
を実行して、仮想マシンをシャットダウンします。

xm list でシャットダウンしていることを確認します。


1) 現仮想マシンのイメージのコピー(バックアップ)

一応、変更を加える前にバックアップコピーをとります。

テキストコンソールから

# cd /etc/xen/vm
# cp myvpc001 myvpc001.YYMMDD (起動ファイルのバックアップ)

# grep vif myvpc001

vif の mac アドレスがあるのでメモしておきます。

あるいは cat myvpc001 で全体を表示して確認します。

# cd /var/lib/xen/images/myvpc001
# cp myvpc001.dosk0.raw myvpc001.disk0.raw.yymmdd -i &

この作業は丸ごとコピーなので時間がかかります。 '-i &' を付けてバックグラ
ウンドタスクにすると良いでしょう。

# ls -l コピー中のファイルサイズを確認

コピーが終わると [done] と表示されます。

ls -l でサイズを確認してください。



2) 仮想マシンの削除

xming を起動し yast2 & を起動します。 > Virtual Machine Manager > not connected 行 > 右ボタン > Connect

変更したい仮想マシンの行を選んで右ボタン> Delete > Yes

(イメージは削除されません、削除するオプションチェックボックスは「※必ず空欄※」でチェックされていないことを確認してください)

3) 仮想マシンの仮想HDDの増設

Virt-Manager より 'New' 仮想マシンの作成 > Forword

二行目

"I have a disk image with an installed operating system" を選択]
a0056607_12302517.jpg

> forword

Operating System > Windows Vista/7 を選択

サマリ(Summary)の画面から

- Name of Virtual Machine を windowsvista -> myvpc001 に設定
- Hardware > 仮想CPUとメモリの値を設定

(バックアップした vm ファイルで確認してください)

- Disk - none から

 > H_ard Disk ボタン > Browse > /var/lib/xen/images/myvpc001.disk0.raw
を選択
a0056607_12362857.jpg

> 追加ディスクは H_ard Disk ボタン

 一番上の Name フィールドに任意で仮想HDDイメージ名をセット

ex) myvpc001.drive-d.raw などの判りやすい名前をお勧めします。

※ ディスク増設の場合はわかりやすい命名規則を作ったほうが良いでしょう。 vpc001.driveD.raw とか vpc0xx.DataBase.raw とかです。

a0056607_120813.jpg


> Open ボタン

 サイズを確認します。デフォルトは4Gバイトなので、必要に応じて 12G な
どに変更します。
a0056607_1245510.jpg


> OK  > Apply ボタン

※ヒント 仮想ディスクイメージを2台以上増設する場合、サイズをわずかばかり変えておくと、サイズでどのイメージファイルが使われているかが判りやすいのでお勧めします。

これを増やしたいディスク数の回数分繰り返します。

3) Mac アドレスを設定

1) でメモした Mac アドレスを Network Adapter のところで設定します。

重要: Mac アドレスと NIC の種類を前回起動したマシンと同じものに設定してください。変更すると Windows が NIC を交換したものと判断し、新しいデバイスドライバをインストールしてしまいます。

既に Windows 用仮想マシンドライバー(Novell VMDP) が導入されている場合は"準仮想化(Paravirtual)" ドライバを選択し、同じ MAC アドレスを与えます。
a0056607_12412230.jpg


その場合は ネットワークのプロパティからネットワークのチューニングをやり直す必要があります。
Windows7 デフォルトでは使ってはいけない機能


4) 以上を確認して OK ボタンで仮想マシンを起動します。

仮想マシンに接続してログインします。エクスプローラの「コンピューター」
右ボタン>「管理」>「記憶域」>ディスクの管理
a0056607_12143696.jpg

でウィザードが起動します。


未割り当ての"Disk1" を右ボタンから"シンプルボリューム"ウィザードに従ってドライブレターをD:や E:などに割り当て、「フォーマット」します。
a0056607_12173265.jpg


5) 仮想ディスクが増設されていることを確認

cat か grep コマンドを使って /etc/xen/vm/myvpc001 の disk 行にディスクイメージファイルが追加されていることを確認します。次の例では myvpc001 という仮想マシンに drive-d というイメージが
/ssd/myvpc001 に作成された状態です。

sles11: /etc/xen/vm # grep disk myvpc001
disk=[ 'file:/ssd/myvpc001/myvpc001.disk0.raw,hda,w',
'file:/ssd/myvpc001/myvpc001.drive-d.disk1.raw,hdb,w', ]
sles11:/etc/xen/vm #

6) /etc/xen/auto を確認
/etc/xen/auto を ls -l で確認し
シンボリックリンクが -> ../vm/myvpc001 にリンクされていることを確認します。
ない場合は

sles11:/etc/xen/auto # ln -s svpc001 ../vm/myvpc001

で追加します。


sles11:/etc/xen/auto # ls -l
total 0
lrwxrwxrwx 1 root root 10 Jun 23 2012 s01nds2 -> ../vm/dns2
lrwxrwxrwx 1 root root 13 May 10 16:52 s04oes11x3 -> ../vm/oes11x3
lrwxrwxrwx 1 root root 13 Jul 6 2012 s05oes11x1 -> ../vm/oes11x1
lrwxrwxrwx 1 root root 12 Aug 5 2012 s07myvpc001 -> ../vm/myvpc001
lrwxrwxrwx 1 root root 11 Jul 18 22:19 s08vpc002 -> ../vm/vpc002
sles11:/etc/xen/auto #


なお、単純にC:ドライブの容量を増やしたい、などの場合は次の例を参考にしてください。
XEN 仮想マシンのディスクを増やす方法 Windows 7 編


islandcenter.jp

-Key Word-

SUSE Linux XEN VMDP How to add Diskdrive Virtual Machine VM
仮想マシンのハードディスクの増設
[PR]
by islandcenter | 2013-08-22 12:57 | XEN | Trackback | Comments(0)

パスワードの脆弱性をチェックするツールをご紹介します。

一番、翼使われるのは John the ripper のようです。
SUSE Linux Enterprise には標準で導入されないため、openSUSE のリポジトリを使って導入することができます。
software.opensuse.org のサイトから Search > "John" で 1Click インストールできますので、これで、SLES11 関連のセキュリティ関連へのレポジトリも自動作成されます。

http://software.opensuse.org/package/john

a0056607_16264816.jpg


ここでは John the ripper の使い方は説明しません。いろいろ解説した記事があるので探してみてください。ここではあくまでも SUSE(SLES) 用にレポジトリを追加するために 1 Click インストールしただけです。

YaST > Software > Software Repositories で Security というレポジトリが追加されています。
a0056607_1946447.jpg


リポジトリが追加されたら nkmkpasswd と cracklib-check を YaST > Software > Software Management より Search してインストールします。

※ 2013/8/20 なぜか nkmkpasswd はリポジトリから削除されたようです。

a0056607_16294095.jpg


SLES11 では nkmkpasswd を使います。openSUSE では makepasswd が標準でインストールされるようです。


-makepasswordとnkmkpasswd-


このツールはランダムな文字列を提示して「こんなパスワードどうですか」と提案します。

- nkmkpasswd

デフォルトでは Very Hard(vhard) な 10 文字のランダムな文字列が作成されます。


sles11:~ # nkmkpasswd --help
nkmkpass v0.0.2 - Copyright (c) 2008, Nigel Kukard

Usage: /usr/bin/nkmkpasswd [args]
--strength= Strength of generated string (vhard)
--length= Length of generated string (10)
--type= Type of string to generate
--passphrase-words= Number of words to generate (4)
--passphrase-wordlen= Word length (3:5)


まずはデフォルトで


sles11:~ # nkmkpasswd
nkmkpass v0.0.2 - Copyright (c) 2008, Nigel Kukard

Result: fnaJv(]B(P

かなり厳しそうです。


簡単な8文字のパスワード


sles11:~ nkmkpasswd --strength easy --length 8
nkmkpass v0.0.2 - Copyright (c) 2008, Nigel Kukard

Result: 6tcg23qe
sles11:~

まぁ許せるかな。


やや難しい10文字のパスワード


sles11:~ # nkmkpasswd --strength hard --length 10
nkmkpass v0.0.2 - Copyright (c) 2008, Nigel Kukard

Result: CReSst5nDN
sles11:~ #

ISPなどの初期パスワードはこのくらいでしょうか。


- makepasswd

ちょっと使い方は面倒でした


sles11:~ # makepasswd --help
makepasswd: invalid option -- '-'
Usage: makepasswd [-ceilMmnps]
Usage: makepasswd -E [-ceilMmns]
-c String of allowed characters (A-Za-z0-9`~!@#$%^&*()-_=+)
-E Enumerate all possible values
-e Encryption algorithm (none,base64,blowfish,des,md5,sha1,sha256,shmd5)
-i Number of iterations in encryption algorithm
-l Password length
-M Maximum password length
-m Minimum password length
-n Number of passwords to generate
-p Password to use
-s Salt to use
sles11:~ # makepasswd -c A-Z
-ZA----   <--- A-Z を指定したら本当に A-Z だけのパスワードを提案した。
sles11:~ # makepasswd -c abcdefghijknlmopqrstuvwxyz0123456789
xf7mk3d <--- こちらの方が良さそう。
sles11:~ #


-cracklib-check によるパスワード強度のチェック-

利用するパスワードには脆弱性があるのかないのかをチェックするツールです。

sles11:~ # cracklib-check
qwerty
qwerty: it is based on a dictionary word <-- 辞書にある単語
12345678
12345678: it is too simplistic/systematic <--- システマチック過ぎる
123:456
123:456: it is based on a dictionary word <-- これも辞書にある
9*9-1=80
9*9-1=80: OK <--- 数式を入れてみました。
password
password: it is based on a dictionary word <-- 一番良くあるパスワード
test
test: it is too short <--- テストじゃ短すぎ
10+22=32
10+22=32: OK <--- またまた数式
jackjohn
jackjohn: OK <-- よくある名前の組み合わせ、以外と通った。
joker
joker: it is too short
toyota
toyota: it does not contain enough DIFFERENT characters <--- t と o が被っているということでしょう。
japan
japan: it is too short
japanese
japanese: it is based on a dictionary word <--- 辞書にある単語
newyork
newyork: it is based on a dictionary word <--- 街の名前は駄目
NewyOrk
NewyOrk: it is based on a dictionary word <-- 一文字を大文字にしても駄目
london1st
london1st: it is based on a dictionary word <--- やっぱり駄目
paris&london
paris&london: OK <---- 町の名前を&で組み合わせは良さそう
^C <---- ^C で終了
sles11:~ #

あくまでも目安である事は心して置いてください。 london&paris を使っているユーザが tokyo&osaka を使うだろうという「予測」も出来上がるわけで、そうなるとパスワードリストを更新して辞書更新されてしまうということです。

昨今、パスワード使いまわしによるハッキング被害が増えています。どうせ覚えきれないアカウントとパスワードを記憶だけで管理することを「パスワード根性論」と私は思っています。古い UNIX システムや、メインフレームだとはじめの8文字しかチェックしないので、パスワードは6文字から8文字程度がよい、と思っていましたがいまはその考えも古そうですね。


islandcenter.jp



国内導入実績No.1*セキュアでインテリジェントな統合アイデンティティ管理ソリューション

-keyword-
SUSE SLES opensuse パスワード 提案 脆弱性チェック
[PR]
by islandcenter | 2013-08-19 16:40 | SUSE | Trackback | Comments(0)

お遊びです。

またまた Windows 8 は 32bit か64bit か

という無責任記事がまだ人気があるらしく、ずいぶんご覧頂いています。ありがとうございます。

じゃぁ、本当に 32 ビットと 64 ビットとのコードの大きさとか性能差ってあるのか。
実際に試してみました。と言っても、Windows には標準でコンパイラが付いていないので、 SUSE Linux の x64 版でのプログラムコードの違いを見てみました。

-テストコード-

/* test.c*/
int x=5;
int y=9;
int z=0;
int main()
{
z=x*y;
}


これみて、「なんで変数がグローバルなのよ、馬鹿じゃないの」と思われた方。鋭いですね。しかし内部変数だと、スタックポインタからの相対値なので、32ビットコードも64ビットコードも命令には変わりなくて、面白みがありませんでした。実際にオペランドアドレスがどうなるのか、と考えてみたら、グローバル変数を使ってみると、ずばりでした。20年ぶりのC言語なので大目に見てください。ご批判もあるでしょうね。

このコードを64ビットネイティブでコンパイルした結果と、32ビットオプションでコンパイルしてできたバイナリのサイズは次の通りでした。

ls -l test64 test32
-rwxr-xr-x 1 me users 9773 Aug 28 18:54 test32
-rwxr-xr-x 1 me users 11852 Aug 28 18:54 test64

こんな簡単なソースコードでも、実際コンパイルしてみると1~2割程度、64ビットコードの方が大きくなったようです。main() の処理より前後に付いているOS用のコードの大きさが実バイナリのサイズの差にあるようです。ただしその周囲のバイナリを見ても64ビットのオペランド処理はほとんどやっていないようです。ただし、x86 なら1バイトの命令でも rXX の64ビットレジスタ同士の演算はプリフィックスが付いた3バイト命令がありました。全体的にはコード自体は32ビットコードの方が複雑でも、1命令自体が1バイトだったりしています。


-32ビットコンパイルと逆アセンブル-
cc -m32 -o test32 test.c
objdump -d test32 > test32.asm

-m32 オプションを付けると32ビットコードを出してくれます。これを objdump -d オプションでダンプすると、逆アセンブルしてくれます。

※ SUSEでは yast > Software Management > から gcc の32ビット環境をインストールします。

main 関数の部分だけ抜き出して見ました。


080483e4 (main):
80483e4: 8d 4c 24 04 lea 0x4(%esp),%ecx
80483e8: 83 e4 f0 and $0xfffffff0,%esp
80483eb: ff 71 fc pushl -0x4(%ecx)
80483ee: 55 push %ebp
80483ef: 89 e5 mov %esp,%ebp
80483f1: 51 push %ecx
80483f2: 83 ec 04 sub $0x4,%esp
80483f5: a1 1c a0 04 08 mov 0x804a01c,%eax
80483fa: 8b 15 10 a0 04 08 mov 0x804a010,%edx
8048400: 0f af c2 imul %edx,%eax
8048403: a3 20 a0 04 08 mov %eax,0x804a020
8048408: 83 c4 04 add $0x4,%esp
804840b: 59 pop %ecx
804840c: 5d pop %ebp
804840d: 8d 61 fc lea -0x4(%ecx),%esp
8048410: c3 ret


20年ぶりに見るi386 アセンブラのコードです。そうだ、C3って ret 命令だったなぁと、割り込みと分岐命令「命」で調べていた、デバッカ開発のプログラマ時代を今更思い出します。この後は 90 (nop) 命令で埋まっています。(おいおい、これじゃ初期のインベーダーゲームと同じだぞ)、nop 命令もしっかりキャッシュされるわけですね。本当は掛け算の命令って何だっけと思って調べてみたのですが、 imul って便利な命令があるんですね。掛け算って cx で loop させるんじゃないんだ。(それじゃ80年代の情報処理試験とおんなじだ)そういえば DEV って便利な命令も 8086 時代に見たことあるしなぁ。8x で始まるのは確かに MOV 直値の命令だったし、 eAX は32ビットのアキュムレータレジスタです。グローバル変数の絶対アドレスを eAX にロードして imul 掛け算しています。

記憶と違って、逆アセンブルしてみると当時全盛だった MASM と違ってニモニックのオペランドの右辺と左辺が違うので、最初戸惑いました。

-64ビットコンパイルと逆アセンブル-

普通に「初めてのC」でやったようなコンパイルです。cc コマンドはオプションなしだと、今動いているプラットフォーム用(64ビット)のコードを吐き出します。


cc -o test64 test.c
objdump -d test64 > test64.asm



00000000004004ec (main):
4004ec: 55 push %rbp
4004ed: 48 89 e5 mov %rsp,%rbp
4004f0: 8b 05 3a 0b 20 00 mov 0x200b3a(%rip),%eax # 601030 (x)
4004f6: 8b 15 1c 0b 20 00 mov 0x200b1c(%rip),%edx # 601018 (y)
4004fc: 0f af c2 imul %edx,%eax
4004ff: 89 05 2f 0b 20 00 mov %eax,0x200b2f(%rip) # 601034 (z)
400505: c9 leaveq
400506: c3 retq



随分すっきりしています。大昔の x86 系のアセンブラより便利な命令が増えたということですね。

しかし、グローバル変数をアキュムレータにロードする場合は eAX を使っています。64ビット命令なら rAX レジスタの表記になります。

何のことはありません。 int x=n ; と書いた時点で、この変数は32ビット変数なのですね。 dword とかの宣言をするとまた変わるのでしょう。rIP 64ビットレジスタからの相対的な32ビット値のオペランドからデータをロードしています。この辺のコードの大きさはデータが32ビットなのであまり変わらないようです。いきなり関数の先頭で rBP のベ64ビットペースレジスタの値を push しています。

ただし便利な命令が増えたせいか、バイナリコードはやけにすっきりしています。

ただ、i486 止まりだった記憶と違ってチラ見した最新の Intel のマニュアルによると、i386 とは違い、x64 では通常の AX,BXや SP,IP ... 以外に r00 - r15 のRISCや 68000 系を思い出す汎用の64 ビットレジスタが16本あるようで(正確には8本でした)、ハードウェアからの割り込みによるスタックの退避などでは、通常の制御レジスタ以外に当然これらの16本の汎用レジスタの Push 操作も行われるのでしょう。プログラマはコードしか見ませんが、ハードウェア的にはシンプルな1命令であっても莫大なメモリアクセスを行います。タスクチェンジなどを行うとページ管理テーブルやディスクリプタ管理テーブル(セグメントテーブル)の膨大な書き換えもあります。おそらく c3 (return) 命令だけでもセグメント切り替えだとか、その前の c9 (leaveq)なんかは全部のレジスタのスタックからの復帰を行うので、大量のメモリアクセスが発生します。デバックに明け暮れた頃、ステップ実行で pop BP して c6 ret するとほっとしたものですが、この命令一発でスタックに積んだキャッシュがモノをいう時ですね。

※ C6 命令はショートジャンプなので、セグメントの切り替えは起こりませんね。間違えです。 jmpf 命令(確か EAh だったはず)

まぁ推測ですけど、32ビットのコードは効率は悪そうですけど、使うレジスタの本数が少ないので激しい割り込みが多いマルチタスク環境でもそこそこ性能は出そうだし、逆に64ビットのコードは、バイナリはそれほど使わなくても実際の動作には随分負担が重そうな感じがします。そもそも32ビットコードでは汎用のr00-r15なんて「何者だ?」の世界だからおそらく無視するでしょう。

コードは1クロック1命令ではありません。 90 nop は 1 clock で実行したような気がしますが、その他の「便利で複雑な命令」は数クロックから数十クロック実行時間がかかります。その辺りは Intel さんのマニュアルにもあるでしょう。

汎用レジスタが多いので、おそらく「素数計算」だとか、浮動小数点演算なんかやらせると、コンパイラの出来次第もありますが絶対64ビットのコードの方が早そうです。

夏休みの終わりに宿題を大急ぎで終えた気分です。Linux のソースより、バイナリから逆アセンブルした結果を調べるという実にひどい悪趣味に最後までお付き合いいただきありがとうございます。

インテルのマニュアルセット

x64のレジスタ拡張 ITmedia
[PR]
by islandcenter | 2013-08-07 11:00 | Trackback | Comments(0)