1. Если вы только начинаете программировать на ассемблере и не знаете с чего начать, тогда попробуйте среду разработки ASM Visual IDE
    (c) на правах рекламы
    Скрыть объявление

Управление памятью в своей ОС

Тема в разделе "WASM.OS.DEVEL", создана пользователем Igneele, 28 янв 2008.

  1. Igneele

    Igneele New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2008
    Сообщения:
    17
    Если в ядре используется страничная адресация (PD и PT для каждого процесса и т.д.), то получается и для самого ядра надо создавать каталоги и таблицы страниц?
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    да конечно они есть.
     
  3. Igneele

    Igneele New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2008
    Сообщения:
    17
    Great
    Не понял.
     
  4. Igneele

    Igneele New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2008
    Сообщения:
    17
    Ааа, понял. То есть, если сегмент кода ядра размером 4Gb, то я должен создать PD и PT для всех 4млн. страниц?
     
  5. rudik

    rudik Руденко Артём

    Публикаций:
    0
    Регистрация:
    6 дек 2006
    Сообщения:
    302
    Адрес:
    г. Харьков
    Да, нада. Опишы то что хочеш узнать подробнее. Дам сразу код, который сам писал для соей недооси.
    Код (Text):
    1. ; фасм
    2. ; загрузить это надо в cs=0x9000 , ip=0х200
    3. align 0x200
    4. org 0x200
    5. EntryPoint:
    6.  
    7.     cli
    8.     cld
    9.     mov ax,cs
    10.     mov ds,ax
    11.     mov es,ax
    12.     mov ss,ax
    13.     mov sp,0x200
    14.  
    15.     mov ax,0003
    16.     int 0x10
    17.  
    18.     pushf
    19.     pop ax
    20.     mov bx,ax
    21.     xor ax,0x4000
    22.     push ax
    23.     popf
    24.     pushf
    25.     pop ax
    26.     and ax,0x4000
    27.     and bx,0x4000
    28.     cmp ax,bx
    29.     jnz normcpu
    30.    
    31.     mov ax,0xB800
    32.     mov es,ax
    33.  
    34.     mov si,Message_BadCPU
    35.     mov di,0
    36.     mov cx,Message_BadCPUsize
    37.     @@:
    38.     lodsb
    39.     mov ah,0x0f
    40.     stosw
    41.     loop @b
    42.     jmp $
    43.  
    44. normcpu:
    45.  
    46. ;подготовить таблицы
    47.  
    48.     xor di,di
    49.     xor ax,ax
    50.     mov es,ax
    51.     mov cx,0x2000
    52.     rep stosw
    53.    
    54.     mov si,GDTTable
    55.     mov di,0x800
    56.     mov cx,GDTTableSize/2
    57.     rep movsw
    58.    
    59. ;   mov si,IDTTable
    60. ;   mov di,0x000
    61. ;   mov cx,IDTTableSize/2
    62. ;   rep movsw
    63.        
    64. ;load gdtr
    65.  
    66.     lgdt [LGDTR]
    67.    
    68. ;cr0 - pe
    69.  
    70.     ;mov eax,cr0
    71.     ;or  eax,1
    72.     mov eax,1
    73.     mov cr0,eax
    74.  
    75.     db 0x66
    76.     db 0xea
    77.     dd 0x90400
    78.     dw 0x10
    79.        
    80. Message_BadCPU db "Need CPU 386+"
    81. Message_BadCPUsize = $ - Message_BadCPU
    82.  
    83. align 4
    84.  
    85. GDTTable:
    86. dq 0
    87. dq 0
    88. GDT_code0 dq 0x00CF9A000000FFFF ;code, dpl 0 - 10
    89. GDT_data0 dq 0x00CF92000000FFFF ;data, dpl 0 - 18
    90. GDT_code3 dq 0x00CFFA000000FFFF ;code, dpl 3 - 23
    91. GDT_data3 dq 0x00CFF2000000FFFF ;data, dpl 3 - 2B
    92. GDT_tss   dq 0x0
    93. GDT_tssEr dq 0x0
    94. GDTTableSize = $ - GDTTable
    95.  
    96. LGDTR:
    97. LGDTR.limit dw 0x800-1
    98. LGDTR.base  dd 0x800
    99.  
    100. align 0x200
    101.  
    102. use32
    103. org 0x90400
    104.  
    105. PE_entrypoint:
    106.  
    107. PROCESS_INIT:
    108.  
    109.     mov ax,0x18
    110.     mov ds,ax
    111.     mov es,ax
    112.     mov ss,ax
    113.     mov fs,ax
    114.     mov gs,ax
    115.     mov esp,0x90400
    116.    
    117.     xor eax,eax
    118.     xor ebx,ebx
    119.     xor ecx,ecx
    120.     xor edx,edx
    121.     xor ebp,ebp
    122.     xor esi,esi
    123.     xor edi,edi
    124.  
    125.     mov al,0xD1
    126.     out 0x64,al
    127.     mov al,0xDF
    128.     out 0x60,al
    129.  
    130.     in al,0x92
    131.     or al,0x02
    132.     out 0x92,al
    133.    
    134. @@: inc eax        
    135.     mov [0],eax    
    136.     cmp [0x00100000],eax
    137.     je @b
    138.    
    139.     mov eax,0xFFEEDDAA
    140.     mov ebx,0x100000 ;1mb
    141. @@:
    142.     mov [ebx],eax
    143.     cmp eax,[ebx]
    144.     jnz @F
    145.     inc edx
    146.     add ebx,0x1000
    147.     jmp @B
    148.    
    149. @@:
    150.  
    151.     add edx,0x100 ;;; edx = 4kb memorry :)
    152.  
    153. ;; подготовка стандартніх и необходиміх структур  
    154. ;; подготовка каталога для ядра и процесса
    155.     mov dword [0x2000+0x0E00],0x3000+2+1 ; Precent, R\W, Supervisor
    156.     mov dword [0x2000+0x0000],0x4000+2+1 ; Precent, R\W, Supervisor
    157.  
    158. ;; подготовка страниц ядра
    159.     mov dword [0x3000+0x0000],0x0000+2+1 ; GDT,IDT ;физ адрес 0, лин -0хE0000000
    160.     mov dword [0x3000+0x0004],0x1000+2+1 ; TSS
    161.     mov dword [0x3000+0x0008],0x2000+2+1 ; SysInformation1
    162.     mov dword [0x3000+0x000C],0x3000+2+1 ; SysInformation2
    163.     mov dword [0x3000+0x0010],0x91000+1  ; code e0004000 - entry point
    164.  
    165. ;; подготовка страниц процесса
    166.     mov dword[0x4240],0x90000+2+1 ;entrypointinit
    167.     mov dword[0x42E0],0xB8000+2+1 ;video
    168.  
    169.     mov eax,0x2000
    170.     mov cr3,eax
    171.    
    172.     mov eax,cr0
    173.     or  eax,0x80000000
    174.     mov cr0,eax
    175.     jmp Paging_enabled
    176.    
    177.     Paging_enabled:
    178.  
    179. ;; я инитко
    180.    
    181.     call 0xE0004000
    182.  
    183. PROCESS_INIT_SIZE = $ - PROCESS_INIT
    184.  
    185. align 0x1000
    186. org 0xE0004000
    187.  
    188. jmp $ ; вот в эту точку мы попали
    Если нада тебе полный код того, как выполнить переключение задач и т.д напишы в личку
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Ты спосил: они нужны? Ответ - да, конечно=) Какие вопросы то.
    для каждого процесса*. да.
     
  7. Igneele

    Igneele New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2008
    Сообщения:
    17
    Вот! Теперь понятно. Спасибо!
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    посмотри в Windows как меняется CR3 и как в этом участвует EPROCESS::DirectoryTableBase.
    А именно, посмтори код KiSwapProcess (кажется)
     
  9. Igneele

    Igneele New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2008
    Сообщения:
    17
    Как это сделать?
     
  10. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    посмотреть исходные коды ядра, я уже назвал функцию. либо в IDA Pro, но там не очень понятно будет