반응형
http://cotkdrl1.blog.me/10148671907
내가 써놨던 글.
참조하고
1. 별다른 처리 없이 메모리에 접근하면 암묵적으로 DS 세그먼트 레지스터가 사용된다.
=> 예를 들어..
이 예시를 보면 알 수 있을 거다..
무슨 말인지..
2. 그런데 운영체제를 만드는 과정에서..
바이오스가 부트로더를 0x07C0 번지로 갖다 놓으므로
DS와 CS는 0x07C0으로 초기화를 하는 게 좋다.
=> 부트로더의 코드(Code Segment)와 데이터(Data Segment)는 0x7C00부터 512바이트 범위에 존재하므로.
따라서 초기화를 해주는데,
DS는 mov 명령어로 초기화 해주면 되고,
CS는 mov 명령으로 초기화 할 수 없음에 주의한다.
CS는 jmp 명령어를 사용하여 초기화 한다.
jmp 0x07C0:START ; CS 세그먼트 레지스터에 0x07C0을 복사하면서 START 레이블로 이동하라는 뜻.
이런 식으로 jmp 명령어 사용시 CS 레지스터가 자동으로 초기화 된다.
(이건 책 125p 참조)
또한 이제 DS 값이 바뀌었으므로...(위의 예시와는 다르게....)
비디오 메모리에 접근하기 위해서는
ES 레지스터에 0xB800을 넣고
ES:0x00
이런 식으로 비디오 메모리에 접근한다!
이게 가능한 이유는 세그먼트 레지스터 접두사를 사용하면 해당 명령을 수행하는 동안 일시적으로 세그먼트를 교체하기 때문이다.
반응형
'무근본 IT 지식 공유 > 무근본 운영체제(OS)' 카테고리의 다른 글
리눅스 Curl https 인증서 오류 무시 옵션 (0) | 2023.11.21 |
---|---|
[무근본운영체제] OS에서 시스템 API란 (0) | 2023.09.19 |
[무근본 OS 만들기] 보호모드. GDT, 세그먼트 디스크립터 (0) | 2023.03.26 |
[무근본 OS 만들기] 보호모드에서의 세그먼테이션, 페이징(Intel 메뉴얼 해석) (0) | 2023.03.26 |
[무근본 OS 만들기] 현재까지의 과정(부트로더-> 커널 엔트리 포인트-> C언어. Kernel32) (0) | 2023.03.26 |
댓글