linuxのメモ

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

文字列操作 - strlen()

概要

文字列の文字数を取得する

詳細

アセンブラ命令のrepnescasb命令を使用して文字列の長さを取得する

それぞれのアセンブラ命令は以下の操作を行う

  • repne : %ecxレジスタの値が0になるまで処理を繰り返す
  • scasb : %al%ediの値を比較し、%ediの値を次のアドレスに更新する

従って、scasb命令の直前にrepne命令を実行するため比較した値一致するか%ecxが0になるまで処理を繰り返す

尚、拡張インラインアセンブラ命令によりそれぞれのレジスタは以下のように初期化されるため、比較対象の文字列の値が0(終端文字)と一致するまで処理を繰り返し%ecxの値は元の値から文字数分減算された値を返す

  • %eax : 0
  • %ecx : -1 (0xffffffffu)
  • %edi : 比較する文字列の先頭アドレス

従って、%ecxの値を反転した値から1を減算した値が文字数となりこの値を返す

また、この関数はEXPORT_SYMBOL()によりモジュールからアクセス可能なシンボルとなる