리눅스 커널의 스택에 대해서 질문드리고 싶습니다.

익명 사용자의 이미지

안녕하세요. 리눅스 커널을 공부한지 얼마 안된 학생입니다.

리눅스 커널에서 하나의 task를 생성할때, task_struct와 task 전용 커널 스택을 할당해준다고 알고 있습니다.

그런데 여기서 task_struct와 커널 스택을 할당해 주는 영역은 커널의 어떠한 섹션인가요? 슬랩 할당자로 관리되는 커널 힙 영역에서 할당되는 건가요?

또, 가상메모리상 유저 공간의 섹션은 stack, heap, bss, text 등의 섹션으로 나누어지는데, 리눅스 커널 이미지에서는 어떤 섹션들이 존재하나요? (x86_x64 기준)

리눅스 커널을 공부한지 얼마 안되어 질문이 좀 이상할 수도 있을 것 같습니다.

답변 주시면 감사하겠습니다!

AustinKim의 이미지

프로세스가 실행되는 과정에서 다음 함수들이 호출되는데요.

* _do_fork() 함수
* copy_process() 함수

copy_process() 함수에서 다음 함수를 호출해 프로세스의 task_struct 구조체와 스택을 프로세스에게 할당합니다.

* alloc_task_struct_node() 함수: task_struct 구조체 할당
* alloc_thread_stack_node() 함수: 프로세스에게 스택 공간을 할당

dup_task_struct() 함수의 구현부는 다음과 같습니다.

https://elixir.bootlin.com/linux/v5.4.63/source/kernel/fork.c
static struct task_struct *dup_task_struct(struct task_struct *orig, int node)
{
	struct task_struct *tsk;
	unsigned long *stack;
	struct vm_struct *stack_vm_area __maybe_unused;
	int err;
 
	if (node == NUMA_NO_NODE)
		node = tsk_fork_get_node(orig);
	tsk = alloc_task_struct_node(node);
	if (!tsk)
		return NULL;
 
	stack = alloc_thread_stack_node(tsk, node);

task_struct 구조체는 task_struct_cachep이라 슬랩 캐시로 관리되며, 관련 코드는 alloc_task_struct_node() 함수의 구현부를 참고하시면 됩니다.

https://elixir.bootlin.com/linux/v5.4.63/source/kernel/fork.c 
static struct kmem_cache *task_struct_cachep;
 
static inline struct task_struct *alloc_task_struct_node(int node)
{
	return kmem_cache_alloc_node(task_struct_cachep, GFP_KERNEL, node);
}

(개인블로그)
http://rousalome.egloos.com

익명 사용자의 이미지

며칠 전부터 Austinkim님 블로그 정독하면서 공부하고 있었습니다. 답변 주셔서 영광입니다.

설명 주신대로 task_struct는 슬랩 캐시에서 할당된다는 것을 이해했습니다. 그리고 커널 스택을 할당해준다는 alloc_thread_stack_node 함수를 찾아보니 vmalloc 할당자를 이용하는 것 같습니다.

그리고 혹시 질문 올린 내용인 가상 메모리상에서 커널의 섹션들은 어떻게 나누어지며 어떤 레이아웃을 가지고 있는지에 대해서도 답변 부탁드려도 될까요?
지금 보고 있는 책에 따르면 direct mapping space, ioremap space 등의 영역이 있는 것 같은데, 설명도 적고 맞는 설명인지도 잘 모르겠습니다.

감사합니다.

AustinKim의 이미지

정확한 질문의 의도를 파악하지 못해 아래와 같이 대략적인 커멘트를 남기니 참고하시면 좋겠습니다.

커널의 섹션 정보:

커널이 부팅을 할 때마다 아래와 같은 로그를 출력하는데, 이 로그가 어떤 함수에서 출력하는지 분석하시면 답을 찾으실 것 같습니다.

May 13 13:07:23 raspberrypi kernel: [    0.000000] Virtual kernel memory layout:
May 13 13:07:23 raspberrypi kernel: [    0.000000]     vector  : 0xffff0000 - 0xffff1000   (   4 kB)
May 13 13:07:23 raspberrypi kernel: [    0.000000]     fixmap  : 0xffc00000 - 0xfff00000   (3072 kB)
May 13 13:07:23 raspberrypi kernel: [    0.000000]     vmalloc : 0xbb800000 - 0xff800000   (1088 MB)
May 13 13:07:23 raspberrypi kernel: [    0.000000]     lowmem  : 0x80000000 - 0xbb400000   ( 948 MB)
May 13 13:07:23 raspberrypi kernel: [    0.000000]     modules : 0x7f000000 - 0x80000000   (  16 MB)
May 13 13:07:23 raspberrypi kernel: [    0.000000]       .text : 0x80008000 - 0x80800000   (8160 kB)
May 13 13:07:23 raspberrypi kernel: [    0.000000]       .init : 0x80b00000 - 0x80c00000   (1024 kB)
May 13 13:07:23 raspberrypi kernel: [    0.000000]       .data : 0x80c00000 - 0x80c8fd34   ( 576 kB)
May 13 13:07:23 raspberrypi kernel: [    0.000000]        .bss : 0x80c97108 - 0x80d478e4   ( 706 kB)

유저 프로세스의 가상메모리상 섹션은 프로세스(커널 기준) struct task_struct 구조체의 struct mm_struct 필드의 vma를 참고하시면 확인하실 수 있습니다.

(개인블로그)
http://rousalome.egloos.com

익명 사용자의 이미지

답변 감사드립니다. 한번 분석해보겠습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.