Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- PDE = 0x6000 #адрес каталога страниц
- #PDE =
- PTE = 0x100000
- PGP_CODE_OLD = 0xF0000 #PDE = 0, PTE = F0*4
- #x00100000 #PDE = 0, PTE = 100*4
- PGL_CODE = 0x001EE000 #PDE = 0, PTE = 1EE*4
- #x001FE000 #PDE = 0, PTE = 1FE*4
- PGL_BDA_OLD = 0x400 #PDE = 0, PTE = 0
- PGP_BDA = 0x056000
- PGL_DEVICES = 0x02A000 #PDE = 0, PTE = 2A*4
- PGP_LAPIC_OLD = 0xFEE00000
- PGL_GDT = 0x10000 #PDE = 0, PTE = 10*4
- PGP_GDT = 0x10000
- PGL_IDT = 0x11000 #PDE = 0, PTE = 11*4
- PGP_IDT = 0x11000
- PGL_STACK = 0x90000 #PDE = 0, PTE = 90*4
- PGP_STACK = 0x90000
- PGP_VMEM = 0xB8000
- PGL_VMEM = 0xB8000
- #Добавляем записи в каталог и таблицу
- .macro .create_PDE_PTE addr=0, base, pcd=0
- .create_PDE \addr, \base
- .create_PTE \addr, \base, \pcd
- .endm
- #Добавляем запись в каталог
- .macro .create_PDE addr=0, base
- mov $(PDE + ((\addr) >> 22) * 4), %edi
- mov $((PTE + ((\addr) >> 22) << 14) || (0b11)), %eax #[>>22 *4 <<12] = [>>22 <<14]
- stosl
- .endm
- #Добавляем запись в таблицу страниц
- .macro .create_PTE addr=0, base, pcd=0, us=0, rw=1, p=1
- mov $((PTE + ((\addr) >> 22) << 14) + ((\addr) && 0x003FF000) >> 10), %edi #[>>12 *4 = >>10]
- mov $(((\base) && (0xFFFFF000)) + ((\pcd)<<4)+((\rw)<<1)+\p), %eax
- stosl
- .endm
- # Каталог из 1024 эл по 4 байта, таблицы из 1024 эл по 4 байта, каждая запись которой определяет 4КБ
- # В случае 4Кб страниц линейный адрес делится на 3 части:
- # -Номер записи в каталоге страниц 31-22 1024*4Б
- # -Номер записи в таблице страниц 21-12 1024*4Б
- # -Смещение в самой 4Кб-странице 11-0
- set_pages:
- push %eax
- push %ebx
- push %ecx
- mov %eax, %edi
- mov %eax, %ecx #save
- shr $22, %edi
- shl $2, %edi
- mov %edi, %eax
- add $PDE, %edi #edi ready
- shl $12, %eax
- add $PTE, %eax
- mov %eax, %edx #save
- or $0b11, %eax #eax ready
- stosl
- and $0x003FF000, %ecx
- shr $10, %ecx
- add %ecx, %edx
- mov %edx, %edi #edi ready
- and $0xFFFFF000, %ebx
- or %esi, %ebx
- mov %ebx, %eax #eax ready
- stosl
- pop %ecx
- pop %ebx
- pop %eax
- ret
- page_cycle:
- p1: call set_pages
- add $4096, %eax
- add $4096, %ebx
- dec %ecx
- jnz p1
- ret
- pagging:
- xchg %bx, %bx
- cli
- xor %eax, %eax
- movl $0x20, %eax
- mov %ax, %es
- mov $PDE, %edi #Сначала обнуляем весь каталог
- xor %eax, %eax
- mov $1024, %ecx
- rep stosl
- movl $PGL_CODE, %eax #CODE
- movl $PGP_CODE_OLD, %ebx
- movl $0x10, %ecx
- movl $0b0011, %esi #CACHE
- call page_cycle
- movl $PGL_BDA_OLD, %eax #BDA
- movl $PGP_BDA, %ebx
- movl $1, %ecx
- movl $0b0011, %esi #CACHE
- call page_cycle
- movl $PGL_DEVICES, %eax #LAPIC
- movl $PGP_LAPIC_OLD, %ebx
- movl $1, %ecx
- movl $0b1011, %esi #NOCACHE
- call page_cycle
- movl $PGL_GDT, %eax #GDT
- movl $PGP_GDT, %ebx
- movl $1, %ecx
- movl $0b0011, %esi #CACHE
- call page_cycle
- movl $PGL_IDT, %eax #IDT
- movl $PGP_IDT, %ebx
- movl $1, %ecx
- movl $0b0011, %esi #CACHE
- call page_cycle
- movl $PGL_STACK, %eax #Stack
- movl $PGP_STACK, %ebx
- movl $0x10, %ecx
- movl $0b0011, %esi #CACHE
- call page_cycle
- xchg %bx, %bx
- movl $PGP_CODE_OLD, %eax #F0000 ->F0000
- movl $PGP_CODE_OLD, %ebx
- movl $16, %ecx
- movl $0b0011, %esi #CACHE
- call page_cycle
- /*movl $PDE, %eax #PDE->PDE
- movl $PDE, %ebx
- movl $1, %ecx
- movl $0b0011, %esi #CACHE
- call page_cycle*/
- movl $PTE, %eax #PTE->PTE
- movl $PTE, %ebx
- movl $1, %ecx
- movl $0b0011, %esi #CACHE
- call page_cycle
- movl $PGL_VMEM, %eax #PTE->PTE
- movl $PGP_VMEM, %ebx
- movl $1, %ecx
- movl $0b0011, %esi #CACHE
- call page_cycle
- movl $0x10, %eax
- mov %ax, %es
- mov $PDE, %eax #устанавливаем базовый адрес каталога в cr3
- mov %eax, %cr3
- mov %cr0, %eax
- or $0x80000000, %eax #устанавливаем pagging-бит
- mov %eax, %cr0
- #sti
- xchg %bx, %bx
- .byte 0xEA
- #.long (0xF0000+start_page)
- .long (0x1EE000+start_page)
- .word 0x0008
- delete_code_morfizm:
- xor %eax, %eax
- movl $0x20, %eax
- mov %ax, %es
- movl $0x10, %ecx
- movl $PGP_CODE_OLD, %eax #F0000 ->F0000
- p2: push %eax
- mov %eax, %edi
- shr $22, %edi
- shl $14, %edi
- add $PTE, %edi #(AAaa)*4 << 12 + PTE
- and $0x003FF000, %eax
- shr $10, %eax #(bbBB)*4
- add %eax, %edi #(bbBB)*4 + (AAaa)*4 << 12 + PTE
- xor %eax, %eax
- stosl
- pop %eax
- invlpg (%eax)
- add $4096, %eax
- dec %ecx
- jnz p2
- movl $0x10, %eax
- mov %ax, %es
- xchg %bx, %bx
- sti
- ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement