Если в ядре используется страничная адресация (PD и PT для каждого процесса и т.д.), то получается и для самого ядра надо создавать каталоги и таблицы страниц?
Ааа, понял. То есть, если сегмент кода ядра размером 4Gb, то я должен создать PD и PT для всех 4млн. страниц?
Да, нада. Опишы то что хочеш узнать подробнее. Дам сразу код, который сам писал для соей недооси. Код (Text): ; фасм ; загрузить это надо в cs=0x9000 , ip=0х200 align 0x200 org 0x200 EntryPoint: cli cld mov ax,cs mov ds,ax mov es,ax mov ss,ax mov sp,0x200 mov ax,0003 int 0x10 pushf pop ax mov bx,ax xor ax,0x4000 push ax popf pushf pop ax and ax,0x4000 and bx,0x4000 cmp ax,bx jnz normcpu mov ax,0xB800 mov es,ax mov si,Message_BadCPU mov di,0 mov cx,Message_BadCPUsize @@: lodsb mov ah,0x0f stosw loop @b jmp $ normcpu: ;подготовить таблицы xor di,di xor ax,ax mov es,ax mov cx,0x2000 rep stosw mov si,GDTTable mov di,0x800 mov cx,GDTTableSize/2 rep movsw ; mov si,IDTTable ; mov di,0x000 ; mov cx,IDTTableSize/2 ; rep movsw ;load gdtr lgdt [LGDTR] ;cr0 - pe ;mov eax,cr0 ;or eax,1 mov eax,1 mov cr0,eax db 0x66 db 0xea dd 0x90400 dw 0x10 Message_BadCPU db "Need CPU 386+" Message_BadCPUsize = $ - Message_BadCPU align 4 GDTTable: dq 0 dq 0 GDT_code0 dq 0x00CF9A000000FFFF ;code, dpl 0 - 10 GDT_data0 dq 0x00CF92000000FFFF ;data, dpl 0 - 18 GDT_code3 dq 0x00CFFA000000FFFF ;code, dpl 3 - 23 GDT_data3 dq 0x00CFF2000000FFFF ;data, dpl 3 - 2B GDT_tss dq 0x0 GDT_tssEr dq 0x0 GDTTableSize = $ - GDTTable LGDTR: LGDTR.limit dw 0x800-1 LGDTR.base dd 0x800 align 0x200 use32 org 0x90400 PE_entrypoint: PROCESS_INIT: mov ax,0x18 mov ds,ax mov es,ax mov ss,ax mov fs,ax mov gs,ax mov esp,0x90400 xor eax,eax xor ebx,ebx xor ecx,ecx xor edx,edx xor ebp,ebp xor esi,esi xor edi,edi mov al,0xD1 out 0x64,al mov al,0xDF out 0x60,al in al,0x92 or al,0x02 out 0x92,al @@: inc eax mov [0],eax cmp [0x00100000],eax je @b mov eax,0xFFEEDDAA mov ebx,0x100000 ;1mb @@: mov [ebx],eax cmp eax,[ebx] jnz @F inc edx add ebx,0x1000 jmp @B @@: add edx,0x100 ;;; edx = 4kb memorry :) ;; подготовка стандартніх и необходиміх структур ;; подготовка каталога для ядра и процесса mov dword [0x2000+0x0E00],0x3000+2+1 ; Precent, R\W, Supervisor mov dword [0x2000+0x0000],0x4000+2+1 ; Precent, R\W, Supervisor ;; подготовка страниц ядра mov dword [0x3000+0x0000],0x0000+2+1 ; GDT,IDT ;физ адрес 0, лин -0хE0000000 mov dword [0x3000+0x0004],0x1000+2+1 ; TSS mov dword [0x3000+0x0008],0x2000+2+1 ; SysInformation1 mov dword [0x3000+0x000C],0x3000+2+1 ; SysInformation2 mov dword [0x3000+0x0010],0x91000+1 ; code e0004000 - entry point ;; подготовка страниц процесса mov dword[0x4240],0x90000+2+1 ;entrypointinit mov dword[0x42E0],0xB8000+2+1 ;video mov eax,0x2000 mov cr3,eax mov eax,cr0 or eax,0x80000000 mov cr0,eax jmp Paging_enabled Paging_enabled: ;; я инитко call 0xE0004000 PROCESS_INIT_SIZE = $ - PROCESS_INIT align 0x1000 org 0xE0004000 jmp $ ; вот в эту точку мы попали Если нада тебе полный код того, как выполнить переключение задач и т.д напишы в личку
посмотри в Windows как меняется CR3 и как в этом участвует EPROCESS:irectoryTableBase. А именно, посмтори код KiSwapProcess (кажется)