Zrozumienie pobierania wskaźnika task_struct ze stosu jądra procesu
W tej chwili czytam książkę „Linux Kernel Development 3d Edition” autorstwa Roberta Love. Tam pisze o strukturze thread_info, która zawiera wskaźnik do struktury task_struct i, jak rozumiem, znajduje się na dole lub na górze stosu jądra procesu (w zależności od architektury). Do niedawna nie znałem interfejsu API jądra Linuksa i nie byłem znany z istnienia metody current (). Istnieje fragment książki odnoszący się do tego, jak faktycznie działa metoda current ():
W x86, prąd jest obliczany przez maskowanie 13 najmniej znaczących bitów wskaźnika stosu, aby uzyskać strukturę thread_info. Robi się to za pomocą funkcji current_thread_info (). Zestaw jest pokazany tutaj: movl $ -8192,% eax andl% esp,% eax Zakłada się, że rozmiar stosu wynosi 8 KB. Gdy włączone są stosy 4 KB, zamiast 8192 jest używane 4096.
Moje pytania to:
O ile wiem, jeśli mamy wartość dziesiętną przedstawioną jako zbiór bitów, to jest tylko jeden najmniej znaczący bit w zestawie, prawda?Jaka jest magiczna liczba 13?Dla tysiąca osób, które przeczytają ten temat, zadane przeze mnie pytania mogą doprowadzić do wniosku, że autor nie rozumie właściwie procesu alokacji i administrowania pamięcią. Ok, to może być słuszne, ponieważ w moim umyśle mogę reprezentować pamięć przydzieloną dla stosu jako wstążkę pełną bitów (lub bajtów). Wszystkie te bajty dostępne dla określonego adresu pamięci reprezentowanego jako pewna wartość dziesiętna. Początkiem stosu jest najniższy adres pamięci, a płetwa stosu jest najwyższą wartością adresu pamięci. Ale JAK, jak możemy uzyskać wskaźnik do struktury thread_info znajdujący się na, powiedzmy, końcu stosu, tylko przez zamaskowanie 13 najmniej znaczących bitów wskaźnika stosu umieszczonego w ARBITRARY (Jeśli dobrze zrozumiałem, maskujemy bity wskaźnik stosu ADRES reprezentowany jako wartość dziesiętna).