[질문]만들면서 배우는 os의 구조와 원리
안녕하세요? 현재 만들면서 배우는 os의 구조와 원리를 보며 공부하고 있는 학생입니다.
아마 이 책 보신 분들이 여기 많으신거 같아서 질문드립니다.
궁금한 점은
첫번째
mov cr0, eax jmp $+2 nop nop db 0x66
이런식인데요, cr0의 마지막 비트를 1로 정해서 protected mode로 진입하는데 파이프라인때문에
nop를 넣어서 protected mode 발생시 real-mode 명령어가 들어오지 못하게 막는걸로 이해했습니다.
저런 부분을 정확하게 이해하기 위해서는 파이프라인, 즉 mov의 명령어의 IF-ID-EX-MEM-WE 이런 일련의 파이프라인 단계마다
몇 클락이 소비되는지 다 계산해서 해야대지 않나요? 그리고 cpu가 어떤 branch prediction을 쓰는지 알아야 정확하게 코딩이 되지 않는지 궁금합니다.
그리고 또한 저런 명령어 클락과 cpu 정보는 intel menual에 있는지, 아님 어디서 참조해야 되는지 궁금하네요.
제가 이해한 부분이 잘못될 수도 있는데 공부하신 분들의 답변 기다리겠습니다.
두번째 FAR JMP를 하면 CS 레지스터에는 새로운 세그먼트 값이 들어가고, EIP 레지스터에는 (어떤 명시된) 주소값이 들어가서CPU가 해당 주소부터 실행한다는데,
여기서 EIP는 실행될 명령어를 가지고 있는 레지스터 아닌가요? OP를 EIP에 저장하는 게 아닌가요?
책에는 프로그램 작성시 물리 주소값을 주는데.. 궁금하네요. ㅡㅡ; 질문의 의도를 아셨는지. 책은 89페이지입니다.
좋은 추석되세요.
아 그리고 혹시 DOS interrupt 관련 자세한 자료가 있는 곳 아시면 좀 가르쳐 주세요. 감사합니다.
책은 안 읽어 봐서 잘
책은 안 읽어 봐서 잘 모르겠지만.. ^^;
모드 전환 할 때 jmp 를 하는 이유는
prefetch queue 를 flush 하기 위함으로 압니다.
x86의 경우 branch delay slot이 없고,
jmp 하는 경우 그냥 간단히
이미 큐/파이프라인에 들어와 있는 명령어를 모두 squash해버립니다.
jmp $+2; nop; nop; 으로 해도 되지만,
jmp <어떤 주소>; 로 해도 될 겁니다.
label을 쓰지 않고 대상 주소를 지정하기 위해서
1byte 짜리 nop 두 개를 넣은 다음에
jmp $+2; 해버린거지요.
그리고 eip 에는 명령어 자체가 아닌 명령어의 주소값이 들어있습니다.
eip가 가리키는 주소에서 instruction fetch unit이 명령어를 읽어다가 decoder에게 넘겨줍니다.
넵 감사합니다. x86에
넵 감사합니다.
x86에 jmp에 관한 것이나 이런 정보가 어디에 잘 나와있는지 한번 찾아봐야겠네요.
좋은 정보 감사합니다.
댓글 달기