今、RobertLoveの「LinuxKernelDevelopment3dEdition」という本を読んでいます。そこで彼は、task_struct構造体へのポインターを含み、私が理解したように、プロセスのカーネルスタックの一番下または一番上にあるthread_info構造体について書いています(アーキテクチャによって異なります)。私は最近までLinuxカーネルAPIに精通しておらず、current()メソッドの存在についても知りませんでした。current()メソッドが実際にどのように機能するかに関する本からの抜粋があります。
x86では、currentは、スタックポインタの最下位13ビットをマスクしてthread_info構造を取得することで計算されます。これは、current_thread_info()関数によって実行されます。アセンブリは次のように表示されます:movl $ -8192、%eax andl% esp、%eaxこれは、スタックサイズが8KBであることを前提としています.4KBスタックが有効になっている場合、8192の代わりに4096が使用されます。
私の質問は次のとおりです。
- ビットのセットとして表される10進値があるかどうかを知る限り、セットには最下位ビットが1つだけありますね。
- 魔法の数13は何ですか?
このトピックを読む人にとって、私が表明した質問は、作成者がメモリの割り当てと管理のプロセスを適切に理解していないという結論につながる可能性があります。わかりました。私の考えでは、スタックに割り当てられたメモリをビット(またはバイト)でいっぱいのリボンとして表すことができるという事実のために、それは正しいかもしれません。このすべてのバイトは、10進値として表される特定のメモリアドレスによってアクセス可能です。スタックの起点は最小のメモリアドレスであり、スタックのフィンはメモリアドレスの最大値です。しかし、どのように、たとえば、スタックの最後にあるthread_info構造体へのポインターを取得するには、ARBITRARYにあるスタックポインターの最下位13ビットをマスクします(正しく理解していれば、スタックのビットをマスクします)。ポインタアドレスは10進値で表されます)。