linuxのメモ

Linux kernelの実装を解説していきます (対象ver 4.5)

メモリ割り当て - memset_orig()

概要

rdiレジスタの指すアドレスからrdxレジスタの値分のメモリを初期化する

詳細

1: ecxレジスタsilレジスタの値を、raxレジスタ0x0101010101010101silレジスタの値の積をそれぞれ保存し、rdiレジスタの下位3bitが0でなければ以下の処理を行う

2: rcxレジスタrdxレジスタの値をコピーし、rdxレジスタを右に6bitシフトした値をrdxレジスタに保存し、その値が0になれば4の処理にジャンプする

3: rcxレジスタをデクリメントしてからraxレジスタの値をrdiレジスタの指すアドレスに8個分保存し、rdiレジスタのアドレスを64加算しrcxレジスタの値が0になるまで処理を繰り返す

4: edxレジスタと4 - 6bitが1の値を論理積した結果が0の場合は6の処理にジャンプするが、それ以外の場合は結果の値を3bit右にシフトした値をecxレジスタに保存する

5: ecxレジスタをデクリメントしてからraxレジスタの値をrdiレジスタの指すアドレスに保存し、rdiレジスタのアドレスを8加算しecxレジスタの値が0になるまで処理を繰り返す

6: edxレジスタの下位3bitを保存し、その値が0になった場合は8の処理にジャンプする

7: edxレジスタをデクリメントしてからalレジスタの値をrdiレジスタの指すアドレスに保存し、rdiレジスタのアドレスを1加算しedxレジスタの値が0になるまで処理を繰り返す

8: 関数呼び出し時のrdiレジスタの値をraxレジスタに保存し、処理を終了する