コグノスケ


link 未来から過去へ表示(*)  link 過去から未来へ表示

link もっと前
2014年8月24日 >>> 2014年8月11日
link もっと後

2014年8月24日

壊れないとしか言ってない

私のスマホは防水だけど、その意味は雨でも壊れない、であって、雨でも使える、って意味ではないんだなあ。

なぜなら、タッチパネルに水滴が着くとまともに動かないからです…。

メモ: 技術系の話はFacebookから転記しておくことにした。

編集者:すずき(2015/11/29 06:08)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2014年8月22日

ARMv5とARMv7アーキテクチャの名前について

ARMアーキテクチャを表すときARMv5Tがあって、ARMv6Tがないのはなぜでしょう?

ARMv5TのTの部分は「バリアント」と呼ばれ、TバリアントであればTHUMB命令セットに対応したARMアーキテクチャである、ことを示します。他にもエンハンストDSP命令のEとか、Jazzele命令のJがあります。

ARMv5まではTHUMB命令セットへの対応はオプションでした。このため、ARMv5世代のARMアーキテクチャはTHUMB非対応のARMv5とTHUMB対応のARMv5Tの2種類が存在し得ました。実際にTHUMB未対応のARMv5プロセッサを作った会社があるか、まではわかりませんが。そういうプロセッサを「作っても良い」ことにはなっていました。

例えば、携帯でよく使われていたARM926EJ-SプロセッサのアーキテクチャはARMv5TEJ、つまりTHUMBとエンハンストDSPとJazzeleに対応したアーキテクチャ、という意味です。

しかしARMv6からはTHUMB対応が必須となり、THUMBの有り/無しを区別する必要がなくなり、名前もARMv6のみとなりました。ARMv6はTHUMB命令セットに対応していてもARMv6Tとは呼びません。対応している機能を全部並べ始めると、冗長になるためでしょう、たぶん。

なお、エンハンストDSP命令もv6でARM命令セットに取り込まれたため、Tと同時にEバリアントも消滅しています。

ARMv7以降

さらに、最近のARMv7アーキテクチャでは、バリアントの考えが変わったようで、ARMv7の後ろに対応機能を意味するアルファベットは付かなくなりました。

種類もARMv7-AとARMv7-RとARMv7-Mの3つです。それぞれ「アプリケーション」「リアルタイム」「マイクロコントローラ」プロファイルの意味だそうです。対応する機能は下記の通り。

  • A: MMU、ARM、Thumb、Thumb-2、Thumb-2EE、NEON、32ビットSIMD
  • R: ARM、Thumb、Thumb-2(オプション)、VFP、32ビットSIMD、ハードウェア除算
  • M: Thumb-2、ハードウェア除算

アーキテクチャが対応する命令セットの規模順に並べたとき、ARMとなるところもまたニクいですね。イギリス人はこういうシャレが好きなのでしょうか?

これ以上の詳細情報はARMのサイト(ARMのサイトへのリンクを張っておきます)をご覧ください。

ARM命令セットとTHUMB命令セットの関係

余談ですが、ARM命令セットやTHUMB命令セットにもバージョンがあります。下記の通りです。

  • ARMv6 : THUMBv3
  • ARMv5 : THUMBv2
  • ARMv4 : THUMBv1

バージョンは1:1に対応しており、異なる世代を組み合わせること、たとえばARMv6とTHUMBv2を組み合わせることはできません。

メモ: 技術系?の話はFacebookから転記しておくことにした。なおARMv7の節は8/25に加筆。

編集者:すずき(2014/08/26 01:12)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2014年8月21日

マウス壊れた

一昨年買った(2012年4月5日の日記参照)、Logicool Perfomance MX M950が壊れました。マウスの左ボタンがバカになって、全部ダブルクリックになってしまう、良くある壊れ方です。

形あるもの、いつか壊れるとは思っていますが、1万以上したマウスが2年で壊れるのはちょっと悲しい。

Newマウス2号

存外に早く壊れた以外、使い勝手は最高に気に入っていたので、もう一個M950を買いました。アマゾンで8,226円でした。前回は12,000円したので、3割近く安くなっていますね。

しかし2年前のフラッグシップモデルだったM950が、未だにフラッグシップモデルとして君臨しているのはちょっと意外でした。余程の人気なのか、それとも新製品開発をあまりしていないのでしょうか。

Logicoolマウス愛好者としては、後者でないことを祈るばかりです。

保証期間

新たにやってきたM950の保証書を見てびっくり。保証期間「ご購入日から3年間」の文字が輝いています。

さ、3年…だと…?ということは、壊れたマウスは保証期間内?無料で直せちゃう感じ?マジで…?

普通のメーカー保証は1年で速攻切れる役立たずなイメージですが、3年ってすごいですね。さすがだなLogicoolさん。でも、もう保証書がどっか行ってしまったから、何年でも意味なかったりするのだけど…。今度は大事に取っておきます。

編集者:すずき(2014/08/21 23:24)

コメント一覧

  • hdkさん(2014/08/22 01:11)
    ロジクールの 1,500 円もしないマウスがなぜか 5 年保証で、1 年ちょっとでボタンのチャタリングが出たことがあったんですが、購入店で修理に出したら 1 か月かかって新品交換されてきました。交換後 5 年以上たっていますがチャタリングはもう出ていないので、個体差があるんですかねぇ。
  • すずきさん(2014/08/23 01:42)
    >hdk さん
    今まで使ってきたマウスも長持ちが多かったので、偶然外れを引いたのだと思います。
    しかし 5年は長すぎではなかろうかw
open/close この記事にコメントする



2014年8月20日

ファイルシステム対決

CentOS7 EXT4 vs XFS vs Btrfs vs ZFS on vda - Qiita を読んで。

参考になります(※1)。ZFSはFUSE経由じゃないNative実装があるのか…知らなんだ。

(※1)補足。この手のベンチマークはたくさんあるように見えて、ファイルシステム側の進化が早いため、すぐに陳腐化します。なので、新しいベンチマークは常にありがたいものです。

XFSは1MB overのデカいファイルは速いけど、1KBくらいの細かいファイルのcreate/deleteをぶちかます(カーネルのtarballを展開しながら、古いカーネルソースをrm -rするとか)と、すっごい遅くて嫌になって使うの辞めた記憶があるのだけど…改善されたのだろうか?

メモ: 技術系?の話はFacebookから転記(※2)しておくことにした。

(※2)本来8月14日のエントリです。8月14日辺りでエミュレータが動いたのが嬉しくて、浮かれてFacebookに書きまくったら、このサイトに転記しきれなくなったため、未来のエントリに移動させています。

編集者:すずき(2014/08/16 16:40)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2014年8月19日

C言語はいくらでもメチャクチャに書ける

目次: C言語とlibc

switch文を使ってはいけないを読んで。

PHPはさておいて。私もswitchよりStateパターンを選びますが、C言語の関数ポインタでStateパターンを実現するのは、今も迷います。言語仕様上、悪い方に倒れるのを阻止できないためです。

ハッカーが明確で読みやすいコードを書いてくれるうちは良いですが、頭のおかしい人がdoという関数ポインタに全関数を入れるクソコードを書き始めたらもう全部パアです。

いやまさかそんなこと、と思うかもしれませんが、どこの会社とは言いませんがそんなクソコードが実在してるんですよ、世の中って怖いですよね…。

ワルいコード

この記事(コードのネストを深くするな)を読んでいたら、会社のクソコード山脈を思い出しました。

7段ifなんて序の口。世の中の悪手とされる書き方は、大概やってるワルい奴です。バグも多い…。

メモ: 技術系?の話はFacebookから転記(※)しておくことにした。

(※)本来8月14日のエントリです。8月14日辺りでエミュレータが動いたのが嬉しくて、浮かれてFacebookに書きまくったら、このサイトに転記しきれなくなったため、未来のエントリに移動させています。

編集者:すずき(2023/04/29 21:49)

コメント一覧

  • すずきさん(2014/08/18 11:44)
    C 言語だと do はキーワードなので、変数名としては使えないので、exec ですかね…。文意に変わりはありませんけど。
  • IKeJIさん(2014/08/26 17:08)
    main = 195;
    みたいなもんですか?
  • すずきさん(2014/08/26 21:20)
    >IKeJI さん
    コードゴルフなら超短い、その手があったか!など発見や感動がありますが、クソコードは無駄に長いし、発見もないです。
    まあ、良くこんなのメンテナンスできますわねー、って違う意味での感動はありますけど…。
open/close この記事にコメントする



2014年8月18日

私の常識はあなたの非常識

【レビュー】超小型PC「Raspberry Pi」で夏休み自由課題・第1回 - Raspberry Piとは? 入手とセットアップ (1) Raspberry Piでコンピューターを学ぼう を読んで。

"Raspberry Piは少々とっつきにくい。買ってくると基板が入っているだけで、電源をつないでも動かないのだ。"(引用)

え!そうなの?

SDカードにtarball一個解凍するだけで使えるようになるので、一番とっつきやすい部類だと思ってました。

いつの間にか一般的な理解と乖離していたみたいです。うーん、認識を改めなければいかんなー…。

メモ: 技術系?の話はFacebookから転記(※)しておくことにした。

(※)本来8月13日のエントリです。8月14日辺りでエミュレータが動いたのが嬉しくて、浮かれてFacebookに書きまくったら、このサイトに転記しきれなくなったため、未来のエントリに移動させています。

編集者:すずき(2014/08/16 16:38)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2014年8月16日

コードの読みやすさとは

基本的には、コードを読むときに、覚えておかなければならないことを減らし、覚える時間を短く済ませた方がわかりやすい、と感じます。

コードを横長にするくらいなら、縦長にする。
一度に覚えることが減るから。
コードの横も縦も短くできれば、なお良い。
メソッドを読むときに覚え続ける時間が減るから。
引数は少ない方が良い。
メソッドの目的は1つが良い。
コードを読むときに覚える項目が減るから。
インデントは浅い方が良い。
ブロックを読むときに覚える条件の数が減るから。
意味のわからない変数名は無い方が良い。
マジックナンバーは無い方が良い。
名前と名前の意味を対応させる必要がなくなるから。
グローバル変数は無い方が良い。
ソースコード全域で覚えなければならない項目が減るから。
副作用は無い方が良い。
覚える必要すらなくなるから。

覚えきれない量の条件や変数が出てくるコード、長時間覚えておかなければ理解できないコードは、どこかが病気だと思って、直すようにしています。

編集者:すずき(2014/08/16 16:23)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2014年8月15日

別の日と内容が重複していたので削除。

編集者:すずき(2023/02/04 20:35)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2014年8月14日

自作ARMエミュレータ - Busyboxまで動いた

目次: Linux

自作ARMエミュレータでLinux 3.12.26をブートし、Busyboxのashのプロンプト表示まで到達しました。

現時点での動作イメージです。実際は最初の方にエミュレータのデバッグメッセージが大量に出ますが、意味ないので叩き切ってます。

Busybox on Linux 3.12.26 on自作ARMv5エミュレータ
Connected to the target VM, address: '127.0.0.1:49281', transport: 'socket'

Exception: Reset by 'Init.'.
[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Linux version 3.12.26+ (katsuhiro@falcon) (gcc version 4.9.1 20140710 (prerelease) (crosstool-NG linaro-1.13.1-4.9-2014.07 - Linaro GCC 4.9-2014.07) ) #1 Thu Aug 14 02:42:16 JST 2014
[    0.000000] CPU: ARM926EJ-S [41069260] revision 0 (ARMv5TEJ), cr=00003137
[    0.000000] CPU: VIVT data cache, VIVT instruction cache
[    0.000000] Machine: ARM-Versatile PB
[    0.000000] Ignoring unrecognised tag 0x00000000
[    0.000000] Memory policy: ECC disabled, Data cache writeback
[    0.000000] On node 0 totalpages: 16384
[    0.000000] free_area_init_node: node 0, pgdat c03ac754, node_mem_map c03c9000
[    0.000000]   Normal zone: 128 pages used for memmap
[    0.000000]   Normal zone: 0 pages reserved
[    0.000000]   Normal zone: 16384 pages, LIFO batch:3
[    0.000000] sched_clock: 32 bits at 24MHz, resolution 41ns, wraps every 178956ms
[    0.000000] pcpu-alloc: s0 r0 d32768 u32768 alloc=1*32768
[    0.000000] pcpu-alloc: [0] 0 
[    0.000000] Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 16256
[    0.000000] Kernel command line: console=ttyAMA0 mem=64M lpj=0 root=/dev/ram init=/bin/sh debug printk.time=1
[    0.000000] PID hash table entries: 256 (order: -2, 1024 bytes)
[    0.000000] Dentry cache hash table entries: 8192 (order: 3, 32768 bytes)
[    0.000000] Inode-cache hash table entries: 4096 (order: 2, 16384 bytes)
[    0.000000] Memory: 59960K/65536K available (2742K kernel code, 155K rwdata, 712K rodata, 114K init, 111K bss, 5576K reserved)
[    0.000000] Virtual kernel memory layout:
[    0.000000]     vector  : 0xffff0000 - 0xffff1000   (   4 kB)
[    0.000000]     fixmap  : 0xfff00000 - 0xfffe0000   ( 896 kB)
[    0.000000]     vmalloc : 0xc4800000 - 0xff000000   ( 936 MB)
[    0.000000]     lowmem  : 0xc0000000 - 0xc4000000   (  64 MB)
[    0.000000]     modules : 0xbf000000 - 0xc0000000   (  16 MB)
[    0.000000]       .text : 0xc0008000 - 0xc0367c14   (3456 kB)
[    0.000000]       .init : 0xc0368000 - 0xc03849fc   ( 115 kB)
[    0.000000]       .data : 0xc0386000 - 0xc03ace80   ( 156 kB)
[    0.000000]        .bss : 0xc03ace80 - 0xc03c8d64   ( 112 kB)
[    0.000000] NR_IRQS:224
[    0.000000] VIC @f1140000: id 0x00041190, vendor 0x41
[    0.000000] FPGA IRQ chip 0 "SIC" @ f1003000, 13 irqs
[    0.000000] Console: colour dummy device 80x30
[    1.823423] Calibrating delay loop... 0.51 BogoMIPS (lpj=2559)
[    2.008160] pid_max: default: 32768 minimum: 301
[    2.051389] Mount-cache hash table entries: 512
[    2.282632] CPU: Testing write buffer coherency: ok
[    2.336914] Setting up static identity map for 0xc029c520 - 0xc029c578
[    3.015733] VFP support v0.3: no double precision support
[    3.115064] NET: Registered protocol family 16
[    3.402544] DMA: preallocated 256 KiB pool for atomic coherent allocations
[    4.241363] Serial: AMBA PL011 UART driver
[    4.264723] dev:f1: ttyAMA0 at MMIO 0x101f1000 (irq = 44, base_baud = 0) is a PL011 rev1
[    4.657293] console [ttyAMA0] enabled
[    4.748693] dev:f2: ttyAMA1 at MMIO 0x101f2000 (irq = 45, base_baud = 0) is a PL011 rev1
[    4.827661] dev:f3: ttyAMA2 at MMIO 0x101f3000 (irq = 46, base_baud = 0) is a PL011 rev1
[    4.958784] fpga:09: ttyAMA3 at MMIO 0x10009000 (irq = 70, base_baud = 0) is a PL011 rev1
[    6.984675] bio: create slab <bio-0> at 0
[    7.563484] Switched to clocksource timer3
[   10.489897] NET: Registered protocol family 2
[   10.731930] TCP established hash table entries: 512 (order: 0, 4096 bytes)
[   10.761376] TCP bind hash table entries: 512 (order: -1, 2048 bytes)
[   10.781356] TCP: Hash tables configured (established 512 bind 512)
[   10.810155] TCP: reno registered
[   10.817472] UDP hash table entries: 256 (order: 0, 4096 bytes)
[   10.833676] UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)
[   10.936594] NET: Registered protocol family 1
[   11.031626] RPC: Registered named UNIX socket transport module.
[   11.039086] RPC: Registered udp transport module.
[   11.045485] RPC: Registered tcp transport module.
[   11.050589] RPC: Registered tcp NFSv4.1 backchannel transport module.
[   11.116524] Trying to unpack rootfs image as initramfs...
[  107.483588] Freeing initrd memory: 1084K (c0800000 - c090f000)
[  107.546930] NetWinder Floating Point Emulator V0.97 (double precision)
[  107.961293] Installing knfsd (copyright (C) 1996 okir@monad.swb.de).
[  108.022282] jffs2: version 2.2. (NAND) © 2001-2006 Red Hat, Inc.
[  108.128699] ROMFS MTD (C) 2007 Red Hat, Inc.
[  108.143263] msgmni has been set to 119
[  108.269578] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 254)
[  108.280765] io scheduler noop registered
[  108.289606] io scheduler deadline registered
[  108.308715] io scheduler cfq registered (default)
[  108.386028] clcd-pl11x dev:20: PL110 rev0 at 0x10120000
SYS_CLCD: read 0x00001f00
LCDControl: 0x00000000
[  109.004790] clcd-pl11x dev:20: Versatile hardware, VGA display
SYS_CLCD: read 0x00001f00
SYS_CLCD: 0x00001f00
LCDIMSC: read 0x00000000
LCDTiming0: 0x27175f9c
LCDTiming1: 0x200b05df
LCDTiming2: 0x067f3800
LCDTiming3: 0x00000000
LCDUPBASE: 0x83000000
LCDLPBASE: 0x8304b000
SYS_OSC4: read 0x00000000
SYS_LOCK: 0x0000a05f
SYS_OSC4: 0x0001c863
SYS_LOCK: 0x00000000
LCDIMSC: 0x00001029
LCDIMSC: 0x00001829
SYS_CLCD: read 0x00001f00
SYS_CLCD: 0x00001f03
SYS_CLCD: 0x00001f17
[  113.628628] Console: switching to colour frame buffer device 80x60
[  122.764467] brd: module loaded
[  122.953158] physmap platform flash device: 04000000 at 34000000
[  123.244156] physmap-flash physmap-flash.0: map_probe failed
[  123.531512] smc91x: not found (-19).
[  123.686616] mousedev: PS/2 mouse device common for all mice
[  124.249155] TCP: cubic registered
[  124.257574] NET: Registered protocol family 17
UARTIFLS: 0x00000012
UARTFBRD: 0x00000000
UARTIBRD: 0x00000001
UARTLCR_H: 0x00000000
UARTFBRD: 0x00000004
UARTIBRD: 0x00000027
UARTLCR_H: 0x00000070
[  124.810528] Freeing unused kernel memory: 112K (c0368000 - c0384000)
----- ls -la
total 4
drwxr-xr-x   11 1000     1003             0 Aug 14  2014.
drwxr-xr-x   11 1000     1003             0 Aug 14  2014..
drwxr-xr-x    2 1000     1003             0 Aug 13  2014bin
drwxr-xr-x    2 1000     1003             0 Aug 13  2014dev
drwxr-xr-x    2 1000     1003             0 Aug  8  2014etc
-rwxr-xr-x    1 1000     1003           129 Aug 14  2014init
drwxr-xr-x    2 1000     1003             0 Aug  8  2014lib
drwxr-xr-x    2 1000     1003             0 Aug  8  2014proc
drwx------    2 0        0                0 Aug 13  2014root
drwxr-xr-x    2 1000     1003             0 Aug  8  2014run
drwxr-xr-x    2 1000     1003             0 Aug  8  2014sbin
drwxr-xr-x    2 1000     1003             0 Aug  8  2014sys
/bin/sh: can't access tty; job control turned off
UARTFBRD: 0x00000004
UARTIBRD: 0x00000027
UARTLCR_H: 0x00000070
/ # 

Disconnected from the target VM, address: '127.0.0.1:49281', transport: 'socket'

Process finished with exit code -1


(メモ: コマンドラインから実行)
$ java -cp out/production/semu net.katsuster.semu.Main ~/share/arm_cross/linux-3.12.26/arch/arm/boot/Image ~/share/arm_cross/work/initramfs.gz

エミュレータの出しているデバッグメッセージがなかったら、普通の起動ログとあまり変わりませんね。って、そりゃ当たり前か。

開発環境、開発期間

珍しいものは使っていません。ぶっちゃけPC本体さえあれば、他は全部タダで行けます。

  • 開発環境: IntelliJ IDEA
  • エミュレータの実装言語: Java 7 SE
  • クロスコンパイラ: Linaroの成果物と、CodeSourcery G++
  • クロスコンパイル環境: Debian GNU/Linux
  • ARMやVersatileボードの仕様書: ARM社のサイト、PDFもGETできます

エミュレータのコードはこのサイトに置いています(リンク)。マニュアルなどはないので、使い方が意味不明だと思いますし、見ても面白くないと思いますが…。

最初のコミットが6/4なので、開発期間は約2か月半です。日曜大工というか日曜プログラミングなので、割と長期間の取り組みになっています。とはいえ、フルタイムでやったとしても、実装方式などを悩む時間は変わらないので、開発期間はそんなに変わらないように思います。

ハマった点

前に書いたもの以外のハマりポイントをご紹介。

Linuxカーネルのコンフィギュレーションが間違っていた
ARMはシステムコール呼び出し規約が2つあります。ARM OABI(swiの24ビット即値にシステムコール番号を埋め込む)と、ARM EABI(r7にシステムコール番号、swi 0x00000000で実行)です。
最近のコンパイラはみなEABIを使いますが、カーネルコンフィグでEABIを(コンフィグ名CONFIG_AEABI)無効にして、EABIのお作法でシステムコールを呼ぶと、全て「0番なんていうシステムコール知らん」=bad systemcall扱いになります。
エミュレーション対象にしたVersatile AB/PBのdefconfigは作られた時代が古いせいか、CONFIG_AEABIがデフォルト無効になっていてハマりました。
Thumb命令のエミュレーションをサボった
自作エミュレータがThumbモードビット(CPSRのTビット)を全く見ていなかったので、Thumb命令をARM命令だと思って実行して、クラッシュしていました。
コンパイラの選定ミス
Busyboxはglibcとstatic linkしますから、Busyboxが動作するか?=glibcにThumb命令が入っているかどうか?ですが、完全に頭から抜けていました。
調べてみるとLinaroのglibcはThumb命令を含んでいて、CodeSourceryのglibcはThumb命令を含んでいないようだったので、コンパイラをCodeSourceryに切り替えてひとまずThumb命令未実装の問題を回避しました。
UARTの出力側(TX)実装が悪かった
UARTの実装をサボって0を返しまくったせいで、TX FIFO残量まで0という意味になっていたらしく、ARM UARTドライバがTX FIFOの空き待ちでハングしていました。
カーネル起動時のprintkはFIFO残量なんか見てなかったくせに…、LinuxのARM UARTドライバって良くできてますね。

改善点

改良の余地はいくらでもあります。

  • クソ遅い、起動までに3分(QEMUは1秒くらい)
  • 文字入力が未実装、インタラクティブな使い方が出来ない
  • コンパイラを選ぶ
  • ARMv5TEJと言いつつ、TEJつまりThumb命令、エンハンスドDSP命令、Jazelle拡張は未実装で実質、素のARMv5
  • キャッシュ、TLB周りはガン無視
  • FPU命令も未実装
  • ネットワーク、ストレージなど、周辺I/Oは未実装

しばらくは楽しいオモチャになりそうです。

謎な点

Linux 3.12は起動するのに、Linux 3.14だとなぜか途中でハングします、なんでだろ?未だに良くわかりません。

編集者:すずき(2024/03/05 02:38)

コメント一覧

  • よしだあさん(2014/08/14 20:23)
    おもしろいなあ。
    私は最近オフでアウトプットできてないなあと反省。(;  ̄▽ ̄)
    つぎは、コンパイラですか!?笑
  • すずきさん(2014/08/15 00:42)
    >よしだあさん
    会社入ってから、日曜プログラミングはアウトプットまで辿り着けないことが多くて、モヤモヤしてましたので、久々に何となく形になったのは嬉しいです。

    残念ながらコンパイラを作る予定はないですなー。

    C のコンパイラ、大学の課題で作ったのが懐かしい…。
open/close この記事にコメントする



2014年8月13日

自作ARMエミュレータ - ARM ldm命令の怪

目次: Linux

ARMのldm命令には変わった機能が付いています。レジスタリストの後ろに付ける ^ なのですが、実は ^ には意味が2通りあります。そのためアセンブラで記述するときすこぶるわかりづらくなっています。

具体例を挙げると、下記の2つのldm命令は、同じようなレジスタリストを指定していて、同じような ^ が付いていますが、命令の意味は全く違います。

2つのハット

ldmdb sp, {r0, r1, r2, pc}^
ldmdb sp, {r0, r1, r2, lr}^

1つ目のldm命令は、sp - 16の指すアドレスからr0, r1, r2, pcにデータをロードして、cpsrレジスタに現在の動作モードのspsrレジスタをコピーせよ、という意味になります。

2つ目ldm命令は、sp - 16の指すアドレスから「ユーザモードの」r0, r1, r2, lrにデータをロードせよ、という意味になります。

何?意味がわからない?恐らく誰でもそうでしょう。私も最初に見たとき意味がわからなくて、目が点になりました。

仕様です

なぜこんなことになるかというと、ARMのldm命令の ^ の意味が、レジスタリストに依存して変わるからです。具体的に言えば、

レジスタリストにpcレジスタが入っていたら、
「pcをロードするldm命令で、カレントモードのspsrをcpsrにコピーすることを示す」

レジスタリストにpcレジスタが入っていなかったら、
「pcをロードしないldm命令で、ユーザモードレジスタをロードすることを示す」

のようにARMの仕様で定義されているからです。

一応の擁護

なんだその仕様は!と思われるでしょうが、この機能は、一般的なプログラムでは全く使われません。使われるのは、割り込みハンドラからの復帰、もしくは特権モードが絡む部分くらいで、いずれもOSの内部です。

そのためARMの初学者が使う可能性はほぼありません。いわゆる「わかってる」人しか使わない通の機能です。

少数のわかっている人しか使わないので、多少可読性が低くてもあまり問題が出ないのでしょう。たぶん。

感想

と、擁護した直後に言うのは憚られますが、正直なところそこまで ^ を酷使せず、せめてどちらかを ^ じゃない別の記号にすれば良かったのにと思わんでもないです。いきなり変えたら大混乱が起きるので、今さらどうしようもありませんけど。

仕様を切るとき、特に将来も下位互換性が求められそうな仕様、オープンな仕様では、記号の一文字取っても、細心の注意が必要だよなーと、強く感じた一件でした。

編集者:すずき(2024/03/05 02:37)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2014年8月12日

動かぬ自作エミュレータ

目次: Linux

自作ARMエミュレータ、Linux起動してinitramfs上の /initをexecveするところで必ず失敗するので調べてたら、
do_execve_common() → load_elf_binary() → padzero() → clear_user() → access_ok() → __range_ok()
ときて失敗し、結果的にEFAULTが返っていました。

range_okは常に失敗するわけでもないのが不思議で、さらに調べたらsbc, rsc命令のキャリーフラグ(Cフラグ)のエミュレーションが間違っていて、本来は成功なのに失敗を返す場合があることがわかりました。

ARMの仕様
a - b - cでボローが発生したらキャリーフラグを0
ミスった実装
a - bと(a + b) - c双方でボローが発生したらキャリーフラグを0
修正した実装
a - bか(a - b) - cのどちらかでボローが発生したらキャリーフラグを0

いきさつ

  • ボロー判定の関数は2項しか取れないから3項は渡せないけど、2回に分けて処理すれば3項でも判定できる!
    → a - bまたはb - cではなく、a - b「かつ」b - cと実装する過ちが発生
  • 引き算は足し算とほぼ処理が同じ!
    → a - bではなく、a + bと実装する過ちが発生

うーん、パッと見ではわからん…。けど、これで2日間も悩んでいた俺って一体…。

メモ: 技術系?の話はFacebookから転記しておくことにした。

編集者:すずき(2024/03/05 02:36)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link もっと前
2014年8月24日 >>> 2014年8月11日
link もっと後

管理用メニュー

link 記事を新規作成

<2014>
<<<08>>>
-----12
3456789
10111213141516
17181920212223
24252627282930
31------

最近のコメント20件

  • link 21年9月20日
    すずきさん (11/19 01:04)
    「It was my pleasure.」
  • link 21年9月20日
    whtさん (11/17 23:41)
    「This blog solves my ...」
  • link 24年10月1日
    すずきさん (10/06 03:41)
    「xrdpで十分動作しているので、Wayl...」
  • link 24年10月1日
    hdkさん (10/03 19:05)
    「GNOMEをお使いでしたら今はWayla...」
  • link 24年10月1日
    すずきさん (10/03 10:12)
    「私は逆にVNCサーバーに繋ぐ使い方をした...」
  • link 24年10月1日
    hdkさん (10/03 08:30)
    「おー、面白いですね。xrdpはすでに立ち...」
  • link 14年6月13日
    2048player...さん (09/26 01:04)
    「最後に、この式を出すのに紙4枚(A4)も...」
  • link 14年6月13日
    2048playerさん (09/26 01:00)
    「今のところ最も簡略化した式です。\n--...」
  • link 14年6月13日
    2048playerさん (09/16 01:00)
    「返信ありがとうございます。\nコメントが...」
  • link 14年6月13日
    すずきさん (09/12 21:19)
    「コメントありがとうございます。同じ結果に...」
  • link 14年6月13日
    2048playerさん (09/08 17:30)
    「私も2048の最高スコアを求めたのですが...」
  • link 14年6月13日
    2048さん (09/08 17:16)
    「私も2048の最高スコアを求めたのですが...」
  • link 14年6月13日
    2048playerさん (09/08 16:10)
    「私も2048の最高スコアを求めたのですが...」
  • link 02年8月4日
    lxbfYeaaさん (07/12 10:11)
    「555」
  • link 24年6月17日
    すずきさん (06/23 00:12)
    「ありがとうございます。バルコニーではない...」
  • link 24年6月17日
    hdkさん (06/22 22:08)
    「GPSの最初の同期を取る時は見晴らしのい...」
  • link 24年5月16日
    すずきさん (05/21 11:41)
    「あー、確かにdpkg-reconfigu...」
  • link 24年5月16日
    hdkさん (05/21 08:55)
    「システム全体のlocale設定はDebi...」
  • link 24年5月17日
    すずきさん (05/20 13:16)
    「そうですねえ、普通はStandardなの...」
  • link 24年5月17日
    hdkさん (05/19 07:45)
    「なるほど、そういうことなんですね。Exc...」

最近の記事3件

  • link 24年11月18日
    すずき (12/04 02:08)
    「[nvJPEGとNVJPGとJetson APIその1 - nvJPEG decoupled API] 目次: Linux半年...」
  • link 23年4月10日
    すずき (12/04 01:40)
    「[Linux - まとめリンク] 目次: Linux関係の深いまとめリンク。目次: RISC-V目次: ROCK64/ROCK...」
  • link 24年11月28日
    すずき (12/01 00:53)
    「[BIOS/UEFI画面に入る方法] PCは起動時にあるキーを押すとBIOS/UEFIの設定画面に遷移します。良く見るパターン...」
link もっとみる

こんてんつ

open/close wiki
open/close Linux JM
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 2021年
open/close 2022年
open/close 2023年
open/close 2024年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDFファイル RSS 1.0

最終更新: 12/04 02:08