前提
cBPFでは下位3bitが命令クラスを指し、基本的な命令(ロードか、ストアか、演算か、分岐か、など)を示す。 上位5bitは命令クラスにより構成が変わる。
- ↑MSB
- クラスによって構成が変わる:5bit
- 命令クラス:3bit(
ld,ldxなど) - ↓LSB
ちなみに、cBPFの命令とeBPFの命令はほぼ同じ。
なおcBPFの命令では、オペコードは16bit幅ですが、実際には下位8bitしか利用されていません。
(引用:https://atmarkit.itmedia.co.jp/ait/articles/1812/10/news016_2.html)
ldxmshとは?
ldxbとmshの合成。
ldxbは1バイトをインデックスレジスタXに代入する(ちなみにldbはアキュムレータレジスタAに代入する)。
mshは特殊なモードであり、基本的にBPF_LDXとの組み合わせでしか用いられない。
BPF_LDX These instructions load a value into the index register. Note that the addressing modes are more restrictive than those of the accumulator loads, but they include BPF_MSH, a hack for efficiently loading the IP header length.
BPF_LDX+BPF_W+BPF_IMM X <- k BPF_LDX+BPF_W+BPF_MEM X <- M[k] BPF_LDX+BPF_W+BPF_LEN X <- len BPF_LDX+BPF_B+BPF_MSH X <- 4*(P[k:1]&0xf)(引用:https://man.freebsd.org/cgi/man.cgi?query=bpf&sektion=4&manpath=FreeBSD+4.5-RELEASE)