리눅스도 C로 만들어 졌는데 Stack에 대한 궁금증

googolhkl의 이미지

C에서 함수를 작성하면 그 함수의 변수들은 Stack 저장 되는데
리눅스도 C로 작성되었기 때문에 따로 변수들이 저장되는 곳이 Kernel Stack이라고 알고 있습니다
근데 여기서 궁금한게 그 Kernel Stack은 또 어디에 저장되는지 궁금합니다

shint의 이미지

정확한건 책 봐야 할거 같습니다.

10진수 4294967296 = 2^32 = 1024 x 1024 x 4096 (32비트 == 4바이트)
2진수 100000000000000000000000000000000 (32비트 == 4바이트)
16진수 100000000 == FFFFFFFF == 0xFFFFFFFF (32비트 == 4바이트)

메모리 주소에 크기'가 이렇다면.

#include <stdio.h>
 
int main(int argc, char ** argv)
{
    int a;
    printf("%x\n", &a);
    return 0;
}
 
출력
fff61a6c   //0x00000000 ~ 0xFFFFFFFF 사이에서 사용하는. 메모리 주소의 위치

이렇게 해보면. 해당 메모리 주소를 알 수 있을겁니다.

메모리를 네모난 상자로 생각해본다면. 메모리에 위치'를 알 수 있을겁니다.

메모리 주소
http://www.google.co.kr/search?q=%EB%A9%94%EB%AA%A8%EB%A6%AC+%EC%A3%BC%EC%86%8C&safe=strict&hl=ko&gbv=2&prmd=ivns&source=lnms&tbm=isch&sa=X&ved=0ahUKEwiK-JrtmdjJAhUFo5QKHetoBYsQ_AUIBQ

강의
http://olc.kr/main/index.jsp

검색해보기

kernel stack
http://book.naver.com/search/search.nhn?sm=sta_hty.book&sug=&where=nexearch&query=kernel+stack

kernel stack
http://search.naver.com/search.naver?sm=stb_hty&where=se&ie=utf8&query=kernel+stack

------------------------------------------------------------------------------
별 상관은 없지만. 0 이 하나 부족했는지. 2GB 로 잘못 적었네요.
10진수 2147483648 = 1024 x 1024 x 2048 = 2,147,483,648 = 2GB (31비트??)
2진수 10000000000000000000000000000000 (31비트??)
16진수 80000000 (31비트??)
------------------------------------------------------------------------------

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

googolhkl의 이미지

여러 자료를 더 찾아봐야겠네요!

googolhkl의 이미지

여러 자료를 더 찾아봐야겠네요!

goforit의 이미지

> 리눅스도 C로 작성되었기 때문에 따로 변수들이 저장되는 곳이 Kernel Stack이라고 알고 있습니다

일반적인 Application 프로그램 (User Space - C 프로그램) Kernel Stack을 사용하지 않습니다.

Linux의 Process는 크게 두 개의 Stack을 사용합니다.
#1 Application Stack : 이 부분은 구글에서 keyword "vm_area_struct" 를 찾아보세요.
이 구조체 안에 있는 스택이 프로그램 로딩시 사용하는 것입니다.
이 부분을 더 구체적으로 이해하기 위해서는 Dynamic linker 의 개념을 공부하는 것이 도움이 됩니다.

#2 Kernel Stack : 이 부분은 구글에서 keyword "task_struct" 찾아보세요.
이 스택은 Program이 커널 모드 진입에서 동작할 때 사용되는 stack 입니다.

googolhkl의 이미지

제가 아직 가상메모리쪽을 공부를 안해서 해봐야겠네요
감사합니다!

shint의 이미지

Kernel Stack Size 12Kb 인 이유
http://process3.blog.me/20048085382

Exploiting Stack Overflows in the Linux Kernel
https://jon.oberheide.org/blog/2010/11/29/exploiting-stack-overflows-in-the-linux-kernel/

vm_area_struct
http://search.naver.com/search.naver?ie=utf8&sm=stp_hty&where=se&query=vm_area_struct
http://www.codeproject.com/search.aspx?q=vm_area_struct&x=9&y=7&sbo=kw
http://book.naver.com/search/search.nhn?sm=sta_hty.book&sug=&where=nexearch&query=vm_area_struct
http://www.google.co.kr/search?hl=ko&source=hp&biw=&bih=&q=vm_area_struct&gbv=2&oq=vm_area_struct&gs_l=heirloom-hp.12..0l5j0i30l5.1285.1285.0.2953.1.1.0.0.0.0.122.122.0j1.1.0....0...1ac..34.heirloom-hp..0.1.122.3Rn-jh3yhCM

task_struct
http://search.naver.com/search.naver?sm=stb_hty&where=se&ie=utf8&query=task_struct
http://book.naver.com/search/search.nhn?sm=sta_hty.book&sug=&where=nexearch&query=task_struct
http://www.google.co.kr/search?q=task_struct&hl=ko&biw=&bih=&gbv=2&oq=task_struct&gs_l=heirloom-serp.12...71550.71550.0.72102.1.1.0.0.0.0.0.0..0.0....0...1ac.1.34.heirloom-serp..1.0.0.7S5MRgQXnVI

Kernel Stack
http://search.naver.com/search.naver?sm=stb_hty&where=se&ie=utf8&query=Kernel+Stack
http://www.codeproject.com/search.aspx?q=Kernel+Stack&doctypeid=1%3b2%3b3%3b13%3b14
http://book.naver.com/search/search.nhn?sm=sta_hty.book&sug=&where=nexearch&query=Kernel+Stack
http://www.google.co.kr/search?q=Kernel+Stack&hl=ko&biw=&bih=&gbv=2&oq=Kernel+Stack&gs_l=heirloom-serp.12..0l10.44381.44381.0.44863.1.1.0.0.0.0.156.156.0j1.1.0....0...1ac..34.heirloom-serp..0.1.156.Oq8Yl9_q66k

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

jw8704의 이미지

kernelstack 이란게 있었네요..

Necromancer의 이미지

리눅스가 많이 돌아가는 인텔 x86 기준으로 설명드리자면 user stack과 kernel stack은 철저하게 분리되어 있습니다. CPU 하드웨어에서 아예 그렇게 되게 만들어 놨습니다.
user stack은 user mode로 돌아갈때 사용하고, kernel stack은 kernel mode로 돌아갈 때 사용하게 되어 있습니다. CPU 내부에서 프로그램이 실행될 때에 권한(Ring Level)이 있기 때문에 자동으로 구별됩니다. 권한 많은 kernel mode에서는 user stack을 보통 메모리처럼 접근하는게 가능하지만 그 역은 안되게 되어 있습니다.

user mode에서 시스템콜을 해서 kernel mode로 진입하는순간 CPU는 스택관련 포인터들을 다 커널것으로 바꿔버립니다. 이때 kernel stack에는 user mode로 복귀할때 사용할 스택포인터가 저장되게 되어 있습니다. 시스템콜 명령 한방에 이 모든 것이 자동으로 일어납니다.

어셈블리로 보호모드 프로그래밍 해보신 분이라면 뭔소린지 알겁니다.

Written By the Black Knight of Destruction