uftrace

- User 함수 뿐만 아니라 라이브러리, 커널까지 디버깅할 수 있는 Tracing Tool

명령어 예시

  • uftrace record -K 2 [프로그램 명]
    • record: 함수 추적하는 옵션
    • -K: 커널까지 추적하는 옵션
    • 2: 함수 depth. 최대 2개까지 호출 되는 것을 볼 수 있음
  • uftrace replay
    • 프로그램이 재시작이 되진 않음
    • record 한 결과를 토대로 함수에 대한 호출 흐름을 보여줌

 

 

 

'Linux' 카테고리의 다른 글

4-Level Page Table  (0) 2022.12.18
MMAP  (0) 2022.12.18
Page Fault 관련 정리  (0) 2022.12.15
리눅스 프로그램과 커널 프로그램  (0) 2022.12.09
리눅스 운영체제의 구성  (0) 2022.12.09

리눅스 커널


운영체제란, 커널과 디바이스 드라이버, 커맨드 쉘 혹은 유저 인터페이스, 그리고 기본적인 파일들과 시스템 유틸리티를 포함한다.
     커널은 시스템의 다른 모든 부분을 위한 기본적인 서비스를 제공하고, 하드웨어를 관리하며, 시스템 자원을 나눠준다.


커널은 5개의 기능 블럭으로 구분한다.

      • 프로세스 관리
      • 메모리 관리
      • 파일 시스템 관리
      • 디바이스 관리
      • 네트워크 관리






커널 코드의 구성은 다음과 같다.


디렉토리 

내용 

 arch

 CPU 종속적인 코드

 ARM, MIPS와 같이 프로세서마다 독자적인 하위 디렉터리 존재

 crypto

 암호화 API

 Documentation

 커널 하위 시스템에 대한 간략한 설명 

 drivers

 장치 드라이버와 주변 장치 컨트롤러

 fs

 파일 시스템 구현과 관련된 코드

 include

 커널 헤더 파일

 init

 커널 시작 및 초기화 관련 코드

 ipc

 프로세스 간 통신 관련 코드 ex. 메시지 큐, 세마포어, 공유 메모리

 kernel

 스케줄러, 인터럽트 처리, 락킹 등 기본 커널에서 아키텍처 중립적인 부분이 구현

 lib

 일반적인 Hashing, CRC (Cyclic Redundancy Code) 계산 함수 같은 라이브러리 루틴

 mm

 메모리 관리 구현 코드

 net

 IPv4, IPv6, 블루투스와 같은 네트워크 프로토콜

 scripts

 커널 빌드에 사용할 스크립트

 security

 보안용 프레임워크

 sound 리눅스 오디오 하위 시스템

 usr

 초기 유저 공간 코드




사용자 영역과 커널 영역

        • 사용자 영역

          • 응용 프로그램이 동작하기 위해 사용되는 메모리 공간
            • stack 영역
               - 프로그램 시행시 지역 변수나 환경 변수와 같은 변수들이 위치
            • heap 영역
               - 동적 메모리 할당 영역
            • bss 영역
               - 초기화 되어 있지 않은 전역 변수나 정적 변수들이 저장.
               - 로더에 의해 메모리로 적재될 때 공간을 확보한 후, 0으로 초기화
            • data 영역
               - 초기화되어 있는 전역 변수들이 저장
            • text 영역
               - 프로그램 코드(함수나 일반 처리문 등)와 읽기 전용 데이터(상수)로 이루어짐

        • 커널 영역

          • 운영체제가 실행되기 위해서 필요한 메모리 공간



커널에 자원 처리를 요청하는 방법 

        • 시스템 콜 방식
          • 소프트웨어 인터럽트
          • 응용 프로그램으로 하여금 하드웨어나 다른 운영체제 리소스를 접근할 수 있게 해준다.
시스템콜에 대한 이미지 검색결과


        • 시스템 콜 핸들러

          • 유저 공간의 응용 프로그램이 직접 커널 코드를 호출하는 것은 불가능

          -> 커널은 보호된 메모리 공간에 있으므로 시스템이 커널 모드로 전환되어야 함


          • 소프트웨어 인터럽트
            • 유저공간에서 커널 모드로 진입하기 위해 exception이 발생하면 시스템은 커널 모드로 전환되어 exception handler를 실행한다.
            • 이 핸들러가 시스템 콜 핸들러가 된다.


          • 시스템 콜 핸들러 open() 수행과정
            1. test.c main()에서 open() 호출
            2. libc.a에서 open()
              시스템콜의 고유번호를 eax 레지스터에 저장
              SW 인터럽트 발생
            3. ARM에서 system_call() 명령이 저장된 vector table 참조
            4. vector_swi()에서 open() 명령의 번호를 참조하여 sys_open() 호출
            5. sys_open()은 dev_open()을 호출하면서 실제 open  명령을 수행



리눅스 부팅 과정

      1. Power on
      2. ROM-BIOS 프로그램 실행

            • BIOS (Basic Input/Output System): 메모리의 특정 번지로 자동 로드되어 실행됨
            • POST(Power On Self Test) 수행

                  • 장착된 H/W가 인식됨. (예: 시리얼 장치, 마우스 장치, 사운드 장치)
                  • H/W의 물리적인 손상체크와 초기화가 병행
            • 부팅 매체 (Disk, CD_ROM 등) 검색
            • MBR(Master Boot Record)를 읽어, 부트로더(GRUB)를 로드시킨다.
      3. GRUB  실행(부트로더 실행)

            • 부팅메뉴 선택
              • /boot/grub/grub.conf 파일
              • kernel 이미지 로드
              • swapper 프로세스 호출
      4. swapper 프로세서 (PID=0)

            • 커널 이미지 압축을 해제
            • 각 장치 드라이브들을 초기화
            • 루트( / ) 파일 시스템을 read-only로 마운트
            • 파일시스템 검사
            • 루트( / ) 파일시스템을 read-write 모드로 마운트
            • init 프로세스 (PID=1)
      5. init 프로세스 (PID=1)

            • 리눅스에서 모든 프로세스는 그 실행과 함께 설정파일을 읽어들인다.
            • init 프로세스는 /etc/inittab이라는 설정 파일을 읽어들여 무엇을, 어떻게, 언제 실행할 것인가를 결정하여 커널 서비스 시작




출처 http://cheonee.tistory.com/entry/리눅스-커널과-디바이스-드라이버

출처 http://cherub.sungkyul.edu/~web/jinboard/files/63_boot.pdf

출처 http://www.linuxlab.co.kr/docs/5-2.htm

출처 http://yongho1037.tistory.com/563

출처 http://young3276.tistory.com/4

 


+ Recent posts