ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • cow 아키텍처, 좀비프로세서(defunct), 시그널(signal), core dump, 실행파일포맷(ELF 포맷)
    시스템프로그래밍 - 리눅스 2022. 12. 19. 18:57
    728x90
    반응형

     C.O.W 아키텍처

     C.O.W 아키텍처
     fork()시스템콜을 동작시킬때 사용되는 아키텍쳐는
    C.O.W 아키텍쳐
    Copy On Write
    쓰기동작할때 복사한다.
    복사할때 메모리에 쓰는작업이기 때문에 사이즈가 커지면 시간이 길어진다
    그래서 그때끄때 필요한 부분만 복사해서 쓰자 해서 만들어진게
    카우 아키텍쳐이다.
    text는 기본적으로 복사한다
    data는 전역변수가 없다면 복사안한다. 전역변수가 있어도 쓰이지 않으면 복사안하고 쓰일떄만 복사한다.


    fork()로 프로세스를 복사할때 복사할 것들은 커널에서 결정
    카우아키텍처와 디멘드온페이징기법으로
    보통 커널에서 프로세서(task)를 생성할때 원본메모리를 백업을 해놓고 프로세서에게 데이터를 할당후
    수행하게된다
    그 백업에서 필요한 데이터들을 가져다 쓰는게 카우 아키텍처

     좀비프로세서

     좀비프로세서
     ps를 쳤을때
    <defunct>가 나온 프로세서들은 좀비프로세서라고 한다.
    부모가 슬립중이면 자식프로세서가 죽은것을 처리를 못하기때문에 좀비프로세스가 된다.


    gcc fork9.c
    ./a.out
    ps -ef | grep a.out | grep -v grep
    보통 자식프로세서가 죽으면 알아서
    SIGCHLD(시그챠일드)(나 뒤졌음)이라는 신호가 날아감
    누구에게? 부모에게 패륜을 저지름

     시그널(Signal)

     시그널(Signal)
     시그널(Signal)
    Linux System Programming에서 시그널이란
    무선신호나 전기신호등의 아날로그 신호를 의미하지 않는다.
    그냥 프로그래밍 상에 약속된 용어 같은거라고 생각하면 되겠다.
    뭐..... 눈빛 교환도 일종의 시그널이라고 볼 수 있다.


    abort()는 SIGABRT라는 신호를 발생시키고
    자식프로세스가 죽으면 SIGCHLD라는 신호를 발생시킨다.
    중요한 것은 signal 방식을 맞아서 프로그램이 종료되면
    이것은 비정상 종료로 분류가 된다는 것이다.
    어떤 신호를 맞아 죽었는지 판단을 할 필요가 생기게 된다.


    wait(&status)는 블록시스템콜
    exit(7)로 인해 자식으로부터 시그널을 받을떄까지 기다린다.
    앞의 8비트가 정상종료 이기때문에 쉬프트8을 해주므로
    7*2^8이 status로 출력될것이다.
     
    앞의 8비트가 정상종료 뒤에 8비트가 비정상 종료
    ->WEXITSTATUS(status); 정상종료시그널을 원래대로 시프트해주는 기본매크로




    abort()함수 시그널이다.
    abort()는 시프트를 안하고 신호를 준다.




    신호를 보내면 그 신호는 커널로 가게되고 커널은 그 신호에 대한 처리를 해주고 
    wait하고 있는 프로세스가 있으면 그신호를 전달해주고 끝나게 된다.
    wait는 wait를 한 뒤 가장 먼저 들어오는 신호를 전달해준다.

     

     core dump(코어 덤프) by wiki

     core dump(코어 덤프) by wiki
     코어 덤프(core dump), 메모리 덤프(memory dump), 또는 시스템 덤프(system dump)[1]는 보통 프로그램이 비정상적으로 종료(충돌)되는 때와 같은 특정 시점에 컴퓨터 프로그램에 기록된 작업 메모리로 구성된다.[2] 실제로, 프로그램 카운터와 스택 포인터, 메모리 관리 정보, 기타 프로세서와 운영 체제 플래그 및 정보 등을 포함한 프로세서 레지스터같은 프로그램 상태의 중요 부분들이 대개 동시에 덤프 된다. 코어 덤프는 종종 컴퓨터 프로그램의 오류를 진단하고 디버깅하는 데 사용된다. 


    $ stty -a : Terminal Environment를 보여주는 명령어다.
    $ ulimit -c : Core Dump File의 크기를 결정한다.
    ex) $ ulimit -c 10000  : 10000바이트까지 담겠다.
    core파일 -> 어느시점에 어떤에러가 있는지 정보를 담고있다.

     

     실행 파일 포맷 (ELF 포맷)

     실행 파일 포맷 (ELF 포맷)
     *실행 파일 포맷
    윈도우는 PE 포맷, 리눅스는 ELF 포맷이라고 한다.
    readelf명령어는 리눅스의 실행 파일 포맷과 관련하여
    실행파일 자체를 굉장히 디테일하게 살펴볼 수 있게 해주는 명령어다


    실행 파일도 포맷을 가지고 있다보니
    헤더, 바디(몸통), 그외에 여러가지 섹션들을 가지고 있다.
    우선 readelf -h '실행파일명'을 수행하게 될 경우
    ELF Header 라는 것을 볼 수 있는데
    여기를 보면 실행 파일이 x86용인지 ARM용인지 확인할 수 있다.


    Core Dump에서 core라는 파일도
    포맷은 엄밀하게 ELF에 해당하긴 한다.
    좀 더 자세한 부분은 커널을 하게 될때 살펴보도록 하겠다.


    readelf -S '실행파일명' : 데이터 텍스트영역등을 볼수 있다.
    .plt .plt.got 시스템콜을 불러오는 놈들

     

     

     

    728x90
    반응형

    댓글

Designed by Tistory.