Кто-нибудь знает где найти информацию по программированию операционных систем? В инете искал не нашёл. Помогите
Вот, например http://subscribe.ru/archive/comp.soft.prog.osdev/ Вообщето в интернете полно всего, причем, найдя что-то интересующее тебя хотя бы в одном экземпляре, получишь кучу ссылок на схожую тематику.
http://www.codenet.ru/progr/os/ - ос без защищенного режима http://www.google.ru/search?hl=ru&newwindow=1&q=os+development - должно быть куча всего
Насчет отладки. Лично я все тестил на ВМВаре и на реальной тачке. Явной отладки не было - пользовался выводом на экран и зацикливанием программы. Вероятно, Bochs позволяет дебажиться, но я, провозившись с ним минут 20, забил.
Почему? Довольно адекватный эмулятор. При отладке, правда, иногда ему сносит крышу, но худо-бедно посмотреть что происходит можно.
Не могу разобраться с адресами Код первичного загрузчика из рассылки http://subscribe.ru/archive/comp.soft.prog.osdev/ Код (Text): [BITS 16] [ORG 0] ; сколько цилиндров считывать %define CYLS_TO_READ 10 ; максимальное количество ошибок чтения ; (повторять операцию чтения необходимо как минимум три раза, ; т.к. ошибки возможны из-за того, что мотор привода не разогнался) %define MAX_READ_ERRORS 5 ; Точка входа: entry: cli ;на время установки стека запретим прерывания mov ax, cs mov ds, ax mov es, ax mov ss, ax mov sp, start sti ;разрешим прерывания ;; Необходимо скопировать загрузчик в ;; верхнюю часть доступной памяти, т.к. ;; текущий код (находящийся по адресу 0x0:0x7c00 ;; будет переписан загруженными с дискеты данными ; В DS - адрес исходного сегмента mov ax, 0x07c0 mov ds, ax ; В ES - адрес целевого сегмента mov ax, 0x9000 mov es, ax ; Копируем с 0 xor si, si xor di, di ; Копируем 128 двойных слов (512 байт) mov cx, 128 rep movsd ; Прыжок туда, где теперь находится бутсектор ; (0x9000: 0) jmp 0x9000:start ; следующий код выполняется по адресу 0x9000:0 start: ; занесем новые значения в сегментные регистры mov ax, cs mov ds, ax mov ss, ax ; обрадуем пользователя сообщением mov si, msg_loading call kputs ; Дальнейшая процедура выполняет чтение цилиндра ; начиная с указанного в DI плюс нулевой цилиндр (в самом конце) ; В AX - адрес сегмента в который будут записаны считанные данные mov di, 1 mov ax, 0x290 xor bx, bx .loop: mov cx, 0x50 mov es, cx push di ; Вычисляем какую головку использовать shr di, 1 setc dh mov cx, di xchg cl, ch pop di ; Уже все цилиндры считали? cmp di, CYLS_TO_READ je .quit call kread_cylinder ;; Цилиндр считан по адресу 0x50:0x0 - 0x50:0x2400 ;; (линейный 0x500 - 0x2900) ;; Выполним копирование этого блока по нужному адресу pusha push ds mov cx, 0x50 mov ds, cx mov es, ax xor di, di xor si, si mov cx, 0x2400 rep movsb pop ds popa ; Увеличим DI, AX и повторим все сначала inc di add ax, 0x240 jmp short .loop .quit: ; Мы считывали начиная с 1-го цилиндра! ; (т.к. участок 0x50:0 использовался как буфер данных) ; теперь он свободен и мы можем считать нулевой цилиндр в него mov ax, 0x50 mov es, ax mov bx, 0 mov ch, 0 mov dh, 0 call kread_cylinder ; Прыжок на загруженный код jmp 0x0000:0x0700 kread_cylinder: ;; процедура читает заданный цилиндр ;; ES:BX - буфер ;; CH - цилиндр ;; DH - головка ; Сбросим счетчик ошибок mov [.errors_counter], byte 0 pusha ; Сообщим пользователю, какой цилиндр и головку читаем mov si, msg_cylinder call kputs mov ah, ch call kputhex mov si, msg_head call kputs mov ah, dh call kputhex mov si, msg_crlf call kputs popa pusha .start: mov ah, 0x02 mov al, 18 mov cl, 1 ; Прерывание дискового сервиса BIOS int 0x13 jc .read_error popa ret .errors_counter:db 0 .read_error: ; Если произошла ошибка, то увеличим счетчик, ; и выведем сообщение с кодом ошибки inc byte [.errors_counter] mov si, msg_reading_error call kputs call kputhex mov si, msg_crlf call kputs ; Счетчик ошибок превысил максимальное значение? cmp byte [.errors_counter], MAX_READ_ERRORS jl .start ; Ничего не получилось :( mov si, msg_giving_up call kputs hlt jmp short $ hex_table:db "0123456789ABCDEF" kputhex: ; Процедура преобразует число в ASCII-код ; его шестнадцатеричного представления и выводит его ; (Да, я знаю, что это можно сделать четырьмя командами :)) pusha xor bx, bx mov bl, ah and bl, 11110000b shr bl, 4 mov al, [hex_table+bx] call kputchar mov bl, ah and bl, 00001111b mov al, [hex_table+bx] call kputchar popa ret ; Процедура выводит символ в AL на экран kputchar: pusha mov ah, 0x0E int 0x10 popa ret ; Процедура выводит строку, на которую указывает SI, на экран kputs: pusha .loop: lodsb test al, al jz .quit mov ah, 0x0e int 0x10 jmp short .loop .quit: popa ret ; Служебные сообщения msg_loading:db "the Operating System is loading...", 0x0A, 0x0D, 0 msg_cylinder:db "Cylinder:", 0 msg_head:db ", head:",0 msg_reading_error:db "Error reading from floppy. Errcode:",0 msg_giving_up:db "Too many errors, giving up",0x0A,0x0D, "Reboot your system, please", 0 msg_crlf:db 0x0A, 0x0D,0 ; Сигнатура бутсектора: TIMES 510 - ($-$$) db 0 db 0xAA, 0x55 Почему в самом начале ds = 0x07c0, si = 0x0000, а не ds = 0x0000, si = 0x7c00? И потом считанные данные куда-то странно копируются. Что-то ничего не понимаю. И почему если вторичный загрузчик такой Код (Text): [ORG 0x700] [BITS 16] jmp start times 0x2400 db 0 start: mov [0xb8000], 'A' qwe: jmp qwe то ничего не работает? Получается если у меня вторичный загрузчик (вместе с ядром) больше чем 18 секторов то ничего не будет работать? Mika0x65 А как скомпилить Bochs? У меня исходники с ноябрьского хакера, пробовал, не получается n0name А где взять emu386?
Mika0x65 А как запустить этот Bochs? Запускаю, указываю бинарник как образ флопа, пишет что диск не загрузачный
На самом деле это со мной тоже было. Попробуй сначала выбрать опцию сохранить настройки в файл, а потом запускай загрузку.
run.bat: Код (Text): copy n00s.img "E:\Programming\Virtual Machines\Bochs-2.3.pre2\n00s.img" "E:\Programming\Virtual Machines\Bochs-2.3.pre2\bochs.exe" -q -f bochsrc.txt bochsrc.txt: Код (Text): # configuration file generated by Bochs config_interface: textconfig display_library: win32 megs: 32 romimage: file="E:\Programming\Virtual Machines\Bochs-2.3.pre2/BIOS-bochs-latest", address=0x00000 vgaromimage: file="E:\Programming\Virtual Machines\Bochs-2.3.pre2/VGABIOS-lgpl-latest" boot: floppy floppy_bootsig_check: disabled=1 floppya: 1_44="n00s.img", status=inserted # no floppyb ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14 ata1: enabled=1, ioaddr1=0x170, ioaddr2=0x370, irq=15 ata2: enabled=0 ata3: enabled=0 parport1: enabled=1, file="" parport2: enabled=0 com1: enabled=1, mode=null, dev="" com2: enabled=0 com3: enabled=0 com4: enabled=0 usb1: enabled=0 i440fxsupport: enabled=1 vga_update_interval: 40000 vga: extension=vbe cpu: count=1, ips=2000000, reset_on_triple_fault=1 text_snapshot_check: enabled=0 private_colormap: enabled=0 clock: sync=none, time0=local # no cmosimage ne2k: enabled=0 pnic: enabled=0 sb16: enabled=0 # no loader log: log.txt logprefix: %t%e%d debugger_log: - panic: action=ask error: action=report info: action=report debug: action=ignore pass: action=fatal keyboard_type: mf keyboard_serial_delay: 250 keyboard_paste_delay: 100000 keyboard_mapping: enabled=0, map= user_shortcut: keys=none mouse: enabled=0, type=ps2