2016-10-01 10 views
-2

私はcopy_from_user関数を読んでいます、copy_from_user関数では、マクロ__get_user_asmが使用されています。`xorb%b1、%b1`には%b1(b 1ではなく、b L)がありますか?

linuxにはmmapのシステムコールがあり、mmapのシステムコールは関数copy_from_userを呼び出します。サイズが一定の場合、この関数はマクロ__get_user_asmを使用します。私は実際のソースに __get_user_asm(*(u8 *)dst, (u8 __user *)src, ret, "b", "b", "=q", 1);

1: movb %2,%b1\n 
2:\n 
.section .fixup, "ax" \n 
3: mov %3, %0 \n 
**xorb %b1, %b1\n** 
jmp 2b\n 
.previous\n 

: "=r" (ret), =q(dst) 
:"m"(dst), "i"(1), "0"(ret) 

.quad "1b", "2b"\n 
.previous\n``` 

、 どこかに私は理解できない存在を翻訳しようとすると、__get_user_asmの内容は

#define __get_user_asm(x, addr, err, itype, rtype, ltype, errret) \ 
asm volatile("1: mov"itype" %2,%"rtype"1\n"  \ 
     "2:\n"      \ 
     ".section .fixup,\"ax\"\n"    \ 
     "3: mov %3,%0\n"    \ 
     " xor"itype" %"rtype"1,%"rtype"1\n"  \ 
     " jmp 2b\n"     \ 
     ".previous\n"     \ 
     _ASM_EXTABLE(1b, 3b)    \ 
     : "=r" (err), ltype(x)    \ 
     : "m" (__m(addr)), "i" (errret), "0" (err)) 

です。

1、xorb %b1, %b1%b1(b、not b L)?

2、jmp 2bは、2bのラベルまたはメモアドレスですか? 2bがラベルの場合、このlableをどのように見つけることができますか?

3、.quad "1b", "2b"の機能は何ですか?

ここで私はセマンティクス層でのLinuxカーネルソースを理解するための知識を得ることができますか?

+0

['xorb%b1、%b1'は'%b1'を0に設定します。](http://stackoverflow.com/questions/33666617/what-is-the-best-way-to-set-a -x-assembly-xor-mov-or-and) – Cornstalks

+0

ええ、私は文章のことを知っています。しかし%b1は何か分からないのですか? – peasantspring

答えて

2

gccの拡張asmについては、docsを参照すると、%1は2番目のパラメータを参照しています(パラメータ番号はゼロに基づいているため)。あなたの例では、それはdstです。 b(すなわち%のb1)を追加

hereに記載されている:

Modifier Description        Operand masm=att masm=intel 
b  Print the QImode name of the register. %b0  %al  al 

jmp 2b2 labelという名前の後方に見えることを意味します。

.quadディレクティブはhereに定義される:

.quadは、カンマで区切られたゼロ個以上bignumsを期待します。 bignumごとに、8バイトの整数を出力します。 bignumが8 バイトに収まらない場合は、警告メッセージを出力します。 bignumの最も低いオーダー8 バイトを取ります。

情報の入手先は、私が提供したリンクがうまくいけば助かります。

0

XORそれ自身のレジスタはゼロに設定されます。 %B1 = 0。