Advertisement
Guest User

Untitled

a guest
Jan 31st, 2015
175
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.89 KB | None | 0 0
  1.  
  2. PDE = 0x6000 #адрес каталога страниц
  3. #PDE =
  4. PTE = 0x100000
  5.  
  6. PGP_CODE_OLD = 0xF0000 #PDE = 0, PTE = F0*4
  7. #x00100000 #PDE = 0, PTE = 100*4
  8. PGL_CODE = 0x001EE000 #PDE = 0, PTE = 1EE*4
  9. #x001FE000 #PDE = 0, PTE = 1FE*4
  10.  
  11. PGL_BDA_OLD = 0x400 #PDE = 0, PTE = 0
  12. PGP_BDA = 0x056000
  13.  
  14. PGL_DEVICES = 0x02A000 #PDE = 0, PTE = 2A*4
  15. PGP_LAPIC_OLD = 0xFEE00000
  16.  
  17. PGL_GDT = 0x10000 #PDE = 0, PTE = 10*4
  18. PGP_GDT = 0x10000
  19.  
  20. PGL_IDT = 0x11000 #PDE = 0, PTE = 11*4
  21. PGP_IDT = 0x11000
  22.  
  23. PGL_STACK = 0x90000 #PDE = 0, PTE = 90*4
  24. PGP_STACK = 0x90000
  25.  
  26. PGP_VMEM = 0xB8000
  27. PGL_VMEM = 0xB8000
  28. #Добавляем записи в каталог и таблицу
  29. .macro .create_PDE_PTE addr=0, base, pcd=0
  30. .create_PDE \addr, \base
  31. .create_PTE \addr, \base, \pcd
  32. .endm
  33. #Добавляем запись в каталог
  34. .macro .create_PDE addr=0, base
  35. mov $(PDE + ((\addr) >> 22) * 4), %edi
  36. mov $((PTE + ((\addr) >> 22) << 14) || (0b11)), %eax #[>>22 *4 <<12] = [>>22 <<14]
  37. stosl
  38. .endm
  39. #Добавляем запись в таблицу страниц
  40. .macro .create_PTE addr=0, base, pcd=0, us=0, rw=1, p=1
  41. mov $((PTE + ((\addr) >> 22) << 14) + ((\addr) && 0x003FF000) >> 10), %edi #[>>12 *4 = >>10]
  42. mov $(((\base) && (0xFFFFF000)) + ((\pcd)<<4)+((\rw)<<1)+\p), %eax
  43. stosl
  44. .endm
  45. # Каталог из 1024 эл по 4 байта, таблицы из 1024 эл по 4 байта, каждая запись которой определяет 4КБ
  46. # В случае 4Кб страниц линейный адрес делится на 3 части:
  47. # -Номер записи в каталоге страниц 31-22 1024*4Б
  48. # -Номер записи в таблице страниц 21-12 1024*4Б
  49. # -Смещение в самой 4Кб-странице 11-0
  50. set_pages:
  51. push %eax
  52. push %ebx
  53. push %ecx
  54.  
  55. mov %eax, %edi
  56. mov %eax, %ecx #save
  57.  
  58. shr $22, %edi
  59. shl $2, %edi
  60. mov %edi, %eax
  61. add $PDE, %edi #edi ready
  62.  
  63. shl $12, %eax
  64. add $PTE, %eax
  65. mov %eax, %edx #save
  66. or $0b11, %eax #eax ready
  67. stosl
  68.  
  69. and $0x003FF000, %ecx
  70. shr $10, %ecx
  71. add %ecx, %edx
  72. mov %edx, %edi #edi ready
  73.  
  74. and $0xFFFFF000, %ebx
  75. or %esi, %ebx
  76. mov %ebx, %eax #eax ready
  77. stosl
  78.  
  79. pop %ecx
  80. pop %ebx
  81. pop %eax
  82. ret
  83. page_cycle:
  84. p1: call set_pages
  85. add $4096, %eax
  86. add $4096, %ebx
  87. dec %ecx
  88. jnz p1
  89. ret
  90. pagging:
  91. xchg %bx, %bx
  92. cli
  93. xor %eax, %eax
  94. movl $0x20, %eax
  95. mov %ax, %es
  96.  
  97. mov $PDE, %edi #Сначала обнуляем весь каталог
  98. xor %eax, %eax
  99. mov $1024, %ecx
  100. rep stosl
  101.  
  102. movl $PGL_CODE, %eax #CODE
  103. movl $PGP_CODE_OLD, %ebx
  104. movl $0x10, %ecx
  105. movl $0b0011, %esi #CACHE
  106. call page_cycle
  107.  
  108. movl $PGL_BDA_OLD, %eax #BDA
  109. movl $PGP_BDA, %ebx
  110. movl $1, %ecx
  111. movl $0b0011, %esi #CACHE
  112. call page_cycle
  113.  
  114. movl $PGL_DEVICES, %eax #LAPIC
  115. movl $PGP_LAPIC_OLD, %ebx
  116. movl $1, %ecx
  117. movl $0b1011, %esi #NOCACHE
  118. call page_cycle
  119.  
  120. movl $PGL_GDT, %eax #GDT
  121. movl $PGP_GDT, %ebx
  122. movl $1, %ecx
  123. movl $0b0011, %esi #CACHE
  124. call page_cycle
  125.  
  126. movl $PGL_IDT, %eax #IDT
  127. movl $PGP_IDT, %ebx
  128. movl $1, %ecx
  129. movl $0b0011, %esi #CACHE
  130. call page_cycle
  131.  
  132. movl $PGL_STACK, %eax #Stack
  133. movl $PGP_STACK, %ebx
  134. movl $0x10, %ecx
  135. movl $0b0011, %esi #CACHE
  136. call page_cycle
  137.  
  138. xchg %bx, %bx
  139. movl $PGP_CODE_OLD, %eax #F0000 ->F0000
  140. movl $PGP_CODE_OLD, %ebx
  141. movl $16, %ecx
  142. movl $0b0011, %esi #CACHE
  143. call page_cycle
  144.  
  145. /*movl $PDE, %eax #PDE->PDE
  146. movl $PDE, %ebx
  147. movl $1, %ecx
  148. movl $0b0011, %esi #CACHE
  149. call page_cycle*/
  150.  
  151. movl $PTE, %eax #PTE->PTE
  152. movl $PTE, %ebx
  153. movl $1, %ecx
  154. movl $0b0011, %esi #CACHE
  155. call page_cycle
  156.  
  157. movl $PGL_VMEM, %eax #PTE->PTE
  158. movl $PGP_VMEM, %ebx
  159. movl $1, %ecx
  160. movl $0b0011, %esi #CACHE
  161. call page_cycle
  162.  
  163.  
  164.  
  165. movl $0x10, %eax
  166. mov %ax, %es
  167.  
  168. mov $PDE, %eax #устанавливаем базовый адрес каталога в cr3
  169. mov %eax, %cr3
  170.  
  171. mov %cr0, %eax
  172. or $0x80000000, %eax #устанавливаем pagging-бит
  173. mov %eax, %cr0
  174.  
  175. #sti
  176. xchg %bx, %bx
  177. .byte 0xEA
  178. #.long (0xF0000+start_page)
  179. .long (0x1EE000+start_page)
  180. .word 0x0008
  181.  
  182. delete_code_morfizm:
  183. xor %eax, %eax
  184. movl $0x20, %eax
  185. mov %ax, %es
  186.  
  187. movl $0x10, %ecx
  188. movl $PGP_CODE_OLD, %eax #F0000 ->F0000
  189.  
  190. p2: push %eax
  191.  
  192. mov %eax, %edi
  193. shr $22, %edi
  194. shl $14, %edi
  195. add $PTE, %edi #(AAaa)*4 << 12 + PTE
  196.  
  197. and $0x003FF000, %eax
  198. shr $10, %eax #(bbBB)*4
  199. add %eax, %edi #(bbBB)*4 + (AAaa)*4 << 12 + PTE
  200.  
  201. xor %eax, %eax
  202. stosl
  203.  
  204. pop %eax
  205. invlpg (%eax)
  206. add $4096, %eax
  207. dec %ecx
  208. jnz p2
  209. movl $0x10, %eax
  210. mov %ax, %es
  211. xchg %bx, %bx
  212.  
  213. sti
  214. ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement