CPU 명령
OS를 만들면 8~90%는 C코드로 만들고 종속적인 부분은 어셈블리 코드로 만들 수 밖에 없음.
CPU 사이에 명령들의 호환성 없음.
초창기엔 이진코드로 명령
사용자들이 편리하게 사용할 수 있도록 어셈블러를 만들어 제공
논리주소 가상주소
메모리 인출 데이터 인출
명령어 가져와서 내부적으로 해석하고
명령어 사이클
명령어가 실행되는 순서 - 프로세서
코드 영역이 생김
데이타 영역이 생김(전역변수(모든함수에서 접근가능한 변수)들이 적재되는 공간)
힙 영역이 생김 - 말록(그때그때 필요한 함수 그때그때 필요한 메모리를 달라고 요청-동적 메모리를 할당받는 공간)
스택 영역이 생김 - 함수가 호출될 때 매개변수, 지역변수 등 저장/ 함수호출 될 때 함수 호출에 대비하기 위해 예비된 공간
스택
- 메모리의 일부를 스택으로 사용하도록 할당된 공간
- 운영체제는 각 프로그램에게 스택 공간 할당
프로세스 스택이라고도 불림
- 어떤 함수에서 시행되는 지역변수들 ( 지역변수는 함수가 시작될 때 시작했다가 함수가 끝나면 사라짐. )
- 스택포인터를 내려서
스택포인터
폴링 I/O
- programmed I/O라고도 함
초창기 컴퓨터에서 사용되던 IO 형태
비지 비트를 1로 설정
CPU가 장치 폴리에 너무 많은 시간을 사용, 정작 다른 유용한 작업을 수행하지 못하게 됨. 이 문제를 해결하기 위해 마이크로프로세서에서 인터럽트라는 신호선을 고안함.
CPU가 자기일을 하면됨. 인터럽트라는 신호선을 통해서
인터럽트 트랩
CPU는 하나의 명령어를 실행하고 다음 명령어를 실행하기 전에 인터럽트가 발생했는지 체크하게 되어 있음.
정확히는 interrupt-request line의 상태를 읽음.
인터럽트가 발생했으면, 현재 실행 중인 작업 (또는 프로세스)의 상태를 잠시 멈추고 인터럽트 처리
CPU context를 저장하고
지정된 처리 루틴(이를 interrupt handler라고 부름)으로 분기
해당 처리루틴을 완료하면 다시 저장된 CPU context를 원상 복구하고 이전 작업의 실행을 재개(resume)
인터럽트가 OS로 전송 위에서는 소프트웨어 OS에게 시스템콜을 하는데 이 또한 인터럽틀와 비슷한 개념. 소프트웨어가 OS에게 요청하면 인터럽트가 생기고 이를 트랩이라고 함.
현재의 cpu 내용을 어딘가에 보관을 해야함. 인터럽트 핸들러로 가기 전의 내용을 사진찍어두듯이 내용을 그대로 저장한 후 인터럽트 핸들러로 감. 갔다와서 보관했던 내용 그대로 다시 진행함.
CPU context는 어디에 보존하나
- 고정된 메모리주소(원시적)
- 장치별로 지정된 공간
- 시스템이 제공하는 스택공간
여러장치의 인터럽트를 지원하는 방법
- vectored interrupt system
- 각 장치마다 고유한 번호를 부여, 인터럽트와 함께 자신의 고유번호를 CPU에게 전달
예전에는 CPU가 인터럽트 하나한에게 너가 걸었냐 하고 물어봄. 지금은 인터럽트가 CPU에게 보내줌.
cpu와 I/o의 병행처리 과정
비활성화 할 수 없는 인터럽트
not-maskable 인터럽트
os는 사용자 프로그램을 실행시키고ㅡ 별다른 일이 없으면 idle loop에 들어감
ㅊ저전력모드로 들어감.