世間を騒がせているサイドチャネル攻撃Spectre/Meltdownのチェッカー(GitHubへのリンク)を実行してみました。
デスクトップマシンで実行してみます。OSはDebian GNU/Linux Testingです。
AMDなのでMeltdownは関係ないみたいです。
サーバーマシンでも実行してみます。OSはDebian GNU/Linux Stableですが、カーネルだけ最新のStableに入れ替えています。
Pentium J/Celeron Jシリーズは、以前Atomと呼ばれていた低消費電力のCPUコアです。Spectreの脆弱性があるということは、AtomくらいのCPUでも分岐予測をしているんですかね…。
Atomのマイクロアーキテクチャを調べてみるとBonnell(第一世代Atomのコア、2008年頃)から既に分岐予測はあって、Silvermont(第三世代Atomのコア、2013年頃)からはOut-of-Order実行だそうです。
購入以来(2014年6月26日の日記参照)我が家で活躍している、第一世代Chromecastですが、最近YouTubeの動画再生でカクつきが目立つようになってきました。
特にひどいのは再生開始直後で、画はガクガクで、音も途切れブツブツなっています。ネットワークのせいかもしれませんが、スマホで見ると別に問題ないですし、デコード性能不足もありそうです。
第二世代4K対応のChromecast Ultraが出て久しいですし、むしろ5,000円程度の機器が4年以上も頑張れることに、逆に驚きを感じます。
ピクセラの4K対応Android TV KSTB5043(メーカーのサイト)を買いました。Amazonで13,000円くらいです。
この製品はAmlogic S905というSoCを採用しているようです。CPUはCortex A53 x 4、メモリは2GBです。AmlogicのSoCはSTB(セットトップボックス)に良く採用されていますね。
Androidのバージョンは7.0(買った時点では)でした。STBはAndroid 6系の製品も多い中、7なんですね。まあ、7だと何が嬉しい?と言われると、特に思いつかないですけど…。
とても素直なAndroid TVという感触です。メニューは恐らく何も改造されていません。Androidのメーカー独自改造って何がどこにあるのかわからなくてあまり好きでは無いので、この点は好感触です。
GoogleストアやPlay(動画サービス)も、動きがスムーズです。ストアだけちょっとスクロールが引っかかりますが、特に支障はありません。
リモコンがBluetooth接続のため、赤外線のリモコンと異なり、本体に向けなくても操作可能です。お行儀は悪いですが布団を肩まで掛けて、手を布団の中に入れたまま、リモコンで操作できます。良い感じ。
リモコンを特定の方向に向ける必要が無いことも、操作すべきはテレビの下にあるSTBであってテレビは一切関係ないことも、頭ではわかっていますが、ついつい「テレビ」にリモコンを向けて操作してしまうのは、オールドタイプの悲しい性です……。
メディア再生機器としても優秀です。H.265/4K60pは余裕です。H.264/4K60pはデコード性能が足りず、スローになり音と同期がズレていきます。
あえて意地悪な動画を再生しましたが、H.264で4K60pは珍しい部類でしょう。もしお持ちの方はH.265に再エンコードした方が良いかもしれません。サイズも半分で済みますし。
まあ、我が家のテレビは4Kに対応していないので、4K動画の再生ができても映すテレビが無いんですけど…。
Chromecast built-inが搭載されていますが、スピナー(クルクルするアイコン)が出たまま固まってしまい、イマイチです。何度かやり直せば動くのですが、固まることも多いです。
最近、調子の悪い初代Google Chromecastを(2018年1月26日の日記参照)置き換えようと思っていたので、ちょっと残念ですね。
目次: Android
半年くらい前(2017年9月30日の日記参照)にCMAを調べたときはわからなかった問題が一つ解決しました。
悩みはこの3つで、1つ目はほぼ解決(THPを使わない)していて、2つ目は未だに良くわからないままです。今回は3つ目の問題が解消しました。
前回の調査では/proc/meminfoを調べていて、CmaFreeの項目がなかったため、誰もCMAを使っていないのではないかと思っていました。
MemTotal: 3687912 kB MemFree: 380032 kB MemAvailable: 1527068 kB Buffers: 51344 kB Cached: 1137352 kB SwapCached: 5848 kB Active: 1483616 kB Inactive: 784324 kB Active(anon): 897704 kB Inactive(anon): 203852 kB Active(file): 585912 kB Inactive(file): 580472 kB Unevictable: 3632 kB Mlocked: 3632 kB SwapTotal: 524284 kB SwapFree: 70164 kB Dirty: 0 kB Writeback: 0 kB AnonPages: 1080040 kB Mapped: 587568 kB Shmem: 22300 kB Slab: 210492 kB SReclaimable: 79676 kB SUnreclaim: 130816 kB KernelStack: 39184 kB PageTables: 43764 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 2368240 kB Committed_AS: 71185752 kB VmallocTotal: 258998208 kB VmallocUsed: 157168 kB VmallocChunk: 258691972 kB ★★CmaTotalやCmaFreeが無いのに…★★
ふと/proc/pagetypeinfoを見たところCMAの項目が出ました。meminfoには出ないのにpagetypeinfoには出てくるの??
Page block order: 10 Pages per block: 1024 Free pages count per migrate type at order 0 1 2 3 4 5 6 7 8 9 10 Node 0, zone DMA, type Unmovable 53146 18233 851 1 0 0 0 0 0 0 0 Node 0, zone DMA, type Reclaimable 1938 120 9 3 0 0 0 0 0 0 0 Node 0, zone DMA, type Movable 195 17 12 3 0 0 0 0 0 0 0 Node 0, zone DMA, type CMA 0 0 0 0 0 0 0 0 0 0 0 Node 0, zone DMA, type Reserve 0 1 16 0 0 0 0 0 0 0 0 Node 0, zone DMA, type Isolate 0 0 0 0 0 0 0 0 0 0 0 Number of blocks type Unmovable Reclaimable Movable CMA Reserve Isolate Node 0, zone DMA 539 35 298 51 2 0 ★★MIGRATE_CMAがカウントされている★★
他の機種を見てもmeminfoにはCMAの項目はなくpagetypeinfoにCMAの項目が出ていました。なぜmeminfoに表示されないのかわかりませんが、理由は後で考えるとして、一番下に出てくるNumber of blocksが知りたかった情報です。
行がZoneを表します。ZenFoneはZone DMAしかありません。機種によってはZone DMAとZone Normalの2本立てになっていることもあります。
列がMIGRATE_TYPEです。数値の単位はページでは無くブロックです。ブロックはpagetypeinfoの先頭に「Pages per block: 1024」とある通り、1ブロック=1024ページです。ARMは1ページ4KBなので1ブロックは4MBになります。1ブロックのページ数はカーネルコンフィグによって変わりますので、どの機種でも常に4MBではないことに注意です。
さてZenFone 3 Deluxe ZS550KLというかQualcomm Snapdragon 625のシステム構成という方が近いかもしれませんが…、Linuxが管理している全体のブロック数は925ブロック(3788800KB)で、CMAは51ブロック(208896KB)のようです。
物理的に搭載されているRAMが4GBらしいのでLinuxの管理外となっている領域は、4194304 - 3788800 = 405504KBだと思われます。かなり大きいです。もしかするとデコード/エンコード用の領域はこちらから取っているのかもしれません。
またmeminfoによればMemTotalが3687912KBですので、Linux管理内だけど使うことができないReserved領域は、3788800 - 3687912 = 100888KBだと思われます。内訳はわかりませんが、多くも少なくもないと思います。たぶん。
1. 物理搭載メモリ | 4194304KB |
---|---|
2. Linux管理内 | 3788800KB |
3. Linux管理外(1. - 2.) | 405504KB |
4. MemTotal | 3687912KB |
5. Reserved領域(2. - 4.) | 100888KB |
私の推測としてはCMA領域(204MB)では4K動画をデコード/エンコードするには足りなさそうなので、Linux管理外の領域を使っているんだろうなーと思います。
どうしてpagetypeinfoにはCMAの項目があって、meminfoにはCMAの項目がないのか?カーネルのコードを見る限りCONFIG_CMAが有効になっていたら必ずmeminfoに項目が出るはずなのに、出てこない理由が良くわかりません。
手持ちのAndroid機器を見ていたら、カーネルバージョンがやたら古いことに気づきました。Android機器ってほとんどLinux 3.18とか3.10とか…、とかく3.x系のバージョンが多くないですか?
ああ、これまさか、古いバージョンのカーネルだとmeminfoにCMAの項目が出ないのか??と思って、3.x系のカーネルのコードを見ると、meminfoにCMAが表示されるようになったのが3.19以降であることがわかりました。
道理でmeminfoにCMAの項目が出ない訳ですよ。こんな単純なことに気づかなかったとは……orz
目次: Android
新旧混ざっていますが、家にあるAndroidデバイスのメモリの使い方を見てみました。ADBが繋がると楽で良いですね。Linuxの管理外領域、Reserved領域など、各社の特徴があって面白いです。
1つ目は、第一世代Kindle fire HD 8.9(Linux 3.0.21-04374-gb4bbee6, Android 4.0.4ベース)です。SoCはTI OMAP4470で、RAMは恐らく1GBでしょう。工場出荷状態にしているので、OSのバージョンが古いかもしれません。
MemTotal: 786084 kB MemFree: 29360 kB Buffers: 8268 kB Cached: 287052 kB SwapCached: 0 kB Active: 319148 kB Inactive: 231740 kB Active(anon): 255844 kB Inactive(anon): 260 kB Active(file): 63304 kB Inactive(file): 231480 kB Unevictable: 240 kB Mlocked: 0 kB HighTotal: 153600 kB HighFree: 5376 kB LowTotal: 632484 kB LowFree: 23984 kB SwapTotal: 0 kB SwapFree: 0 kB Dirty: 0 kB Writeback: 0 kB AnonPages: 255824 kB Mapped: 238188 kB Shmem: 296 kB Slab: 15476 kB SReclaimable: 6888 kB SUnreclaim: 8588 kB KernelStack: 6688 kB PageTables: 18828 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 393040 kB Committed_AS: 7951964 kB VmallocTotal: 253952 kB VmallocUsed: 98000 kB VmallocChunk: 98244 kB
Page block order: 10 Pages per block: 1024 Free pages count per migrate type at order 0 1 2 3 4 5 6 7 8 9 10 Node 0, zone Normal, type Unmovable 4 12 10 9 4 2 5 2 1 0 0 Node 0, zone Normal, type Reclaimable 49 43 4 3 2 2 2 0 0 0 0 Node 0, zone Normal, type Movable 86 714 216 52 8 2 0 0 2 0 0 Node 0, zone Normal, type Reserve 0 0 0 0 0 0 0 0 0 0 1 Node 0, zone Normal, type Isolate 0 0 0 0 0 0 0 0 0 0 0 Node 0, zone HighMem, type Unmovable 28 27 20 19 8 5 3 0 0 0 0 Node 0, zone HighMem, type Reclaimable 0 0 0 0 0 0 0 0 0 0 0 Node 0, zone HighMem, type Movable 11 5 1 2 2 5 5 0 0 0 0 Node 0, zone HighMem, type Reserve 0 0 0 0 0 1 0 0 0 0 0 Node 0, zone HighMem, type Isolate 0 0 0 0 0 0 0 0 0 0 0 Number of blocks type Unmovable Reclaimable Movable Reserve Isolate Node 0, zone Normal 38 2 118 1 0 Node 0, zone HighMem 8 0 29 1 0
40122000-401220ff : mpu 40124000-401240ff : mpu 40126000-401260ff : mpu 40138000-4013807f : omap_timer.5 40138000-4013807f : omap_timer 4013a000-4013a07f : omap_timer.6 4013a000-4013a07f : omap_timer 4013c000-4013c07f : omap_timer.7 4013c000-4013c07f : omap_timer 4013e000-4013e07f : omap_timer.8 4013e000-4013e07f : omap_timer 40180000-4018ffff : dmem 401a0000-401a1fff : cmem 401c0000-401c5fff : smem 401e0000-401e1fff : pmem 401f1000-401f13ff : mpu 44000000-44000fff : l3_main_1.0 44000000-44000fff : omap_l3_noc.0 44800000-44801fff : omap_l3_noc.0 45000000-45000fff : omap_l3_noc.0 48020000-480200ff : omap_uart.2 48020000-480200ff : omap_uart 48032000-4803207f : omap_timer.2 48032000-4803207f : omap_timer 48034000-4803407f : omap_timer.3 48034000-4803407f : omap_timer 48036000-4803607f : omap_timer.4 48036000-4803607f : omap_timer 4803e000-4803e07f : omap_timer.9 4803e000-4803e07f : omap_timer 48040000-4804007f : omapdss_dss 48041000-48041fff : omapdss_dispc 48042000-480420ff : omapdss_rfbi 48043000-480430ff : omapdss_venc 48044000-480441ff : omapdss_dsi1 48045000-480451ff : omapdss_dsi2 48046000-48046fff : omap-hdmi-codec 48046000-48046fff : hdmi-audio-dai 48046000-48046fff : omapdss_hdmi 48055000-480551ff : omap_gpio.1 48057000-480571ff : omap_gpio.2 48059000-480591ff : omap_gpio.3 4805b000-4805b1ff : omap_gpio.4 4805d000-4805d1ff : omap_gpio.5 48060000-480600ff : omap_i2c.3 48060000-480600ff : omap_i2c 4806a000-4806a0ff : omap_uart.0 4806a000-4806a0ff : omap_uart 4806c000-4806c0ff : omap_uart.1 4806c000-4806c0ff : omap_uart 4806e000-4806e0ff : omap_uart.3 4806e000-4806e0ff : omap_uart 48070000-480700ff : omap_i2c.1 48070000-480700ff : omap_i2c 48072000-480720ff : omap_i2c.2 48072000-480720ff : omap_i2c 48086000-4808607f : omap_timer.10 48086000-4808607f : omap_timer 48088000-4808807f : omap_timer.11 48088000-4808807f : omap_timer 48096000-480960ff : omap-mcbsp.4 48098100-480982ff : omap2_mcspi.1 48098000-480981ff : omap2_mcspi.1 4809a100-4809a2ff : omap2_mcspi.2 4809a000-4809a1ff : omap2_mcspi.2 480b4100-480b44ff : omap_hsmmc.1 480b4100-480b44ff : omap_hsmmc 480b8100-480b82ff : omap2_mcspi.3 480b8000-480b81ff : omap2_mcspi.3 480ba100-480ba2ff : omap2_mcspi.4 480ba000-480ba1ff : omap2_mcspi.4 480d5100-480d54ff : omap_hsmmc.4 480d5100-480d54ff : omap_hsmmc 48350000-483500ff : omap_i2c.4 48350000-483500ff : omap_i2c 49022000-490220ff : dma 49024000-490240ff : dma 49026000-490260ff : dma 49038000-4903807f : omap_timer.5 4903a000-4903a07f : omap_timer.6 4903c000-4903c07f : omap_timer.7 4903e000-4903e07f : omap_timer.8 49080000-4908ffff : dmem_dma 490a0000-490a1fff : cmem_dma 490c0000-490c5fff : smem_dma 490e0000-490e1fff : pmem_dma 490f1000-490f13ff : dma 4a002378-4a0023ff : case_temp_sensor.0 4a002378-4a0023ff : omap_temp_sensor.0 4a056000-4a056fff : omap_dma_system.0 4a066000-4a0660ff : omap-iommu.1 4a066000-4a0660ff : dsp.0 4a0ab000-4a0ab003 : musb-omap2430 4a0ab000-4a0ab003 : musb-omap2430 4a0d9000-4a0d903f : smartreflex.2 4a0d9000-4a0d903f : smartreflex.2 4a0db000-4a0db03f : smartreflex.1 4a0db000-4a0db03f : smartreflex.1 4a0dd000-4a0dd03f : smartreflex.0 4a0dd000-4a0dd03f : smartreflex.0 4a0f4000-4a0f41ff : omap-mailbox 4a0f6000-4a0f6fff : omap_hwspinlock.0 4a10a000-4a10a1ff : fdif.0 4a310000-4a3101ff : omap_gpio.0 4a314000-4a31407f : omap_wdt 4a314000-4a31407f : omap_wdt 4a318000-4a31807f : omap_timer 4c000000-4c0000ff : omap_emif.0 4d000000-4d0000ff : omap_emif.1 4e000000-4e0007ff : dmm 52000000-520000ff : rpres.3 55082000-550820ff : omap-iommu.0 56000000-5600ffff : pvrsrvkm.0 58000000-5800007f : omapdss_dss 58001000-58001fff : omapdss_dispc 58002000-580020ff : omapdss_rfbi 58003000-580030ff : omapdss_venc 58004000-580041ff : omapdss_dsi1 58005000-580051ff : omapdss_dsi2 58006000-58006fff : omap-hdmi-codec 58006000-58006fff : hdmi-audio-dai 58006000-58006fff : omapdss_hdmi 59000000-590007ff : gccore.0 5a000000-5a07ffff : iva.0 80000000-9fffffff : System RAM 8004b000-807c0fff : Kernel text 807c2000-809b6a67 : Kernel data a0000000-a01fffff : ram_console a0200000-b15fffff : System RAM
2つ目は、第七世代Kindle fire HD 10(Linux 3.18.19, Android 5.1.1, Fire OS 5.6.0.1)です。SoCはMediaTek MT8173で、RAMは2GBだったはず。こいつは /proc/iomemを見ることができませんでした。
MemTotal: 1859352 kB MemFree: 154136 kB MemAvailable: 746096 kB Buffers: 51148 kB Cached: 654676 kB SwapCached: 0 kB Active: 852688 kB Inactive: 319524 kB Active(anon): 469736 kB Inactive(anon): 1464 kB Active(file): 382952 kB Inactive(file): 318060 kB Unevictable: 3156 kB Mlocked: 0 kB SwapTotal: 0 kB SwapFree: 0 kB Dirty: 24 kB Writeback: 0 kB AnonPages: 469524 kB Mapped: 292104 kB Shmem: 1680 kB Slab: 97544 kB SReclaimable: 52184 kB SUnreclaim: 45360 kB KernelStack: 20224 kB PageTables: 18672 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 929676 kB Committed_AS: 24985496 kB VmallocTotal: 260046784 kB VmallocUsed: 339000 kB VmallocChunk: 259616448 kB
Page block order: 10 Pages per block: 1024 Free pages count per migrate type at order 0 1 2 3 4 5 6 7 8 9 10 Node 0, zone DMA, type Unmovable 1762 3473 31 7 125 94 30 14 0 0 0 Node 0, zone DMA, type Reclaimable 26 9 3 1 0 0 0 0 0 0 0 Node 0, zone DMA, type Movable 2662 1111 594 1412 85 21 6 1 0 0 0 Node 0, zone DMA, type Reserve 0 0 0 0 0 0 0 0 0 0 0 Number of blocks type Unmovable Reclaimable Movable Reserve Node 0, zone DMA 117 13 334 2
3つ目は、SHARP AQUOS PHONE ZETA SH-01F(Linux 3.4.0, Android 4.4.2)です。SoCはQualcomm Snapdragon 800 MSM8974で、RAMは2GBですかね。これも工場出荷状態にしているので、OSが古いかもしれません。CMAってHighMemに確保できるんだね…、知らなかったです。
MemTotal: 1833480 kB MemFree: 304764 kB Buffers: 20268 kB Cached: 553340 kB SwapCached: 0 kB Active: 758564 kB Inactive: 440948 kB Active(anon): 625904 kB Inactive(anon): 620 kB Active(file): 132660 kB Inactive(file): 440328 kB Unevictable: 0 kB Mlocked: 0 kB HighTotal: 1342464 kB HighFree: 44376 kB LowTotal: 491016 kB LowFree: 260388 kB SwapTotal: 0 kB SwapFree: 0 kB Dirty: 52 kB Writeback: 0 kB AnonPages: 625784 kB Mapped: 183372 kB Shmem: 688 kB Slab: 45908 kB SReclaimable: 13920 kB SUnreclaim: 31988 kB KernelStack: 11264 kB PageTables: 23536 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 916740 kB Committed_AS: 44340740 kB VmallocTotal: 294912 kB VmallocUsed: 34500 kB VmallocChunk: 169996 kB
Page block order: 10 Pages per block: 1024 Free pages count per migrate type at order 0 1 2 3 4 5 6 7 8 9 10 Node 0, zone Normal, type Unmovable 595 362 180 106 93 49 26 15 3 0 3 Node 0, zone Normal, type Reclaimable 0 6 2 2 1 1 0 0 0 1 0 Node 0, zone Normal, type Movable 666 496 406 265 184 72 17 9 4 4 30 Node 0, zone Normal, type Reserve 0 0 0 0 0 0 0 0 0 0 1 Node 0, zone Normal, type CMA 8 4 1 0 1 0 1 0 1 0 3 Node 0, zone Normal, type Isolate 0 0 0 0 0 0 0 0 0 0 0 Node 0, zone HighMem, type Unmovable 0 32 24 8 1 16 12 6 2 1 0 Node 0, zone HighMem, type Reclaimable 0 0 0 0 0 0 0 0 0 0 0 Node 0, zone HighMem, type Movable 267 161 4 1 1 10 7 2 0 2 0 Node 0, zone HighMem, type Reserve 0 0 0 0 0 0 0 0 0 0 1 Node 0, zone HighMem, type CMA 241 256 415 134 32 0 1 0 0 0 0 Node 0, zone HighMem, type Isolate 0 0 0 0 0 0 0 0 0 0 0 Number of blocks type Unmovable Reclaimable Movable Reserve CMA Isolate Node 0, zone Normal 45 4 84 1 4 0 Node 0, zone HighMem 66 0 176 1 85 0
00000000-05cfffff : System RAM 00008000-0100a2eb : Kernel code 0120e000-0164c083 : Kernel data 0dc00000-0f9fffff : System RAM 0ff00000-0fffffff : System RAM 11000000-11ffffff : System RAM 13000000-7e6fffff : System RAM f920c100-f92fbfff : f9200000.dwc3 f9824900-f9824a1b : mmc0 f98a4900-f98a4a1b : mmc1 f9922000-f9922fff : msm_serial_hsl f9923000-f9923fff : spi_qsd f9924000-f9924fff : spi_qsd f9927000-f9927fff : f9927000.i2c f9928000-f9928fff : f9928000.i2c f9966000-f9966fff : spi_qsd f9967000-f9967fff : f9967000.i2c f9968000-f9968fff : f9968000.i2c fb21b000-fb21dfff : pmu_base fc380000-fc3e9fff : fc380000.msm-bimc fc401680-fc401683 : restart_reg fc4016c0-fc4016c3 : restart_reg fc401700-fc401703 : clk_base fc4281d0-fc4291cf : vmpm fc460000-fc463fff : fc460000.msm-sys-noc fc468000-fc46bfff : fc468000.msm-periph-noc fc470000-fc473fff : fc470000.msm-ocmem-noc fc478000-fc47bfff : fc478000.msm-mmss-noc fc480000-fc483fff : fc480000.msm-config-noc fc4a8000-fc4a9fff : tsens_physical fc4bc000-fc4bcfff : tsens_eeprom_physical fc820000-fc82001f : rmb_base fc880000-fc8800ff : qdsp6_base fd485300-fd48530b : halt_base fda00020-fda0002f : csi_clk_mux fda00030-fda00033 : csiphy_clk_mux fda00038-fda0003b : csiphy_clk_mux fda00040-fda00043 : csiphy_clk_mux fda04000-fda040ff : fda04000.qcom,cpp fda08000-fda080ff : fda08000.qcom,csid fda08400-fda084ff : fda08400.qcom,csid fda08800-fda088ff : fda08800.qcom,csid fda08c00-fda08cff : fda08c00.qcom,csid fda0a000-fda0a4ff : fda0a000.qcom,ispif fda0ac00-fda0adff : fda0ac00.qcom,csiphy fda0b000-fda0b1ff : fda0b000.qcom,csiphy fda0b400-fda0b5ff : fda0b400.qcom,csiphy fda0c000-fda0cfff : fda0c000.qcom,cci fdb00000-fdb0ffff : kgsl-3d0 fdb20000-fdb2ffff : kgsl-3d0 fdc80000-fdc803ff : vbif_base fdce0000-fdce3fff : wrapper_base fe200000-fe2000ff : qdsp6_base fec00000-fed7ffff : fdd00000.qcom,ocmem