2010-11-28 5 views
9

현재 Robert Love의 'Linux 커널 개발'을 읽고 있는데이 어셈블리 비트가 무엇을하는지 이해하지 못합니다.리눅스 커널 개발

기본적으로 각 프로세스 커널 스택에는 struct thread_info이 스택의 끝에 있습니다. 이제 x86 아키텍처에, 우리는 분명히 다음 어셈블리를 사용하여이 (가정 8킬로바이트 스택 크기)를 잡아 수

movl $-8192, %eax 
andl %esp, %eax 

그래서 기본적으로 AND 연산 0xffffe000에 의해 스택 포인터. 나는 여기서 무슨 일이 일어나고 있는지 혼란 스럽다. 나는 왜 %esp의 최하위 13 비트를 마스킹하는 것이 구조체를 필요로하는지 보지 못한다. 나는 그것이 설명되면 멍청하다고 느낄 것이다. 그러나 그것은 나를 괴롭 히고있다.

감사합니다.

+0

현재이 책을 읽고 있는데, 기본적인 질문이 있습니다 :'-8192'가'0xffffe000'이라는 것을 어떻게 아십니까? 어떻게 부정 수치가 CPU의 레지스터에 저장됩니까? –

답변

5

스택이 아래쪽으로 커지기 때문에 스택의 끝이 스택의 가장 낮은 주소와 구조의 시작 주소가됩니다. 스택은 8KB의 배수로 저장됩니다. 따라서 최하위 13 비트를 지우면 스택의 최하위 주소가되고 구조의 시작이됩니다. 이게 말이 돼?

+0

하지만 % esp가 스택의 맨 아래를 가리키고 있다고 생각 했습니까? 구조체가 스택의 마지막에 푸시 될 때 % esp가 감소합니다. – tbh

+0

스택은 높은 메모리 주소에서 시작됩니다 (물건을 누르면 스택 포인터가 줄어 듭니다). % esp는 스택의 맨 아래를 가리키며, 스택이 성장할 수있는 공간의 맨 아래가 아니라 "현재"의 바닥을 가리키고 있습니다. – lijie

+0

아, 구조체가 방금에 푸시되었다고 생각하는 것을보십시오. 스택의 구덩이에서 프로세스가 초기화되고 자신의 스택이 주어 졌을 때 모든 것을 끝내기보다. OK, 감사합니다. lijie – tbh