✨ User mode vs Kernel mode
User mode
- 애플리케이션이나 사용자 프로세스가 실행되는 공간
- 프로세스가 제한된 엑세스 권한 가짐
- 프로세스 분리로 다른 프로세스에 영향을 주지 않음
Kernel mode
- 프로세스가 하드웨어,메모리 등에 제한 없이 엑세스
- 커널 모드에서 충돌이 발생하면 전체 시스템 다운
- 커널 모드는 모든 프로세스가 공유하는 단일 공간
- OS에 시스템콜을 통해 커널 모드 기능 사용
- ex) open/write/read/close/malloc/free 등
- 시스템 자원 엑세스를 허용하는 특권
- 시스템콜을 한다고 하더라도 모든 커널 영역에 접근할 수 있는것은 아님
사용자 모드와 커널 모드 간의 전환 (context switch)
- 서로 다른 권한 수준 간의 전환으로 CPU의 모드와 컨텍스트를 전환
- 많은 시간이 걸리고 리소스가 많이 소모
✨ Register vs Memory
Register
- CPU 내부에 위치한 임시 저장소
- 매우 빠르고 CPU가 즉시 처리해야하는 데이터나 명령어 저장
더 자세한 레지스터 종류는 아래에서 확인
Memory
- 주로 메모리는 RAM(Random Access Memory)를 의미
- 프로그램이 실행되는 동안 데이터를 일시적 저장
- 프로그램 코드와 데이터를 일시적으로 저장
- 종류 : 메인 메모리 / 캐시 메모리 / 보조 기억 장치
✨ User Stack
- 프로세스가 사용자 모드에서 실행되는 동안 저장하는 메모리 영역
- 함수 호출 스택 프레임 관리
- 함수 호출될 때마다 Stack frame 생성
- 현재 실행 위치와 리턴 주소가 스택에 저장되어 함수 종료 후 복귀 가능
- 함수가 실행되며 지역 변수와 매개변수가 저장된 스택 프레임 내 접근 가능
- 함수 종료되면 해당 스택 프레임 삭제
- 스택 포인터는 이전 프레임으로 이동
- 함수 호출될 때마다 Stack frame 생성
- 함수 외부에서 임시 데이터 저장
- 일부 어셈블리 코드 또는 최적화된 코드
✨ Kernel Stack
- 시스템 호출, 인터럽트 처리, 예외 처리에 사용
- 사용자 모드에서 커널 모드로 전환될 때 커널 스택 활성화
- 커널 모드에서만 사용 가능하고, 커널 모드 종료 시 초기화
- 고정 크기 제한 (상대적으로 작은 크기로 유지)
✨ System Call
- 사용자 모드 프로그램이 커널의 기능과 자원 사용
- 운영체제는 시스템 콜로 특정 기능을 제한하여 무분별한 사용 방지
- 시스템콜은 트랩이라는 CPU명령으로 커널모드 전환
- 트랩은 소프트웨어 인터럽트
- 시스템콜의 종류
- 프로세스 관리 (fork, exec, exit, wait 등)
- 파일 시스템 관리 (open, read, write, close 등)
- 메모리 관리 (mmap, brk, sbrk 등)
- 장치 관리 (ioctl, read, write 등)
- 네트워크 관리 (socket, connet, send, resv 등)
- 시스템 정보 관리 (uname, sysinfo 등)=
🔗 트랩
- 인터럽트, 예외, 시스템 콜 모두 트랩을 통해 CPU가 커널 모드로 전환
- 시스템 콜
- 프로그램이 read/write 같은 요청하면 트랩 명령을 실행하여 커널 모드로 전환
- 프로세서에서 오류나 특수 조건 발생했을 떄 예외 처리
- ex) 0으로 나누기, Page Faurt, 잘못된 메모리 접근
- 예외 발생 시 트랩을 통해 커널모드로 전환되어 오류 처리 또는 해당 프로세스 중지
- 예외는 주로 소프트웨어 상황에 발생
- 인터럽트
- 하드웨어 장치에서 요청 발생 시 CPU가 현재 작업 중단
- 인터럽트는 주로 외부 하드웨어에 의해 발생
- 타이머 인터럽트
✨ File descriptor
- 프로세스가 열고 있는 파일에 대한 정보
- 프로세스는 FD를 통해 파일에 접근
- 파일 디스크립터 테이블은 FD와 파일 객체에 대한 포인터 매핑
- 파일 디스크립터 테이블은 커널 영역에 존재
- 각 프로세스는 자신만의 FD 테이블을 가져서 프로세스 간의 파일 접근 격리
- 여러 프로세스가 동일한 파일을 열더라도, 각 프로세스는 개별적인 FD 테이블를 할당 받음
- 커널의 파일 객체 공유
- 여러 프로세스가 열 때, FD 테이블에서 가리키는 파일 객체는 하나만 생성하여 공유
"유닉스의 모든 것은 파일이다."
OS에 거의 모든 자원을 파일 처럼 다룸
- 일반 파일
- 우리가 생각하는 보통 파일 (텍스트 파일, 바이너리 파일 ,이미지 마일)
- 저장된 데이터가 연속된 바이트로 구성
- 데이터를 읽거나 쓸 수 있음
- .txt, .c, .jpg, .bin 등
- 디렉토리
- 폴더 (디렉토리 역시 파일)
- 폴더는 다른 파일들의 목록을 가짐 (신기함!)
- 목록의 형태는 파일의 이름과 파일의 인덱스로 구성
- 다른 파일들에 비해 공간을 적게 필요
- /home, /etx, /usr 등
- symbolic link
- 파일 자체는 작은 크기의 파일
- 참조 대상의 파일 경로를 포함
- "바로가기 "와 비슷함
- 원본 파일과 링크 파일의 위치가 다를 수 있음
- FIFO special
- 프로세스 간 순차적인 데이터 전송을 위한 특수 파일
- socket
- 소켓 파일은 네트워크 통신을 위한 파일
- 소켓 파일을 통해 네트워크 연결 설정
- 장치파일
- 문자 장치 (터미널, 키보드)
- 하드웨어 장치와의 상호작용을 위한 인터페이스
+ 추가적으로 ELF 파일에 대해 알고 싶다면 아래 포스팅으로 !!
✨ Cache
- 데이터 접근 속도를 높이기 위해 사용
- 일반적으로 테이블 형태로 구성
- 데이터를 일시적으로 저장해두는 고속 임시 저장소
- 컴퓨터 시스템의 여러 계층에서 활용
- CPU 캐시, 디스크 캐시 , 웹 캐시
- 캐시 히트 / 캐시 미스 / 교체 정책
- 교체 정책 : 새로운 데이터를 캐시에 저장할 공간이 부족하면 기존 데이터 삭제하고 새로운 대이터 저장
- 공간 지역성 / 시간 지역성
✨ Atomic Operation
- 중단되지 않고 한 번에 수행되는 연산
- 실행 도중 다른 연산이 끼어들거나, 불완전하게 중단되지 않음
- 다중 스레드 환경에서 안전하게 수행
✨ rax register
- x86-64 아키텍처쳐에서 사용하는 범용 레지스터
- 주로 연산의 결과를 저장하는 용도로 사용
- RAX는 64비트 레지스터로, 이전의 EAX 32비트 레지스터를 확장한 형태
- 이전 하위 레지스터와도 호환 가능
- RAX(64비트), EAX(32비트) , AX (16비트) , AL (8비트)
mov rax, 5 ; RAX에 5를 저장
✨ 32 bit OS vs 64 bit OS
32 bit
- 운영체제는 2^32의 메모리 주소 참조 (약 4GB RAM)
- 실제로는 커널에 사용하는 메모리 공간을 제외해야 해서 약 3~3.5GM RAM 활용
- CPU가 한번에 32비트 크기의 데이터 처리 (4 바이트)
- 32비트 애플리케이션만 실행 가능 (64비트 아키텍처가 다르기 때문)
- 메모 접근이 상대적으로 제한적 → 대규모 데이터 처리에 효율이 떨어짐
64 bit
- 운영체제는 2^64개의 메모리 주소 참조
- 이론적으로 64비트 아키텍처는 매우 큰 메모리 공간을 다룰 수 있음
- CPU가 한번에 64비트 크기의 데이터 처리 (8바이트)
- 64비트 애플리케이션 지원하고 32비트 애플리케이션도 호환 모드를 통해 실행 가능
- 고성능 컴퓨터와 서버에는 64비트 OD가 적합
- 사용 가능한 메모리 한계 내에서 메모리 자유롭게 사용
✨ Interrupt
- CPU가 현재 작업을 일시 중단하고 특정 이벤트나 요청을 처리하도록 하는 신호
- 주로 외부 장치나 소프트웨어의 요구에 즉각 대응에 사용
- 비동기적 이벤트
- CPU가 일정한 순서대로 작업 중 외부 장치나 특정 프로그램에서 요청 발생
- 인터럽트에 우선순위가 있어, 더 중요한 인터럽트 먼저 처리
- 하드웨어 인터럽트
- ex) 키보드, 마우스, 네트워크 패킷 수신
- 소프트웨어 인터럽트
- ex) 입출력 요청, 메모리 할당 요청, 프로세스 생성
- 예외
- ex) 0으로 나누기, 잘못된 메모리 접근, 페이지 폴트
✨ Sementation Fault
- 잘못된 메모리 접근을 시도할 때 발생하는 오류
- 허용되지 않은 메모리 영역을 읽거나 쓰려 할 때 발생
- CPU가 허용되지 않은 메모리 주소에 접근하려 할 때 운영체제가 감
- 세그멘테이션 폴트 발생 원인
- NULL 포인터 역참조
- 잘못된 주소 접근
- 배열 인덱스 초과
- 해제된 메모리 접근
- 읽기 전용 메모리 영역 쓰끼
- 스택 오버 플로우
'크래프톤 정글' 카테고리의 다른 글
Pintos Project2 - User Program 흐름 잡기 (0) | 2024.12.01 |
---|---|
Pintos Project2 - User Program (커널/사용자 모드 이해하기) (0) | 2024.11.26 |
Pintos Project2 - ELF 파일 (0) | 2024.11.21 |
Pintos Project1 - 스레드 전반적인 흐름 잡기 (0) | 2024.11.11 |
Pintos Project1 - Priority Scheduling (2) (0) | 2024.11.07 |