ошибка в MBR

Discussion in 'WASM.ASSEMBLER' started by FaNt0m, Aug 1, 2008.

  1. FaNt0m

    FaNt0m New Member

    Blog Posts:
    0
    Joined:
    May 19, 2008
    Messages:
    41
    Написал простенький загрузчик на тасме, читающий диск в CHS-mode. Работает нормально.
    Code (Text):
    1.         xor ax,ax
    2.         mov ss,ax
    3.         mov sp,6c00h
    4.         sti
    5.         push ax
    6.         pop es
    7.         push ax
    8.         pop ds
    9.         cld
    10.         push 1000h
    11.         mov si,7c23h
    12.         mov di,1000h
    13.         mov cx,01ddh
    14.         rep movsb
    15.         ret
    16. ;----------------------------------------  
    17. ;0000:1000h    
    18.         mov bx,7c00h
    19.         mov ax, 0201h
    20.         mov dl, 80h
    21.        
    22.         mov dh, 01h  ;        
    23.         mov ch,0      ;частный случай загрузки с 63-го сектора
    24.         mov cl,1       ;
    25.        
    26.         int 13h
    27.         push 7c00h
    28.         ret
    29. ;----------------------------------------
    30.         end        start
    А вот, тот же загрузчик, но для в LBA-mode. Не работает. Комп просто виснет.. Не скажете, в чем дело?

    Code (Text):
    1. xor ax,ax
    2.         mov ss,ax
    3.         mov sp,6c00h
    4.         sti
    5.         push ax
    6.         pop es
    7.         push ax
    8.         pop ds
    9.         cld
    10.         push 1000h
    11.         mov si,7c23h
    12.         mov di,1000h
    13.         mov cx,01eah
    14.         rep movsb
    15.         ret
    16. ;----------------------------------------  
    17. ;0000:1000h    
    18.         mov ah,42h
    19.         mov dl,0
    20.         mov si,1014h          
    21.         int 13h
    22.         push 7c00h
    23.         ret
    24.        
    25.         dap:
    26. packet_size       db 10h      ; размер пакета 10h байт
    27. reserved    db 00h      ; заначка для будущих расширений
    28. n_sec              db 01h      ; читаем один сектор
    29. buf_seg     db  0        ; сюда будет занесен сегмент буфера-приемника
    30. buf_off                dw 7c00h  ; смещение буфера-приемника
    31. x_sec              dd 63       ; сюда будет занесен номер сектора для чтения
    32. dd 0
    33. ;----------------------------------------
    34.         end        start             ; конец программы
     
  2. diamond

    diamond New Member

    Blog Posts:
    0
    Joined:
    May 21, 2004
    Messages:
    507
    Location:
    Russia
    Неправильно формируется структура данных для LBA-чтения. Правильно так:
    Code (Text):
    1. packet_size db 10h
    2. reserved    db 0
    3. n_sec       dw 1
    4. buf_off     dw 7C00h
    5. buf_seg     dw 0
    6. x_sec       dd 63
    7.            dd 0
     
  3. FaNt0m

    FaNt0m New Member

    Blog Posts:
    0
    Joined:
    May 19, 2008
    Messages:
    41
    Все равно не пашет((
    diamond, ну почему же неправильно? размер пакета указан: 10h. А у вас получается: db+db+dw+dw+dw+dd+dd=1Eh байт! Или я чего-то недопонимаю?
     
  4. FaNt0m

    FaNt0m New Member

    Blog Posts:
    0
    Joined:
    May 19, 2008
    Messages:
    41
    Все равно не пашет((
    diamond, ну почему же неправильно? размер пакета указан: 10h. А у вас получается: db+db+dw+dw+dw+dd+dd=1Eh байт(даже если последний dd не учитывать, то все равно, 16h)! Или я чего-то недопонимаю?
     
  5. FaNt0m

    FaNt0m New Member

    Blog Posts:
    0
    Joined:
    May 19, 2008
    Messages:
    41
  6. FaNt0m

    FaNt0m New Member

    Blog Posts:
    0
    Joined:
    May 19, 2008
    Messages:
    41
    Заработало!!! Проблема оказалась в моей невнимательности... Спасибо.
     
  7. Phantom_84

    Phantom_84 New Member

    Blog Posts:
    0
    Joined:
    Jun 6, 2007
    Messages:
    820
    Кто так пишет!
    Code (Text):
    1.         mov si,1014h          
    2.         int 13h
    Научись использовать символические ссылки. Кроме того поддержку EDD и возможность использовать функции чтения/записи нужно проверять обязательно, причем в отдельности для каждого используемого диска. Также нужно проверять результат выполнения функции.
     
  8. FaNt0m

    FaNt0m New Member

    Blog Posts:
    0
    Joined:
    May 19, 2008
    Messages:
    41
    Дело в том, что код разбит на 2 части, каждая из которых загружается по разным смещениям(7С00h и 1000h сщоотв.). Поэтому ссылки использовать нельзя.
     
  9. Phantom_84

    Phantom_84 New Member

    Blog Posts:
    0
    Joined:
    Jun 6, 2007
    Messages:
    820
    Code (Text):
    1.         xor ax,ax
    2.         mov ss,ax
    3.         mov sp,6c00h
    4.         sti
    5.         push ax
    6.         pop es
    7.         push ax
    8.         pop ds
    9.         cld
    10.         push 1000h
    11.         mov si,7c23h
    12.         mov di,1000h
    13.         mov cx,01eah
    14.         rep movsb
    15.         ret
    Здесь правильнее использовать дальнюю передачу управления (retf):
    Code (Text):
    1. push ax
    2. push di
    3. rep movsb
    4. retf
     
  10. FaNt0m

    FaNt0m New Member

    Blog Posts:
    0
    Joined:
    May 19, 2008
    Messages:
    41
    Почему-то когда я меняю номер сектора для чтения с 63 на 09318480h опять ничего не работает(( Может быть нужно перейти в защищенный режим, ведь адрес 09318480h 32-разрядный... Какие есть мнения?
     
  11. Phantom_84

    Phantom_84 New Member

    Blog Posts:
    0
    Joined:
    Jun 6, 2007
    Messages:
    820
    fasm:
    Code (Text):
    1. relpart equ 1000h
    2.  
    3. org 7C00h
    4.  
    5. cld
    6. xor ax,ax
    7. mov ds,ax
    8. mov si,relpartbase
    9. mov es,ax
    10. mov di,relpart
    11. cli
    12. mov ss,ax
    13. mov sp,di
    14. sti
    15. push ax
    16. push di
    17. mov cx,(relpartsize+1)/2
    18. rep movsw
    19. retf
    20.  
    21. align 2
    22.  
    23. relpartbase: org relpart
    24. ...
    25. relpartsize=$-$$ ; -relpart
    26.  
    27. org relpartbase+relpartsize
    28. times 7DBEh-$ nop ; или просто rb 7DBEh-$
     
  12. Phantom_84

    Phantom_84 New Member

    Blog Posts:
    0
    Joined:
    Jun 6, 2007
    Messages:
    820
    Ты сначала жесткий диск переведи в защищенный режим :))) А если бы ты полностью задействовал 64-разрядный номер сектора, тогда вообще жесткий диск нужно было переводить в long mode :)))
     
  13. diamond

    diamond New Member

    Blog Posts:
    0
    Joined:
    May 21, 2004
    Messages:
    507
    Location:
    Russia
    Вероятно, 63 - это начало первого раздела, и он primary, а 9318480h - это начало какого-то другого раздела, который вовсе даже не primary, а лежит где-то в extended-разделе. Вероятно, ошибка не в коде из MBR как таковом, а в том, что этот код передаёт управление бутсектору логического тома на extended разделе, который в таком случае не обязан правильно работать.

    В частности, на FAT-разделе поле по смещению +1C, число скрытых секторов, для томов на extended-разделе указывает не абсолютный номер сектора, а относительно начала extended-раздела. Поскольку обычно FAT-загрузчик использует значение этого поля как базу при чтении остальных данных, то прочтёт он не то, что запросто может привести к повисанию.
     
  14. Phantom_84

    Phantom_84 New Member

    Blog Posts:
    0
    Joined:
    Jun 6, 2007
    Messages:
    820
    А если серьезно, то у тебя на диске сектора с этим номером может не быть вообще (каков объем диска?) или его содержимое таково, что тебе кажется, что ты не смог его прочесть. Как ты вообще определяешь, что ничего не работает? Загружаешь неизвестно что и передаешь туда управление?
     
  15. FaNt0m

    FaNt0m New Member

    Blog Posts:
    0
    Joined:
    May 19, 2008
    Messages:
    41
    Ясно)) Спасибо.
     
  16. diamond

    diamond New Member

    Blog Posts:
    0
    Joined:
    May 21, 2004
    Messages:
    507
    Location:
    Russia
    Откуда вообще взято значение 9318480h? Из таблицы разделов? Тогда это может быть EBR, extended boot record, которая может вообще не содержать кода. Каким-то образом определено начало логического диска? Тогда могут быть проблемы, описанные в #13. Ещё каким-то образом?
     
  17. Phantom_84

    Phantom_84 New Member

    Blog Posts:
    0
    Joined:
    Jun 6, 2007
    Messages:
    820
    diamond, откуда такая инфа? Как же я тогда гружу Винды из расширенного раздела?
     
  18. FaNt0m

    FaNt0m New Member

    Blog Posts:
    0
    Joined:
    May 19, 2008
    Messages:
    41
    Сектор с таким номером присутствует ТОЧНО. Проверял в WinHEX. Действительно, это есть начало непримари раздела. Вот только код этот работает когда ось еще не загружена, а процессор вообще не знает, что такое раздел и жесткий диск вообще, и функции int 13h это тож мало волнует(если верить КК)
     
  19. Phantom_84

    Phantom_84 New Member

    Blog Posts:
    0
    Joined:
    Jun 6, 2007
    Messages:
    820
    Бут-сектор тома обычно находится сразу после EPR, проверь WinHex'ом и попробуй загрузить сектор 9318481h.
     
  20. FaNt0m

    FaNt0m New Member

    Blog Posts:
    0
    Joined:
    May 19, 2008
    Messages:
    41
    Читал, что переход в защищенный режим осуществляется через int 2fh... Не дос ли это функция и нет ли у кого примера такого перехода?