Траблы с jmpом в защищенке

Тема в разделе "WASM.BEGINNERS", создана пользователем vorobei99, 5 апр 2008.

  1. vorobei99

    vorobei99 New Member

    Публикаций:
    0
    Регистрация:
    16 фев 2008
    Сообщения:
    25
    Адрес:
    Moscow
    Вот я добрался и до загрузчика в защищенный режим...


    Код (Text):
    1. ;--------------------------------------------
    2. ;Сектор 1
    3. ;--------------------------------------------
    4.  
    5. use16
    6. org 0x7C00
    7.  
    8.         jmp 0x0000:boot_code
    9.         nop
    10.  
    11.  
    12. ;---------------------------------
    13. ;ÏПроцедуры
    14. ;---------------------------------
    15.  
    16. PrintString:
    17.         mov ah,0x0e
    18.         mov bh,0x00
    19.         mov bl,0x07
    20.    @@:
    21.         lodsb            ; вывод строки на экран
    22.         or al,al
    23.         je .done
    24.         int 0x10
    25.         jmp @b
    26.   .done:
    27. ret
    28.  
    29. read_sector:
    30.         xor ax, ax
    31.         mov es, ax          ;буфер es:bs
    32.  
    33.         mov dl, 0          
    34.         mov dh, 0          
    35.         mov ch, 0          
    36.         mov ah, 2
    37.         int     0x13         ;читаем с floppy
    38. ret
    39.  
    40.  
    41. ;---------------------------------
    42. ;Данные
    43. ;---------------------------------
    44. msg_loading   db 'Loading Kernel...',13,10,0
    45. kernel_ok     db 'Kernel Loaded...',13,10,0
    46. switch_ker    db 'Switching Kernel...',13,10,0
    47. press_msg     db 'Press any key to continue...',13,10,0
    48.  
    49.  
    50.  
    51. boot_code:
    52.  
    53.         cli
    54.         mov ax,cs
    55.         mov ds,ax                 ;Настройка сегментов
    56.         mov es,ax
    57.         mov ss,ax
    58.         mov sp,0x7C00
    59.         sti
    60.  
    61.         mov ecx,0x100
    62.         mov si,0x7C00
    63.         mov di,0x5000             ; копируемся из 0х7С00 в 0х5000
    64.         xor bx,bx
    65.         xor dx,dx
    66.         rep movsw
    67.  
    68.         jmp 0x0000:start
    69.  
    70.  
    71. start:
    72.  
    73.         mov si, msg_loading
    74.         call PrintString
    75.  
    76.         mov al,0x01               ; Грузим ядро 0x0000:0x6000
    77.         mov cl,0x02
    78.         mov bx,0x6000
    79.         call read_sector
    80.  
    81.         mov si,kernel_ok
    82.         call PrintString
    83.  
    84.         mov si,switch_ker
    85.         call PrintString
    86.  
    87.         mov si,press_msg
    88.         call PrintString
    89.  
    90.         mov ah,0x00
    91.         int 0x16
    92.  
    93. calc_entry:
    94.         xor eax,eax
    95.         mov ax,0x0000             ; вычисляем смещение для jmpа
    96.         shl eax,4
    97.         add eax,0x6000
    98.         mov dword [vxod],eax
    99.  
    100.  
    101. switching_pmode:
    102.  
    103.         mov ax,3
    104.         int 0x10
    105.  
    106.         mov ah, 1                  ; очищаем экран и убераем курсор
    107.         mov ch, 0x20
    108.         int 0x10
    109.  
    110.  
    111.  
    112.         in al, 0x92
    113.         or al, 2                   ; включаем 32битную адресацию (A20)
    114.         out 0x92, al
    115.  
    116.  
    117.         lgdt [GDTR]              ; Загружаем GDTR
    118.  
    119.  
    120.         cli                       ;отрубаем маскируемые прерывания
    121.  
    122.         in  al,0x70
    123.         or  al,0x80               ;отрубаем не маскируемые прерывания
    124.         out 0x70,al
    125.  
    126.  
    127.  
    128.         mov eax, cr0
    129.         or al, 1                   ; устанавливаем бит РЕ в CR0
    130.         mov cr0, eax
    131.  
    132.  
    133.         db   0x66                 ;префикс разрядности
    134.         db   0xEA                 ; опкод far jmp                                                (проблема именно в этом джампе)
    135. vxod  dd   ?                      ; 32 битное смещение
    136.         dw   00001000b         ; селектор id=1
    137.  
    138.  
    139.  
    140. ;---------------------------------
    141. ;Таблица дискрипторов
    142. ;---------------------------------
    143. GDT:
    144.  
    145. null_desc       db  0,0,0,0,0,0,0,0
    146. code_desc       db  0xFF,0xFF,0x00,0x00,0x00,10011010b,11001111b,0x00
    147. data_desc       db  0xFF,0xFF,0x00,0x00,0x00,10010010b,11001111b,0x00
    148. video_desc      db  0x00,0x80,0x00,0x80,0x0B,10010010b,01000000b,0x00
    149.  
    150. GDT_size       equ  $-GDT
    151. GDTR:
    152.         dw     GDT_size-1
    153.         dd     GDT
    154.  
    155.  
    156. times 510-($-$$) db 0
    157. dw 0xAA55
    158. ;--------------------------------------------
    159. ;Сектор 2
    160. ;--------------------------------------------
    161. file 'kernel.bin'
    Исходник kernel.bin
    Код (Text):
    1. use32
    2. org 0x6000
    3.  
    4. l1:
    5.         jmp l1                                     (чисто для теста)
    6. times 512-($-$$) db 0
    Проблема в том что когда он джампит qemu зависает...В чем проблема?Помогите плз начинающему кодеру...
     
  2. satrau

    satrau Александр

    Публикаций:
    0
    Регистрация:
    5 янв 2008
    Сообщения:
    229
    ну так получаеться бесконечный цыкл:
    l1:
    jmp l1
    отчегож не повиснуть,то.
     
  3. vorobei99

    vorobei99 New Member

    Публикаций:
    0
    Регистрация:
    16 фев 2008
    Сообщения:
    25
    Адрес:
    Moscow
    Имеятся виду что после этого шага qemu падает.Заменил на
    jmp 0x8: _protected ;

    _protected:
    use32
    jmp $

    Так не падает.Пытаюсь понять почему..Спрашиваю у знатаков))
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    db 0x66 ;префикс разрядности
    db 0xEA ; опкод far jmp (проблема именно в этом джампе)
    vxod dd ? ; 32 битное смещение
    dw 00001000b ; селектор id=1


    ошибка: сначала сегмент потом смещеени ;)

    тьфу.. сори, перекодил_)
     
  5. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    нет
    как раз сначала смещение, а потом селектор
     
  6. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    vorobei99
    1. нулевое количество секторов для чтения
    Код (Text):
    1. read_sector:
    2.         xor ax, ax
    3. ...
    2. теряем номер загрузочного устройства, который BIOS записывает в DL при переходе на 0000h:7C00h
    Код (Text):
    1.         mov ecx,0x100
    2.         mov si,0x7C00
    3.         mov di,0x5000             ; копируемся из 0х7С00 в 0х5000
    4.         xor bx,bx
    5.         xor dx,dx
    6. ...
    так что подозреваю, что kernel.bin не загружается
     
  7. vorobei99

    vorobei99 New Member

    Публикаций:
    0
    Регистрация:
    16 фев 2008
    Сообщения:
    25
    Адрес:
    Moscow
    Огромное спасибо rei3er.Проблема была именно в этом
     
  8. vorobei99

    vorobei99 New Member

    Публикаций:
    0
    Регистрация:
    16 фев 2008
    Сообщения:
    25
    Адрес:
    Moscow
    Еще один вопросик знатокам.Вот использую рассылку с lowlevel...Делал пробник своего ядра на сях

    ktty.c
    Код (Text):
    1. #define VIDEO_WIDTH 80    
    2. #define VIDEO_HEIGHT 25  
    3. #define VIDEO_RAM 0xb8000
    4.  
    5. void print(){
    6.       char *video = VIDEO_RAM;
    7.       *(video)='h';
    8.       *(video+1)=07;
    9.       *(video+2)='i';
    10.       *(video+3)=07;  
    11.  
    12. }
    kernel.c
    Код (Text):
    1. void kernel_main()
    2. {
    3.  print();
    4.  
    5.   for(;;);
    6. }
    startup.c
    Код (Text):
    1. void _start()
    2. {
    3. kernel_main();
    4. }
    gcc -ffreestanding -c -o startup.o startup.c
    gcc -ffreestanding -c -o kernel.o kernel.c
    gcc -ffreestanding -c -o ktty.o ktty.c
    ld -Ttext 0x200000 -o kernel.bin startup.o ktty.o kernel.o
    objcopy kernel.bin -O binary

    Файл получается около 8кб..Откуда такой размер?
    Hex view:
    Код (Text):
    1. seg000:00000000  55 89 E5 83 EC 08 E8 35  00 00 00 C9 C3 90 90 90  UÉõÃüø5...ã+ÐÐÐ
    2. seg000:00000010  55 89 E5 83 EC 04 C7 45  FC 00 80 0B 00 8B 45 FC  UÉõÃü¦E¹.À .ËE¹
    3. seg000:00000020  C6 00 68 8B 45 FC 40 C6  00 07 8B 45 FC 83 C0 02  ¦.hËE¹@¦.ËE¹ÃL
    4. seg000:00000030  C6 00 69 8B 45 FC 83 C0  03 C6 00 07 C9 C3 90 90  ¦.iËE¹ÃL¦.ã+ÐÐ
    5. seg000:00000040  55 89 E5 83 EC 08 E8 C5  FF FF FF EB FE 90 90 90  UÉõÃüø+   û¦ÐÐÐ
    6. seg000:00000050  FF FF FF FF 00 00 00 00  FF FF FF FF 00 00 00 00      ....    ....
    7. seg000:00000060  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  ................
    8. seg000:00000070  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  ................
    9. seg000:00000080  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  ................
    10. seg000:00000090  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  ................
    11. seg000:000000A0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  ................
    12. seg000:000000B0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  ................
    13. seg000:000000C0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  ................
    14. seg000:000000D0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  ...............
    15. И так далее
    Зачем он такой файл создает кривой?Или может чего не понимаю...Подскажите..
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    там дальше нули? это выравнивание

    зы.
    video[2], video[3] помоему компактнее
     
  10. vorobei99

    vorobei99 New Member

    Публикаций:
    0
    Регистрация:
    16 фев 2008
    Сообщения:
    25
    Адрес:
    Moscow
    Тоесть он выравнивает так что бы было кратен восьми адрес..так помойму в рассылки писали....Тоесть ни как не схитрить?
     
  11. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    он выравнивает секцию на границу. а выравнивание может быть от 512 до 4килобайт обычно
     
  12. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    vorobei99
    Код (Text):
    1. # script.ld
    2. OUTPUT_FORMAT("binary")
    3. SECTIONS {
    4.     BASE = 2M ;
    5.     .text BASE : AT(0) {
    6.         *(.text) ;
    7.     }
    8. }
    Код (Text):
    1. # ld -T script.ld startup.o ktty.o kernel.o -o image