cpu 는 어떻게운영체제를 읽어내는가여...?
글쓴이: jjjjrr / 작성시간: 금, 2005/06/03 - 12:07오전
안녕하세요
프로그래밍 코드를 cpu 가 어떻게읽는지
그원리를 알고싶읍니다
질문이 좀 이상한데여
c 든 c++ 이든지 이용해서 프로그램을 만들면
운영체제에의해서 실행이되는데여
운영체제없이 cpu 가 프로그램코드를 읽게하는것은 어떻게하는건가여
그러니까
운영체제도 하나의 프로그램일텐데여 (프로그램코드의 집합)
cpu 는 어떻게운영체제를 읽어내는가여...?
그리구
보통 운영체제깔때
플로피디스켓에 도스프로그램이있는데여
프로그램소스좀 구할수없을까여
한번살펴보고싶읍니다
조언부탁드립니다
Forums:
모자란 답변이지만.....
CPU가 구분하는 것이 아니라, 처음에 운영체제가 로딩되면서, 환경을 조성하고, 그 환경을 CPU에 알려주는 형식이라고 생각합니다.
처음 부트루틴의 경우, 간단한 구조로는 제작해보았기에, 말씀해드립니다. (진짜.. 간단하게 만들었어요.)
처음 부팅하면.. 디스크의 부트섹터(0번 512byte)를 읽어내는데요. 보통 운영체제는 점프 루틴을 써서 실제 커널 있는 위치로 점프시켜 줍니다. 여기서 커널이 실행권을 받아가지고.. 메모리 매핑하고.. 여러 환경설정을 한 후에, 프롬프트나 사용자의 입력을 대기하는 상태가 되는 겁니다.
전... 능력이 모자란지라..
그냥 16비트 어셈블리로 코딩했었는데...
511와 512바이트를 AA55였던가... 넣어주면..
부트코드로 인식하는 것으로 압니다.
나머지는 매핑된 상태가 아니기에, 상대적인 변수같은 것은 사용할 수가 없구요.. 기준을 잡아서 매핑을 해 나가신 후... 잡으시면 됩니다.
모... 이런 구조로 되어있던데요. ^^ㅋ
도움이 되셨는지 모르겠네요..
흠. 처음에 OS가 동작하는 원리 등은 웹에서 찾아보면 많이 나오지만..
흠. 처음에 OS가 동작하는 원리 등은 웹에서 찾아보면 많이 나오지만...
대충 다음과 같습니다.
1. 전원이 들어옴.
2. CPU의 RESET pin 작동.
3. CPU의 중요 레지스터들이 특정 값으로 자동초기화.
4. 메모리의 0xfffffff0 (물리적 주소)의 코드, 즉 BIOS가 실행됨.
5. BIOS가 각종 하드웨어 초기화.
6. 부트 디스크의 첫번째 섹터를 메모리에 로드.
7. 0x00007c00의 메모리로 점프하여 실행. 일반적으로 부트로더가 시작됨.
8. 부트로더가 디스크 정보를 메모리에 구성.
9. 구성한 디스크 정보를 이용하여 디스크의 특정 위치부터 시작하는 커널 이미지를 메모리에 로드.
10. 로드한 커널 메모리의 특정 위치로 점프하여 실행. 리눅스라면 여기서 setup() 이 실행되고, protected mode로 전환 후 뒤이어 startup_32()가 실행됨.
11. 마지막으로 start_kernel()이 실행됨. 각종 모듈과 환경을 초기화 한 후, 필요한 프로세스를 실행.
만약 OS의 도움없이 프로그램을 바로 실행하겠다 싶으면, OS가 초기에 하는 짓을 다 하고 실제 프로그램이 할 짓을 수행하는 코드를 짜서 디스크의 첫번째 섹터에 넣고 부팅하시면 됩니다.
OS가 프로그램 실행시키는 것도 크게 다르지는 않습니다. 환경이 이미 갖추어져 있어서 편하게 로드하고 실행할 뿐이죠. :)
컴퓨터 구조에 대해서...
컴퓨터 구조
Computer Architecture
에 대해서 공부하시면 알 수 있을거에요 ^^
Embedded System 이나...
CPU(microprocessor라고 하는게..)가 자동으로(스스로?)
CPU(microprocessor라고 하는게..)가 자동으로(스스로?) 할 수 있는 일은
자신의 레지스터중 특별한 기능을 수행하는 즉, 다음에 수행해야 할 명령 1개를 지칭하는 레지스터 - 어디서는 PC(Program Counter)라고하고, 어디서는 IP(Instruction pointer), IR이라고도 하고, 그때그때 다른데... - 가 가리키는 명령 주어다가 돌리고, 자동으로 1증가(다음명령으로) 하는 것 외에 별다른
동작을 하지 못합니다.
1) 보드에 전원들어옴
2) CPU의 지네발(?)중 reset핀에 시그널이 들어옴
3) CPU는 하드웨어(CPU)제작자가 초기 세팅한 값들로, 레지스터들을 세팅
*특히, x86의 경우, 리얼모드로 초기화되고, 각종 레지스터를 세팅
특히, CS:IP (이게 위에서 pc,ip,ir이라고 한것임) 를 FFFF 및 0000으로 각각 세팅하고 이는 메모리 번지 0xffff0를 가리키게됨
4) Von Neumann방식이므로 , x86은 0xffff0번지에서 명령을 1개 읽어서 CPU로 가져오고(fetch), 인다이렉트사이클등을 하고, 이를 실행한다.
중요하게도 자동으로 명령실행과 동시에 CS:IP는 다음명령을 가리키게된다는....(+1)..
* 음, CPU는 +1을 자동으로 한다는.... 막강한 기능을....가진다는...
5) 그리고 다시 CS:IP가 가리키는 명령 가져와서 돌리고를 반복한다는...
* 참고: x86은 초기 cs:ip가 0xffff0으로 세팅되는 관계로, 눈이 없는(?) CPU를 위해 해당 메모리에 기초적인 보드제어로직을 넣고, 부팅되는 로직도 넣고한다. 이는 보통 롬(ROM)으로 구워지게된다. 최초 이를 만든 IBM은 이를 ROM BIOS라고 했다. 그외 모토롤라, 파워pc, ARM등 프로세서들은 초기세팅 주소등에서는 상이할 수 있으나, 대체로 대동소이하다. 이 부분에서는 말이다.
* ROM BIOS 코드는 IBM이 오픈소스로 공개했다 무려 25년전에... PC처음 만들자마자...
그책이름이 IBM Technical Reference였던가 이다.
그래서, PC 호환기종들이 대거 만들어지게 된다. 그리고, 현재까지....
* ROM BIOS는 셀프테스트(보드제작자에 따라 달라지겠지)를 가지고, 이것저것 처리하고 나면, 특정 장치의 특정 부분에서 코드를 메모리로 로딩하고 이 메모리 번지로 cs:IP를 세팅해서 그 코드를 수행하게된다.
* Von Neumann방식에 대해 조금 더 얘기하면, Stored Programming인데, 모든 프로그램은 메모리에 올려놓고 돌린다.라는 얘기다. 메모리...? 이는 주기억장치를 의미하며, CPU가 직접 액세스가능한 기억장소를 의미한다. 보통 램또는롬이 된다.
* BIOS? Basic Input Output System인데, 말그대로 아주 기초적인 IO라이브러리라고 보면된다. 왜 필요하냐면, 예를 들어보자.
디스크? 이는 CPU가 직접 어드레싱하지 못한다. 그래서 바이오스 제작자는 기초적으로 디스크(벤더별, 제품별)에서 메모리로 읽고 쓰고 하는 로직을 넣어주어야 한다.
* 글을 쓰다보니, 하드웨어를 너무 과소평가하고 쓰게되었는데,
개인적으로 운영체제의 중요성을 유념해서 그러한가 봅니다.
하드웨어 아키텍쳐의 고수준 기술들도 간과해서는 안됩니다.
[quote]...보통 램또는롬이 된다...[/quote]램이건 롬이
램이건 롬이건 CPU입장에서는 단지 직접액세스 가능한 메모리
번지이면 된다. CPU가 읽는경우에말이다. 램, 롬? 이런것에 사람입장에서 연연하지말고, CPU입장에서 보면 더 쉽다.
[quote="amister"]...만약 OS의 도움없이 프로그램
x86이라면, 0xffff0번지에 쓰기가능한 롬을 두고 자기코드를 넣어도 됩니다. 이경우 디스크도 필요없게 되겠지요.
하지만, 이는 원칩, 보드제작(?!)등을 할때 하는 방법이고, MDS 장비없고 그거 장만할 돈없는, 운영체제 연습이라면, amister님의 말씀대로 일단 디스크 부트섹터에 쓰라는 바이오스의 규격(프레임워크)에 따르는게 좋습니다.
[quote="Anonymous"]2) CPU의 지네발(?)중 res
전혀 상관없는 예기긴 하지만 요즘 X86들은 지네발보단
꽃꽂이용 판처럼 생겼죠~ :twisted:
그리고 별로 하드웨어 과소평가 한것 같진 않아요^^
음 한가지 지금 오락가락하는게 X86머신이 가변길이 명령언가요 고정길이인가요 가변길이었던거 같은데...
어쨌던 고정이던 가변이던 통합해서 말하면 읽어온 명령어 길이만큼 PC가 증가합니다...
opcode만으로 수행되는 명령어는 opcode길이만큼 ...
operland있으면 operland 길이만큼 추가해서요...
어쨌던 다음명령어의 주소를 가리킨다는점에서는 같으니 중요한 문젠아니지만 문득 ㅡ_ㅡ;;;
혹시 틀렸으면 지적해주세요 ~ 아키텍쳐별로 다를수 있습니다만... 하버드구조가 아닌 폰노이만구조에서는 거의 같을꺼 같군요
하버드 구조도 별로 차이 없긴합니다만... 베이스는 폰노이만이니...
x86 가변길이 맞습니다.(386 명령어셋이 1-17바이트 정도) 그
x86 가변길이 맞습니다.(386 명령어셋이 1-17바이트 정도)
그리고 그 길이를 재서 다음명령을 가리키도록 되어 있습니다.
그리고 기본적인 디스크 액세스 코드는 바이오스상에
다 들어 있습니다. OS가 부팅되면서 자기의 디스크 액세스 코드
(디스크 드라이버)를 읽어들이면서 이걸 더 이상 안쓰게 되죠.
바이오스에서 지원하지 않는 장비로는 부팅이 안되는거도 이때문이고요.
Written By the Black Knight of Destruction
댓글 달기