file system에서 실행파일이 file형태로 저장되어있다가, 뭐 더블클릭을 한다던지, 실행버튼을 누른다던지 이렇게 파일을 실행시키면 메모리에 올라가서 프로세스가 된다.
그런데 이 중간에 한단계가 더 있는데 virtual memory라는게 있다.
각각의 프로그램들은 자기만의 메모리의 0번지부터 쭉 올라가는 메모리 주소가있고,
당장 필요한 부분은 물리적인 메모리에 올라가고 전체 address에서 당장 필요하지
않는부분은 disk의 swap area에 내려가게된다.
즉, physical memory는 cpu가 가져다가 쓰니까 0번지부터 쭉 올라가게되고
버츄얼 메모리에는 각 file마다 0번지부터 잇으므로, 현재 동일한 프로그램 A더라도,
physical memory의주소와 버츄얼 메모리의 주소값이 다르다.
이를 해결하기위해서 address translation을 쓴다.
이 Address space를 자세히 보면
Stack,Data,Code 3가지 영역으로 구성되어있다.
그런데 보면, 커널도 stack data code로 이루어져있다.
근데 아까부터 커널 커널 하는데 커널이 뭐냐?
커널은 이제 운영체제에서 중요한 소프트웨어로, 하드웨어의 자원이 필요한 프로세스로 나눠주고, 프로그램이 운영체제에 요구하는 시스템 콜등을 수행하는 부분이다.
이렇게 말하면 좀 어렵고, 풀어설명하면, 프로그램이 io를 직접할수없다.
왜? io접근은 특권명령이니까 그래서 system call을 갈기고, 그다음 os로 cpu제어권이 넘어간다음에 os의 code(파일을 읽어와서 반환하는 내용이 담김)를 실행해서 또 파일을 읽어와서 반환하고 이러한 일련의 과정에서 커널이 이제 os파트에서 disk에서 자원=>읽고자하는 파일을 프로세스에 나눠주는 역할을 하게 된다.
data에는 모든 하드웨어를 관리하기 위해서 필요한 자료구조도 있지만
시스템 안에서 돌아가는 프로세스를 관리하기위한 자료구조 pcb가 있다. pcb에 대한
자세한 내용은 다음 챕터에서 설명될 것이다.
예를 들어 만약에 10개의 프로세스가 돌아가고있으면 OS는 pcb를 10개만들어서 관리하게 된다.
stack은 약간 특이한 구조인데,
프로그램 a가 실행되다가, 운영체제한테 io를 해달라하면, 앞에서 말했던것 처럼 cpu제어권넘어가고 OS내부의 코드에 의해서 수행이된다. 근데 어차피 이 코드도 결국 함수형태로 되어 있을것이다. 그러므로 어떤 함수가 다른 함수를 호출하면 스택을 써야한다. 그러므로 프로그램 A가 요청을 했으면 프로그램 a의 커널스택을 사용하고, 프로그램B가 요청했으면 프로그램 B의 커널 스택을 사용하게된다.
고로, 커널로 들어오기전에 어떤 프로그램이 요청했느냐에 따라 다르게 커널 스택을 사용하게된다.
우리 맨처음에 modebit이라는걸 기억하는가 운영체제[컴퓨터 시스템 구조]편에서 살짝 설명해주고 넘어갔다.
user모드에서는 당연히 io가 불가능하다 특권명령이니까, 고로 제한되 기계어를 수행하도록 modebit을 1로 설정해준ㄷ고 하였는데,
라이브러리 함수나, 사용자 정의 함수를 쓰면, user공간에서 접근하는 것이므로 usermode로 실행된다.
그러나 IO작업을 하게되면, systemcall을 수행하고 그러면 그림과 같이 cpu제어권이 운영체제로 넘어가서 커널모드로 전환되고 운영체제의 주소공간에 있는 코드가 실행되는것이다. 그러면 이때는 modebit이 0인것이다.
아래의 그림과 같이 프로그램은
usermode->요청에따라 kernelmode->반환되면 usermode->kernelmode를 반복하다가 프로그램이 종료되는 일련의 과정을 거치게 된다.