본문 바로가기

OS10

8-3. 페이징 실험 앞서 배운 커널 구조들과 페이징을 구현하여 어떻게 소스코드가 구성되고 동작하는지를 알아보려한다.앞서 배운 개념들에 대한 소스 코드는 거의 동일하고 페이징 기능 위주로 정리하였다.init.incSysCodeSelector equ 0x08SysDataSelector equ 0x10VideoSelector equ 0x18TSSSelector equ 0x20UserCodeSelector equ 0x28+3UserDataSelector equ 0x30+3IDT_BASE equ 0xC0001000TSS_ESP0_WHERE equ 0x90000 boot_paging.asm%include "init.inc"[org 0] jmp 07C0.. 2026. 4. 25.
8-2. 페이징 - 페이징 구현 여태까지는 세그먼트를 활용하여 논리 주소에서 바로 물리 주소로 변환하면서 예제를 작성했다.페이징을 활용하면 논리 주소 → 선형 주소 → 물리 주소 순으로 변환되게 된다.선형 주소페이징을 활용하려면 두 가지가 필요하다.페이지 디렉토리페이지 테이블페이지 디렉토리는 시스템에서 한 개만 존재하며, 페이지 디렉토리 엔트리 * 1024개로 이루어진다.페이지 디렉토리 엔트리는 페이지 테이블의 포인터를 포함하며 각종 비트로 구성되어있다.페이지 디렉토리 엔트리 구조페이티 테이블은 1024개의 페이지 테이블 엔트리를 가지고 있으며, 페이지 테이블 엔트리는 4KB 물리 주소 한 페이지의 포인터를 포함하고 있다.페이지 테이브 엔트리 구조A 비트해당 비트를 통해 해당 페이지가 접근된 페이지인지 확인 가능하다.U/S 비트0 : .. 2026. 4. 23.
8-1. 페이징 - A20 게이트 A20 게이트16비트 컴퓨터는 세그먼트 기법을 이용하여 메모리 주소를 나타내었다.0x0000:0000 ~ 0xFFFF:FFFF 까지 지정이 가능하였다.0xFFFF:FFFF는 0x10FFEF(0xFFFF0 + 0xFFFF) 이며, 2진수로 나타내면 1 0000 1111 1111 1110 1111이다.8086의 어드레스 라인은 20개이고 20개까지 표현하면 0 0000 1111 1111 1110 1111이 된다.최상위 1비트를 표현하지 못하게 되어 0이 되고, 0x100000번지(1MB)를 초과해버리면 0x0번지가 된다.80286이나 펜티엄이런 CPU를 사용하게 되면서 어드레스 라인 개수도 늘어났지만 옛날 소프트웨어와의 호환을 위해 20번 어드레스를 키보드 컨트롤러 칩과 AND 연산자로 묶게 되었다. 그리고.. 2026. 4. 21.
7. 유저모드 Task Switching 5장에서 했던 태스크 스위칭은 CPU를 통한 태스크 스위칭이었다.이번 장에서는 수동으로 태스크 스위칭을 구현한다.CPU를 통한 태스크 스위칭를 통해서 JMP나 CALL 명령어 수행 시 어셈블리 코드를 통해 스택에 레지스터 값을 저장해주지 않아도 CPU가 자동으로 수행하지만, 수동 태스크 스위칭의 경우 레지스터 값을 수동으로 스택에 PUSH하고 POP 해야 한다.수동으로 태스크 스위칭을 수행하게 되면 TSS의 활용이 달라지는데, 유저모드에서 커널모드로 전환 시 ESP0, SS0 필드만을 참고하게 된다.즉, 기존 자동 태스크 스위칭은 TSS에서 모든 레지스터 값을 저장하고 로드하지만, 수동 태스크 스위칭은 대부분의 레지스터를 스택에서 로드 및 저장하고 TSS에서 커널 스택이 어디있는지 찾기 위해 ESP0, .. 2026. 4. 19.
6. 보호 16bit Real Mode와 32bit Protected Mode의 차이점 중 하나는 보호 기능이다.Protected Mode에서 여러 유저 프로그램이 같이 동작하게 되는데 이 때 규약에 맞는 명령만 실행한다.이때 다음과 같은 것들을 확인한다.1. Limit 체크2. Type 체크3. 특권 레벨 체크4. 명령 세트 체크CPU의 체크 포인트Limit 체크세그먼트 디스크립터의 크기를 정하는 limit는 세그먼트 영역을 넘어서 오프셋으로 지정하지 못하게 한다.오프셋으로 넘어서면 overwrite가 될 위험이 있다.Limit는 GDT, IDT, TSS 모두 있다.TSS는 TR 레지스터의 6바이트 중 2바이트를 limit로 사용한다.Type 체크용도를 체크하는 역할을 한다. 권한체크가 아니다.예를 들면, 칼을 .. 2026. 4. 13.
5. 태스크 스위칭, 문맥 교환 태스크 스위칭은 CALL, JMP, IRET 등에서 발생하며, CPU가 수행하는 태스크가 교체될 때, 교체되기 전 태스크의 상태를 특정 저장 장소에 저장하고 교체될 태스크의 레지스터 상태를 특정 저장 장소로부터 CPU에 로드하는 것을 태스크 스위칭이라 한다.태스크 스위칭 예제 코드를 작성하였다.init.incSysCodeSelector equ 0x08SysDataSelector equ 0x10VideoSelector equ 0x18TSS1Selector equ 0x20TSS2Selector equ 0x28boot.asm%include "init.inc"[org 0] jmp 07C0h:startstart: mov ax, cs mov ds, ax mov es, ax .. 2026. 4. 13.