Программирование оп. систем

Тема в разделе "WASM.BEGINNERS", создана пользователем svas, 8 дек 2006.

  1. svas

    svas New Member

    Публикаций:
    0
    Регистрация:
    31 окт 2006
    Сообщения:
    39
    Кто-нибудь знает где найти информацию по программированию операционных систем? В инете искал не нашёл. Помогите
     
  2. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Таненбаун?
     
  3. nermest

    nermest New Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    157
    Вот, например
    http://subscribe.ru/archive/comp.soft.prog.osdev/
    Вообщето в интернете полно всего, причем, найдя что-то интересующее тебя хотя бы в одном экземпляре, получишь кучу ссылок на схожую тематику.
     
  4. P_F

    P_F New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2006
    Сообщения:
    116
    Адрес:
    Russia
    а ещё есть исходники осей, кууучами :) от малого до велика, так что ищи лучше...
     
  5. svas

    svas New Member

    Публикаций:
    0
    Регистрация:
    31 окт 2006
    Сообщения:
    39
    nermest
    Начал читать рассылку. А можно как-нибудь отлаживать бинарники которые получаются?
     
  6. svas

    svas New Member

    Публикаций:
    0
    Регистрация:
    31 окт 2006
    Сообщения:
    39
    Весь инет перерыл. Почти ничего не нашёл. Если можно дайте ещё пару ссылок для начинающих.
     
  7. nermest

    nermest New Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    157
  8. nermest

    nermest New Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    157
    Насчет отладки. Лично я все тестил на ВМВаре и на реальной тачке. Явной отладки не было - пользовался выводом на экран и зацикливанием программы. Вероятно, Bochs позволяет дебажиться, но я, провозившись с ним минут 20, забил.
     
  9. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Почему? Довольно адекватный эмулятор. При отладке, правда, иногда ему сносит крышу, но худо-бедно посмотреть что происходит можно.
     
  10. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    я бут сектор отлаживал emu386. А дальше уже свой отладчик прикрутил :)
     
  11. svas

    svas New Member

    Публикаций:
    0
    Регистрация:
    31 окт 2006
    Сообщения:
    39
    Не могу разобраться с адресами

    Код первичного загрузчика из рассылки http://subscribe.ru/archive/comp.soft.prog.osdev/
    Код (Text):
    1. [BITS 16]
    2. [ORG 0]
    3. ; сколько цилиндров считывать
    4. %define CYLS_TO_READ 10
    5. ; максимальное количество ошибок чтения
    6. ; (повторять операцию чтения необходимо как минимум три раза,
    7. ; т.к. ошибки возможны из-за того, что мотор привода не разогнался)
    8. %define MAX_READ_ERRORS 5
    9. ; Точка входа:
    10. entry:
    11. cli ;на время установки стека запретим прерывания
    12. mov ax, cs
    13. mov ds, ax
    14. mov es, ax
    15. mov ss, ax
    16. mov sp, start
    17. sti ;разрешим прерывания
    18. ;; Необходимо скопировать загрузчик в
    19. ;; верхнюю часть доступной памяти, т.к.
    20. ;; текущий код (находящийся по адресу 0x0:0x7c00
    21.         ;; будет переписан загруженными с дискеты данными
    22. ; В DS - адрес исходного сегмента
    23. mov ax, 0x07c0
    24. mov ds, ax
    25.  
    26.         ; В ES - адрес целевого сегмента
    27. mov ax, 0x9000
    28. mov es, ax
    29. ; Копируем с 0
    30. xor si, si
    31. xor di, di
    32. ; Копируем 128 двойных слов (512 байт)
    33. mov cx, 128
    34. rep movsd
    35. ; Прыжок туда, где теперь находится бутсектор
    36. ; (0x9000: 0)
    37. jmp 0x9000:start
    38. ; следующий код выполняется по адресу 0x9000:0
    39. start:
    40.         ; занесем новые значения в сегментные регистры
    41. mov ax, cs
    42. mov ds, ax
    43. mov ss, ax
    44. ; обрадуем пользователя сообщением
    45. mov si, msg_loading
    46. call kputs
    47. ; Дальнейшая процедура выполняет чтение цилиндра
    48. ; начиная с указанного в DI плюс нулевой цилиндр (в самом конце)
    49. ; В AX - адрес сегмента в который будут записаны считанные данные
    50. mov di, 1
    51. mov ax, 0x290
    52. xor bx, bx
    53.  .loop:
    54. mov cx, 0x50
    55. mov es, cx
    56. push di
    57. ; Вычисляем какую головку использовать
    58. shr di, 1
    59. setc dh
    60. mov cx, di
    61. xchg cl, ch
    62. pop di
    63. ; Уже все цилиндры считали?
    64. cmp di, CYLS_TO_READ
    65. je .quit
    66. call kread_cylinder
    67. ;; Цилиндр считан по адресу 0x50:0x0 - 0x50:0x2400
    68. ;; (линейный 0x500 - 0x2900)
    69. ;; Выполним копирование этого блока по нужному адресу
    70. pusha
    71. push ds
    72. mov cx, 0x50
    73. mov ds, cx
    74. mov es, ax
    75. xor di, di
    76. xor si, si
    77. mov cx, 0x2400
    78. rep movsb
    79. pop ds
    80. popa
    81. ; Увеличим DI, AX и повторим все сначала
    82. inc di
    83. add ax, 0x240
    84. jmp short .loop
    85.  .quit:
    86. ; Мы считывали начиная с 1-го цилиндра!
    87. ; (т.к. участок 0x50:0 использовался как буфер данных)
    88. ; теперь он свободен и мы можем считать нулевой цилиндр в него
    89. mov ax, 0x50
    90. mov es, ax
    91. mov bx, 0
    92. mov ch, 0
    93. mov dh, 0
    94. call kread_cylinder
    95. ; Прыжок на загруженный код
    96. jmp 0x0000:0x0700
    97. kread_cylinder:
    98.         ;; процедура читает заданный цилиндр
    99. ;; ES:BX - буфер
    100. ;; CH - цилиндр
    101. ;; DH - головка
    102. ; Сбросим счетчик ошибок
    103. mov [.errors_counter], byte 0
    104. pusha
    105. ; Сообщим пользователю, какой цилиндр и головку читаем
    106. mov si, msg_cylinder
    107. call kputs
    108. mov ah, ch
    109. call kputhex
    110. mov si, msg_head
    111. call kputs
    112. mov ah, dh
    113. call kputhex
    114. mov si, msg_crlf
    115. call kputs
    116. popa
    117. pusha
    118.  .start:
    119. mov ah, 0x02
    120. mov al, 18
    121. mov cl, 1
    122. ; Прерывание дискового сервиса BIOS
    123. int 0x13
    124. jc .read_error
    125. popa
    126. ret
    127.  .errors_counter:db 0
    128.  .read_error:
    129.         ; Если произошла ошибка, то увеличим счетчик,
    130. ; и выведем сообщение с кодом ошибки
    131. inc byte [.errors_counter]
    132. mov si, msg_reading_error
    133. call kputs
    134. call kputhex
    135. mov si, msg_crlf
    136. call kputs
    137. ; Счетчик ошибок превысил максимальное значение?
    138. cmp byte [.errors_counter], MAX_READ_ERRORS
    139. jl .start
    140. ; Ничего не получилось :(
    141. mov si, msg_giving_up
    142. call kputs
    143. hlt
    144. jmp short $
    145.  
    146. hex_table:db "0123456789ABCDEF"
    147. kputhex:
    148.         ; Процедура преобразует число в ASCII-код
    149. ; его шестнадцатеричного представления и выводит его
    150. ; (Да, я знаю, что это можно сделать четырьмя командами :))
    151.  
    152. pusha
    153. xor bx, bx
    154. mov bl, ah
    155. and bl, 11110000b
    156. shr bl, 4
    157. mov al, [hex_table+bx]
    158. call kputchar
    159. mov bl, ah
    160. and bl, 00001111b
    161. mov al, [hex_table+bx]
    162. call kputchar
    163. popa
    164. ret
    165. ; Процедура выводит символ в AL на экран
    166. kputchar:
    167. pusha
    168. mov ah, 0x0E
    169. int 0x10
    170. popa
    171. ret
    172. ; Процедура выводит строку, на которую указывает SI, на экран
    173. kputs:
    174. pusha
    175.  .loop:
    176. lodsb
    177. test al, al
    178. jz .quit
    179. mov ah, 0x0e
    180. int 0x10
    181. jmp short .loop
    182.  .quit:
    183. popa
    184. ret
    185. ; Служебные сообщения
    186. msg_loading:db "the Operating System is loading...", 0x0A, 0x0D, 0
    187. msg_cylinder:db "Cylinder:", 0
    188. msg_head:db ", head:",0
    189. msg_reading_error:db "Error reading from floppy. Errcode:",0
    190. msg_giving_up:db "Too many errors, giving up",0x0A,0x0D, "Reboot your system, please", 0
    191. msg_crlf:db 0x0A, 0x0D,0
    192. ; Сигнатура бутсектора:
    193. TIMES 510 - ($-$$) db 0
    194. db 0xAA, 0x55
    Почему в самом начале ds = 0x07c0, si = 0x0000, а не ds = 0x0000, si = 0x7c00?
    И потом считанные данные куда-то странно копируются. Что-то ничего не понимаю.
    И почему если вторичный загрузчик такой
    Код (Text):
    1. [ORG 0x700]
    2. [BITS 16]
    3. jmp start
    4. times 0x2400 db 0
    5. start:
    6. mov [0xb8000], 'A'
    7. qwe:
    8. jmp qwe
    то ничего не работает?
    Получается если у меня вторичный загрузчик (вместе с ядром) больше чем 18 секторов то ничего не будет работать?

    Mika0x65
    А как скомпилить Bochs? У меня исходники с ноябрьского хакера, пробовал, не получается
    n0name
    А где взять emu386?
     
  12. svas

    svas New Member

    Публикаций:
    0
    Регистрация:
    31 окт 2006
    Сообщения:
    39
    n0name
    Скачал emu386. Запускаю пишет "emu386 is not installed". Я может что-то не то скачал?
     
  13. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    без разницы. Адрес получается один и тот же.
    скачай бинарник.
    Возможно, я скачивал инсталлятор.
     
  14. svas

    svas New Member

    Публикаций:
    0
    Регистрация:
    31 окт 2006
    Сообщения:
    39
    n0name
    А как насчёт вторичного загрузчика? Почему не работает? Так должно быть?
     
  15. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    А для чего org == 0x700? И неплохо было б настроить сегментные регистры перед базовозависимым кодом.
     
  16. RuAsm

    RuAsm Виктор

    Публикаций:
    0
    Регистрация:
    16 июл 2006
    Сообщения:
    125
    Адрес:
    Спасск-D, Приморский край!
    вот посмотри, может поможет
     
  17. svas

    svas New Member

    Публикаций:
    0
    Регистрация:
    31 окт 2006
    Сообщения:
    39
    Спасибо, разобрался.
     
  18. svas

    svas New Member

    Публикаций:
    0
    Регистрация:
    31 окт 2006
    Сообщения:
    39
    Mika0x65
    А как запустить этот Bochs? Запускаю, указываю бинарник как образ флопа, пишет что диск не загрузачный
     
  19. nermest

    nermest New Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    157
    На самом деле это со мной тоже было. Попробуй сначала выбрать опцию сохранить настройки в файл, а потом запускай загрузку.
     
  20. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    run.bat:
    Код (Text):
    1. copy n00s.img "E:\Programming\Virtual Machines\Bochs-2.3.pre2\n00s.img"
    2. "E:\Programming\Virtual Machines\Bochs-2.3.pre2\bochs.exe" -q -f bochsrc.txt
    bochsrc.txt:
    Код (Text):
    1. # configuration file generated by Bochs
    2. config_interface: textconfig
    3. display_library: win32
    4. megs: 32
    5. romimage: file="E:\Programming\Virtual Machines\Bochs-2.3.pre2/BIOS-bochs-latest", address=0x00000
    6. vgaromimage: file="E:\Programming\Virtual Machines\Bochs-2.3.pre2/VGABIOS-lgpl-latest"
    7. boot: floppy
    8. floppy_bootsig_check: disabled=1
    9. floppya: 1_44="n00s.img", status=inserted
    10. # no floppyb
    11. ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
    12. ata1: enabled=1, ioaddr1=0x170, ioaddr2=0x370, irq=15
    13. ata2: enabled=0
    14. ata3: enabled=0
    15. parport1: enabled=1, file=""
    16. parport2: enabled=0
    17. com1: enabled=1, mode=null, dev=""
    18. com2: enabled=0
    19. com3: enabled=0
    20. com4: enabled=0
    21. usb1: enabled=0
    22. i440fxsupport: enabled=1
    23. vga_update_interval: 40000
    24. vga: extension=vbe
    25. cpu: count=1, ips=2000000, reset_on_triple_fault=1
    26. text_snapshot_check: enabled=0
    27. private_colormap: enabled=0
    28. clock: sync=none, time0=local
    29. # no cmosimage
    30. ne2k: enabled=0
    31. pnic: enabled=0
    32. sb16: enabled=0
    33. # no loader
    34. log: log.txt
    35. logprefix: %t%e%d
    36. debugger_log: -
    37. panic: action=ask
    38. error: action=report
    39. info: action=report
    40. debug: action=ignore
    41. pass: action=fatal
    42. keyboard_type: mf
    43. keyboard_serial_delay: 250
    44. keyboard_paste_delay: 100000
    45. keyboard_mapping: enabled=0, map=
    46. user_shortcut: keys=none
    47. mouse: enabled=0, type=ps2