"LDD3"를 다시 읽었을 때 무시했던 문장을 발견했습니다. "커널에는 매우 작은 스택이 있습니다. 이 문장에 대해 저는 간단히 설명합니다. 프로세스의 "커널 스택"에 대해 배웠습니다.
프로세스의 "커널 스택"이란 무엇입니까? 각 프로세스의 수명주기 동안 필연적으로 시스템 호출을 통해 커널에 갇히게 됩니다. 커널에서 시스템 호출 및 트랩을 실행한 후 이러한 커널 코드가 사용하는 스택은 사용자 공간의 원래 스택이 아니라 프로세스의 "커널 스택"인 커널 공간의 스택입니다.
예를 들어 간단한 문자 드라이버는 open()
方法。在这个驱动程序挂载后,应用程序通过glib库调用Linux的open()
시스템 호출을 구현합니다. 시스템 호출이 실행되어 커널에 트랩되면 프로세서는 특권 모드로 전환됩니다(구체적인 전환 메커니즘은 프로세서 아키텍처에 따라 다릅니다. 예를 들어 ARM의 경우 일반 모드와 사용자 모드의 스택 포인터(SP)는 다음과 같습니다. 다른 레지스터). 이때 사용되는 스택포인터는 커널스택포인터로, 커널이 프로세스별로 할당한 커널스택공간을 가리킨다.
커널 스택의 역할 제가 개인적으로 이해한 바는 커널에 빠진 후 시스템 호출에 스택 지원이 필요한 함수 호출과 자동 변수도 있다는 것입니다. 사용자 공간 스택은 분명히 안전하지 않으므로 커널 스택 지원이 필요합니다. 또한 커널 스택은 시스템 호출 이전에 일부 애플리케이션 계층 정보(예: 사용자 공간 스택 포인터 및 시스템 호출 매개변수)를 저장하는 데에도 사용됩니다.
커널 스택과 프로세스 구조의 관계 각 프로세스는 생성될 때 커널 스택 공간을 얻습니다. 커널 스택과 프로세스 간의 대응은 두 가지 구조의 포인터 멤버를 통해 완성됩니다. (1) struct task_struct Linux 프로세스 관리를 배울 때 반드시 배워야 하는 구조입니다. 커널의 프로세스를 나타내며 프로세스의 모든 상태 정보를 기록합니다. 이 구조는 Sched.h(includelinux)에 정의되어 있습니다. 회원void *stack
,它指向下面的内核栈结构体的“栈底”。 在系统运行时,宏current
获得的是当前进程的struct task_struct
구조가 있습니다.
(2) 커널 스택 구조 공용체 thread_union
으아악struct thread_info는 프로세스 컨텍스트 정보를 포함하여 프로세스 정보의 일부를 기록하는 구조입니다.
으아악핵심은 생성된 프로세스의 struct task_struct 구조를 가리키는 작업 멤버입니다
스택 멤버는 커널 스택입니다. 커널 스택 공간과 thread_info가 공간을 공유하고 있음을 알 수 있습니다. 커널 스택이 오버플로되면 thread_info가 파괴되고 시스템이 충돌합니다~~~
커널 스택—struct thread_info—struct task_struct 사이의 관계는 아래 그림에 나와 있습니다.
커널 스택 생성
프로세스가 생성되면 포크 계열의 시스템 호출은 커널 스택과 struct task_struct에 각각 공간을 할당합니다. 호출 프로세스는 다음과 같습니다.
Fork 계열 시스템 호출—>do_fork—>copy_process—>dup_task_struct
dup_task_struct 함수에서:으아악
Alloc_task_struct는 커널의 슬랩 할당자를 사용하여 생성될 프로세스에 대한 struct task_struct의 공간을 할당합니다
Alloc_thread_info는 커널의 파트너 시스템을 사용하여 생성될 프로세스에 대한 커널 스택(union thread_union) 공간을 할당합니다
뒤의 tsk->stack = ti; 문은 struct task_struct 및 커널 스택과 관련이 있습니다
setup_thread_stack(tsk, orig);에서 커널 스택과 struct task_struct가 연결됩니다:
으아악
커널 스택 크기
각 프로세스에는 커널 스택 공간이 할당되므로 많은 양을 할당하는 것은 불가능합니다. 이 크기는 아키텍처에 따라 다르며 일반적으로 페이지 단위로 측정됩니다. 실제로 위에서 본 THREAD_SIZE 입니다. 이 값은 일반적으로 4K 또는 8K입니다. ARM 아키텍처의 경우 이는 Thread_info.h(archarmincludeasm)에 정의되어 있습니다.
으아악
그러니까 ARM의 커널 스택은 8KB
(커널) 드라이버 프로그래밍 시 주의할 사항:
스택 공간의 한계로 인해 드라이버(특히 시스템 호출에 사용되는 하위 수준 함수)를 작성할 때 재귀 알고리즘, 로컬 자동 변수의 크기 등 많은 양의 스택 공간을 소비하는 코드를 피하는 데 주의해야 합니다. 정의 등
위 내용은 Linux 프로세스 커널 스택 이해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!