SlideShare a Scribd company logo
1 of 10
Download to read offline
- カーネル/VM night! -
x86 CPUにejectコマンドを
組み込みたい!
@furandon_pig
自己紹介
Twitter ID: @furandon_pig
日々NetBSDを使っています。
今年は参加した勉強会で必ず一回は「NetBSD」と発する所存で
す。
(前の発表で)Go言語に関する話があったので...
今年のプリキュアはは「Go!プリンセスプリキュア」
マーケティング的(?)にGo言語の当たり年、のはず!
今日の話題
ejectコマンド。
ほぼタイトルで出オチ。
NetBSDでは以下のコマンドでCD-ROMドライブをejectできる。
$ sudo eject /dev/cd0a
これをx86に組み込むまでの(不毛な)戦い。
x86にejectコマンドを組み込む
「お前は何を言っているんだ」状態(画像略)。
CPUそのものではなく、qemuに組み込んでみる。
どの命令にejectコマンドを組み込む?
push命令が良さそう?
"eject"と命令数が同じ。
(length "eject")
5
(length "pusha")
5
libopcodesの"pusha"を"eject"に置き換えるとas,objdumpで"eject"
が指定/表示できそう。
$ hexdump -C /usr/lib/libopcodes.so.5.0 | grep pusha
00014b90 6f 76 7a 78 00 70 75 73 68 00 70 75 73 68 61 00 |ovzx.push.pusha.|
00017c10 70 75 73 68 50 00 70 6f 70 50 00 70 75 73 68 61 |pushP.popP.pusha|
が...(pushaの置き換えでは)ダメっ...!
$ objdump -d /netbsd
c010c758 <i8259_stubs>:
c010c758: 40 inc %eax
...
c010c7a8: 60 pusha
c010c7a9: 1f pop %ds
c010c7aa: 10 c0 adc %al,%al
c010c7ac: 60 pusha
上手いこと他とぶつからない命令にしないと...。
CPUID命令(eject用)(1/2)
cpuid命令にejectを組み込むのが良さそう。
diff -ur qemu-2.1.3.orig/target-i386/cpu.c qemu-2.1.3/target-i386/cpu.c
--- qemu-2.1.3.orig/target-i386/cpu.c 2015-01-23 01:19:06.000000000 +0900
+++ qemu-2.1.3/target-i386/cpu.c 2015-02-14 18:17:34.000000000 +0900
@@ -2192,7 +2192,7 @@
}
}
} else {
- if (index > env->cpuid_level)
+ if (index > env->cpuid_level && index != 0x25252)
index = env->cpuid_level;
}
@@ -2375,6 +2375,9 @@
}
break;
}
+ case 0x25252:
+ system("eject /dev/cd0a");
+ break;
case 0x80000000:
*eax = env->cpuid_xlevel;
*ebx = env->cpuid_vendor1;
CPUID命令(eject用)(2/2)
EAXレジスタのパラメータに0x25252を指定することでejectを実
行する。
# gcc -nostdlib -g -o eject_instruction eject_instruction.s
.section ".note.netbsd.ident", "a"
.int 7
.int 4
.int 0x01
.ascii "NetBSD00"
.int 0x23b419a0
.section ".text"
.balign 4
.globl _start
.type _start, @function
_start:
# execute eject command.
movl $0x25252, %eax
cpuid
# exit(EXIT_SUCCESS)
movl $0x0, (%esp)
movl $0x1, %eax
int $0x80
ret
CPUID命令でejectを実行してみる
仮想マシンを実行する(rootで実行する)
$ sudo ./i386-softmmu/qemu-system-i386 -hdd ../vnmnbsd/nbsd.vdi
ゲストOSから以下を実行する
cpuid命令を実行した時にCD-ROMがejectされる
$ gcc -nostdlib -g -o eject_instruction eject_instruction.s
$ gdb eject_instruction
...
(gdb) break _start
(gdb) run
...
Breakpoint 1, _start () at eject_instruction.s:16
16 movl $0x2525x, %eax
(gdb) stepi
17 cpuid
(gdb) stepi
まとめ
x86にejectコマンドを組み込む話。
CPUID命令にからめてejectを実行してみた。
(今年はGo言語の当たり年(のはず))

More Related Content

What's hot

Eucalyptus on OpenStack
Eucalyptus on OpenStackEucalyptus on OpenStack
Eucalyptus on OpenStackirix_jp
 
BHyVeでOSvを起動したい
〜BIOSがなくてもこの先生きのこるには〜
BHyVeでOSvを起動したい
〜BIOSがなくてもこの先生きのこるには〜BHyVeでOSvを起動したい
〜BIOSがなくてもこの先生きのこるには〜
BHyVeでOSvを起動したい
〜BIOSがなくてもこの先生きのこるには〜Takuya ASADA
 
今時のLinuxにおけるGPUエンコード事情
今時のLinuxにおけるGPUエンコード事情今時のLinuxにおけるGPUエンコード事情
今時のLinuxにおけるGPUエンコード事情zgock
 
Xenとzfsで作る家庭内VDIサーバ
Xenとzfsで作る家庭内VDIサーバXenとzfsで作る家庭内VDIサーバ
Xenとzfsで作る家庭内VDIサーバzgock
 
XenServerとZFSストレージでサーバ仮想化 - OSC2011 Tokyo/Spring 自宅SAN友の会(後半)
XenServerとZFSストレージでサーバ仮想化 - OSC2011 Tokyo/Spring 自宅SAN友の会(後半)XenServerとZFSストレージでサーバ仮想化 - OSC2011 Tokyo/Spring 自宅SAN友の会(後半)
XenServerとZFSストレージでサーバ仮想化 - OSC2011 Tokyo/Spring 自宅SAN友の会(後半)tokuhy
 
BHyVe: The BSD Hypervisor
BHyVe: The BSD HypervisorBHyVe: The BSD Hypervisor
BHyVe: The BSD HypervisorTakuya ASADA
 
opencoconの作り方 (オープンソースカンファレンス2015 Tokyo/Spring 小江戸らぐセミナー)
opencoconの作り方 (オープンソースカンファレンス2015 Tokyo/Spring 小江戸らぐセミナー)opencoconの作り方 (オープンソースカンファレンス2015 Tokyo/Spring 小江戸らぐセミナー)
opencoconの作り方 (オープンソースカンファレンス2015 Tokyo/Spring 小江戸らぐセミナー)shimadah
 
謎PCとの付き合い方(LILO東海道 2015/5発表分)
謎PCとの付き合い方(LILO東海道 2015/5発表分)謎PCとの付き合い方(LILO東海道 2015/5発表分)
謎PCとの付き合い方(LILO東海道 2015/5発表分)shimadah
 
Bhyve code reading
Bhyve code readingBhyve code reading
Bhyve code readingTakuya ASADA
 
今時のLinuxにおけるGPUエンコード事情2018
今時のLinuxにおけるGPUエンコード事情2018今時のLinuxにおけるGPUエンコード事情2018
今時のLinuxにおけるGPUエンコード事情2018zgock
 
NetBSD, On the ROAD 2016
NetBSD, On the ROAD 2016NetBSD, On the ROAD 2016
NetBSD, On the ROAD 2016Jun Ebihara
 
しつこくXenとzfsで作る家庭内vdiサーバ2015年版
しつこくXenとzfsで作る家庭内vdiサーバ2015年版しつこくXenとzfsで作る家庭内vdiサーバ2015年版
しつこくXenとzfsで作る家庭内vdiサーバ2015年版zgock
 
エンジニアのための痔の話
エンジニアのための痔の話エンジニアのための痔の話
エンジニアのための痔の話Kouhei Maeda
 
俺のGentooがこんなに可愛いわけがない
俺のGentooがこんなに可愛いわけがない俺のGentooがこんなに可愛いわけがない
俺のGentooがこんなに可愛いわけがないTakuto Matsuu
 
魁ここんとーく in おおさか
魁ここんとーく in おおさか魁ここんとーく in おおさか
魁ここんとーく in おおさかshimadah
 
NetwalkerとARM Linuxのカスタマイズ情報
NetwalkerとARM Linuxのカスタマイズ情報NetwalkerとARM Linuxのカスタマイズ情報
NetwalkerとARM Linuxのカスタマイズ情報Netwalker lab kapper
 

What's hot (20)

Eucalyptus on OpenStack
Eucalyptus on OpenStackEucalyptus on OpenStack
Eucalyptus on OpenStack
 
Cuis Smalltalkの紹介
Cuis Smalltalkの紹介Cuis Smalltalkの紹介
Cuis Smalltalkの紹介
 
Gentoo Linuxの紹介
Gentoo Linuxの紹介Gentoo Linuxの紹介
Gentoo Linuxの紹介
 
BHyVeでOSvを起動したい
〜BIOSがなくてもこの先生きのこるには〜
BHyVeでOSvを起動したい
〜BIOSがなくてもこの先生きのこるには〜BHyVeでOSvを起動したい
〜BIOSがなくてもこの先生きのこるには〜
BHyVeでOSvを起動したい
〜BIOSがなくてもこの先生きのこるには〜
 
Bhyve Internals
Bhyve InternalsBhyve Internals
Bhyve Internals
 
今時のLinuxにおけるGPUエンコード事情
今時のLinuxにおけるGPUエンコード事情今時のLinuxにおけるGPUエンコード事情
今時のLinuxにおけるGPUエンコード事情
 
Xenとzfsで作る家庭内VDIサーバ
Xenとzfsで作る家庭内VDIサーバXenとzfsで作る家庭内VDIサーバ
Xenとzfsで作る家庭内VDIサーバ
 
XenServerとZFSストレージでサーバ仮想化 - OSC2011 Tokyo/Spring 自宅SAN友の会(後半)
XenServerとZFSストレージでサーバ仮想化 - OSC2011 Tokyo/Spring 自宅SAN友の会(後半)XenServerとZFSストレージでサーバ仮想化 - OSC2011 Tokyo/Spring 自宅SAN友の会(後半)
XenServerとZFSストレージでサーバ仮想化 - OSC2011 Tokyo/Spring 自宅SAN友の会(後半)
 
BHyVe: The BSD Hypervisor
BHyVe: The BSD HypervisorBHyVe: The BSD Hypervisor
BHyVe: The BSD Hypervisor
 
opencoconの作り方 (オープンソースカンファレンス2015 Tokyo/Spring 小江戸らぐセミナー)
opencoconの作り方 (オープンソースカンファレンス2015 Tokyo/Spring 小江戸らぐセミナー)opencoconの作り方 (オープンソースカンファレンス2015 Tokyo/Spring 小江戸らぐセミナー)
opencoconの作り方 (オープンソースカンファレンス2015 Tokyo/Spring 小江戸らぐセミナー)
 
謎PCとの付き合い方(LILO東海道 2015/5発表分)
謎PCとの付き合い方(LILO東海道 2015/5発表分)謎PCとの付き合い方(LILO東海道 2015/5発表分)
謎PCとの付き合い方(LILO東海道 2015/5発表分)
 
Bhyve code reading
Bhyve code readingBhyve code reading
Bhyve code reading
 
今時のLinuxにおけるGPUエンコード事情2018
今時のLinuxにおけるGPUエンコード事情2018今時のLinuxにおけるGPUエンコード事情2018
今時のLinuxにおけるGPUエンコード事情2018
 
NetBSD, On the ROAD 2016
NetBSD, On the ROAD 2016NetBSD, On the ROAD 2016
NetBSD, On the ROAD 2016
 
しつこくXenとzfsで作る家庭内vdiサーバ2015年版
しつこくXenとzfsで作る家庭内vdiサーバ2015年版しつこくXenとzfsで作る家庭内vdiサーバ2015年版
しつこくXenとzfsで作る家庭内vdiサーバ2015年版
 
エンジニアのための痔の話
エンジニアのための痔の話エンジニアのための痔の話
エンジニアのための痔の話
 
俺のGentooがこんなに可愛いわけがない
俺のGentooがこんなに可愛いわけがない俺のGentooがこんなに可愛いわけがない
俺のGentooがこんなに可愛いわけがない
 
軽快なBHyVe
軽快なBHyVe軽快なBHyVe
軽快なBHyVe
 
魁ここんとーく in おおさか
魁ここんとーく in おおさか魁ここんとーく in おおさか
魁ここんとーく in おおさか
 
NetwalkerとARM Linuxのカスタマイズ情報
NetwalkerとARM Linuxのカスタマイズ情報NetwalkerとARM Linuxのカスタマイズ情報
NetwalkerとARM Linuxのカスタマイズ情報
 

Similar to x86 CPUにejectコマンドを組み込みたい!

NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成Izumi Tsutsui
 
Ss systemdのwslディストロを作る kernelvm探検隊online part 3
Ss systemdのwslディストロを作る kernelvm探検隊online part 3Ss systemdのwslディストロを作る kernelvm探検隊online part 3
Ss systemdのwslディストロを作る kernelvm探検隊online part 3Takaya Saeki
 
JTF2020 クロスコンパイルだけが能ではない組み込みLinuxシステムのCI/CDインフラ構築
JTF2020 クロスコンパイルだけが能ではない組み込みLinuxシステムのCI/CDインフラ構築JTF2020 クロスコンパイルだけが能ではない組み込みLinuxシステムのCI/CDインフラ構築
JTF2020 クロスコンパイルだけが能ではない組み込みLinuxシステムのCI/CDインフラ構築yaegashi
 
CEDEC2014 セッション資料「ヘキサドライブ流 OPTPiX SpriteStudio 最適化術!」
CEDEC2014 セッション資料「ヘキサドライブ流 OPTPiX SpriteStudio 最適化術!」CEDEC2014 セッション資料「ヘキサドライブ流 OPTPiX SpriteStudio 最適化術!」
CEDEC2014 セッション資料「ヘキサドライブ流 OPTPiX SpriteStudio 最適化術!」Web Technology Corp.
 
PFIセミナーH271022 ~コマンドを叩いて遊ぶ コンテナ仮想、その裏側~
PFIセミナーH271022 ~コマンドを叩いて遊ぶ コンテナ仮想、その裏側~PFIセミナーH271022 ~コマンドを叩いて遊ぶ コンテナ仮想、その裏側~
PFIセミナーH271022 ~コマンドを叩いて遊ぶ コンテナ仮想、その裏側~Preferred Networks
 
C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。
C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。
C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。hiyohiyo
 
Open-FCoE_osc2011tokyofall_20111119
Open-FCoE_osc2011tokyofall_20111119Open-FCoE_osc2011tokyofall_20111119
Open-FCoE_osc2011tokyofall_20111119metamd
 

Similar to x86 CPUにejectコマンドを組み込みたい! (9)

NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
 
No.2 超初心者向け セキュリティ入門
No.2 超初心者向け セキュリティ入門No.2 超初心者向け セキュリティ入門
No.2 超初心者向け セキュリティ入門
 
EE
EEEE
EE
 
Ss systemdのwslディストロを作る kernelvm探検隊online part 3
Ss systemdのwslディストロを作る kernelvm探検隊online part 3Ss systemdのwslディストロを作る kernelvm探検隊online part 3
Ss systemdのwslディストロを作る kernelvm探検隊online part 3
 
JTF2020 クロスコンパイルだけが能ではない組み込みLinuxシステムのCI/CDインフラ構築
JTF2020 クロスコンパイルだけが能ではない組み込みLinuxシステムのCI/CDインフラ構築JTF2020 クロスコンパイルだけが能ではない組み込みLinuxシステムのCI/CDインフラ構築
JTF2020 クロスコンパイルだけが能ではない組み込みLinuxシステムのCI/CDインフラ構築
 
CEDEC2014 セッション資料「ヘキサドライブ流 OPTPiX SpriteStudio 最適化術!」
CEDEC2014 セッション資料「ヘキサドライブ流 OPTPiX SpriteStudio 最適化術!」CEDEC2014 セッション資料「ヘキサドライブ流 OPTPiX SpriteStudio 最適化術!」
CEDEC2014 セッション資料「ヘキサドライブ流 OPTPiX SpriteStudio 最適化術!」
 
PFIセミナーH271022 ~コマンドを叩いて遊ぶ コンテナ仮想、その裏側~
PFIセミナーH271022 ~コマンドを叩いて遊ぶ コンテナ仮想、その裏側~PFIセミナーH271022 ~コマンドを叩いて遊ぶ コンテナ仮想、その裏側~
PFIセミナーH271022 ~コマンドを叩いて遊ぶ コンテナ仮想、その裏側~
 
C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。
C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。
C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。
 
Open-FCoE_osc2011tokyofall_20111119
Open-FCoE_osc2011tokyofall_20111119Open-FCoE_osc2011tokyofall_20111119
Open-FCoE_osc2011tokyofall_20111119
 

More from furandon_pig

CoderDojoの日常
CoderDojoの日常CoderDojoの日常
CoderDojoの日常furandon_pig
 
TDEで透過的暗号化
TDEで透過的暗号化TDEで透過的暗号化
TDEで透過的暗号化furandon_pig
 
ジャパリパークさいかいけーかく
ジャパリパークさいかいけーかくジャパリパークさいかいけーかく
ジャパリパークさいかいけーかくfurandon_pig
 
パケットジェネレータipgenから見るnetmap
パケットジェネレータipgenから見るnetmapパケットジェネレータipgenから見るnetmap
パケットジェネレータipgenから見るnetmapfurandon_pig
 
第6回 エンジニアのためのプレゼン技術研究会「今年の抱負」と「アンチプレゼンパターン」発表スライド
第6回 エンジニアのためのプレゼン技術研究会「今年の抱負」と「アンチプレゼンパターン」発表スライド第6回 エンジニアのためのプレゼン技術研究会「今年の抱負」と「アンチプレゼンパターン」発表スライド
第6回 エンジニアのためのプレゼン技術研究会「今年の抱負」と「アンチプレゼンパターン」発表スライドfurandon_pig
 
nginxに追加された新モジュール それがHTTP/2モジュールです
nginxに追加された新モジュール それがHTTP/2モジュールですnginxに追加された新モジュール それがHTTP/2モジュールです
nginxに追加された新モジュール それがHTTP/2モジュールですfurandon_pig
 
プレゼン用の図を自動生成する話
プレゼン用の図を自動生成する話プレゼン用の図を自動生成する話
プレゼン用の図を自動生成する話furandon_pig
 
こんてなぐらし!〜FreeBSD VPSでライブマイグレーション〜
こんてなぐらし!〜FreeBSD VPSでライブマイグレーション〜こんてなぐらし!〜FreeBSD VPSでライブマイグレーション〜
こんてなぐらし!〜FreeBSD VPSでライブマイグレーション〜furandon_pig
 
elasticsearchソースコードを読みはじめてみた
elasticsearchソースコードを読みはじめてみたelasticsearchソースコードを読みはじめてみた
elasticsearchソースコードを読みはじめてみたfurandon_pig
 

More from furandon_pig (9)

CoderDojoの日常
CoderDojoの日常CoderDojoの日常
CoderDojoの日常
 
TDEで透過的暗号化
TDEで透過的暗号化TDEで透過的暗号化
TDEで透過的暗号化
 
ジャパリパークさいかいけーかく
ジャパリパークさいかいけーかくジャパリパークさいかいけーかく
ジャパリパークさいかいけーかく
 
パケットジェネレータipgenから見るnetmap
パケットジェネレータipgenから見るnetmapパケットジェネレータipgenから見るnetmap
パケットジェネレータipgenから見るnetmap
 
第6回 エンジニアのためのプレゼン技術研究会「今年の抱負」と「アンチプレゼンパターン」発表スライド
第6回 エンジニアのためのプレゼン技術研究会「今年の抱負」と「アンチプレゼンパターン」発表スライド第6回 エンジニアのためのプレゼン技術研究会「今年の抱負」と「アンチプレゼンパターン」発表スライド
第6回 エンジニアのためのプレゼン技術研究会「今年の抱負」と「アンチプレゼンパターン」発表スライド
 
nginxに追加された新モジュール それがHTTP/2モジュールです
nginxに追加された新モジュール それがHTTP/2モジュールですnginxに追加された新モジュール それがHTTP/2モジュールです
nginxに追加された新モジュール それがHTTP/2モジュールです
 
プレゼン用の図を自動生成する話
プレゼン用の図を自動生成する話プレゼン用の図を自動生成する話
プレゼン用の図を自動生成する話
 
こんてなぐらし!〜FreeBSD VPSでライブマイグレーション〜
こんてなぐらし!〜FreeBSD VPSでライブマイグレーション〜こんてなぐらし!〜FreeBSD VPSでライブマイグレーション〜
こんてなぐらし!〜FreeBSD VPSでライブマイグレーション〜
 
elasticsearchソースコードを読みはじめてみた
elasticsearchソースコードを読みはじめてみたelasticsearchソースコードを読みはじめてみた
elasticsearchソースコードを読みはじめてみた
 

x86 CPUにejectコマンドを組み込みたい!