Форум программистов, компьютерный форум, киберфорум
ОС на Assembler
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/19: Рейтинг темы: голосов - 19, средняя оценка - 4.53
41 / 40 / 23
Регистрация: 10.03.2012
Сообщений: 374

Ядро операционной системы

19.12.2013, 22:34. Показов 3819. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Пытаюсь создать загрузчик и ядро простой ОС, которое по нажатию на клавишу выполняет различные функции (смена цвета текста, вывод на экран информации о процессоре и видеокарте и др). Загрузчик записываю в бут-сектор дискеты, а ядро на 2, 3 и 4 сектора (его размер 1515 байт). Некоторые функции ядра не выполняются (например, вывод на экран производителя процессора), хотя при записи каждой функции ядра в бут сектор в виде отдельной программы, все работает (т. е. по отдельности программы работают, а вместе - нет). Дело в сохранении состояния регистров? Помогите разобраться, как решить эту проблему? Заранее спасибо!
Вложения
Тип файла: rar Desktop.rar (3.6 Кб, 60 просмотров)
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.12.2013, 22:34
Ответы с готовыми решениями:

Разработка операционной системы.
Вывод строки для ввода команд. Вывожу строку для ввода команд в таймере. Но тогда клавиатура начинает не так работать. Где можно взять...

Как написать программу, чтоб она могла запускаться без участия операционной системы
Вопрос наверное глупый, но все же интересно как написать программку простую так чтоб она могла запускаться без участия операционной...

архитектура операционной системы
какую архитектуры ставить при установки винды 7? х86 или х64? оперативка 2 гига

16
41 / 40 / 23
Регистрация: 10.03.2012
Сообщений: 374
19.12.2013, 22:58  [ТС]
Не выводится на экран производитель процессора, ASCII код введенного символа тоже неверно отображается, температура процессора и время BIOS не отображаются, beep не слышен. Хотя все эти функции по отдельности работают при их записи в бутсектор дискеты.
0
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
19.12.2013, 23:42
Опишу, как это делал я. Некоторые детали уже не помню.
Создать ПЕРВИЧНЫЙ ЗАГРУЗЧИК размером не более одного сектора (512 байт) и записать его в первый сектор дискеты, его основная функция – ЗАГРУЗКА ЯДРА и так как размер загрузчика мал, то туда можно записать например вывод цветного приветствия, номер версии, вывод времени и даты и т.п. Первичный загрузчик считывает ядро с других секторов в другую область памяти и передает туда управление. Память лучше выбрать что то 4000h:100h, тогда ядро можно создать как СОМ – файл и нормально его отлаживать в отладчике.
1
41 / 40 / 23
Регистрация: 10.03.2012
Сообщений: 374
20.12.2013, 01:18  [ТС]
AFP, я проверил каждую из функций отдельно (т. е. создал загрузчик и ядро, состоящее из одной функции). Возникли ошибки в тех же функциях, что и при их совместном включении в ядро. Получается, некоторые функции работают из первичного загрузчика, но не из ядра. Возможно, ошибка возникает из-за того, что регистр es используется и в загрузчике (push es) и в ядре (как раз в ошибочной функции). Если дело в этом, то как можно исправить?
0
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
20.12.2013, 08:43
RocBoy-D,
всё, что относится к вашему учебному мини-ядру постарайтесь создавать в этой ветке, а не в ассемблере для начинающих
0
 Аватар для Naydli
217 / 53 / 4
Регистрация: 03.08.2013
Сообщений: 278
20.12.2013, 10:40
RocBoy-D, Примеров перехода на вторичный загрузчик в сети достаточно, в альтернативе попробуйте на CD, в нем сектора имеют размер 2048 байт.
1
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
20.12.2013, 11:37
RocBoy-D,
создавайте только СОМ - файлы. Там все сегментные регистры равны.
1
1127 / 261 / 9
Регистрация: 11.06.2010
Сообщений: 1,049
20.12.2013, 13:05
Чтобы не мучаться с загрузчиком, также можно использовать GRUB и грузиться хоть с винта, хоть с CD, хоть с флешки.
2
41 / 40 / 23
Регистрация: 10.03.2012
Сообщений: 374
21.12.2013, 02:10  [ТС]
а как в Bochs создать образ дискеты с двумя файлами (первичный и вторичный загрузчики)? Или как сделать загрузку не с образа, а с floppy drive, в который уже вставлена дискета с этими двумя файлами? У меня получается только загрузка с одного файла
0
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
22.12.2013, 21:20
Лучший ответ Сообщение было отмечено как решение

Решение

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
;программа для записи ядра ОС на дискету
;меняя имя файла, размер для чтения, номер сектора для записи и
;число записываемых секторов
;можно записать первичный загрузчик и ядро на диск
 
;DOS, TASM, COM-файл
;tasm.exe /m filename.asm
;tlink.exe /t /x filename.obj
;
.model tiny
.code
.386
ORG 100h
START:
 
;----------открыть файл
    lea   dx, FileName
    mov   ax, 3D00h
    int   21h
    mov   bx, ax
 
;---------читать из файла
    mov   ah, 3Fh
    mov   cx, 512   ;размер для чтения
    lea   dx, Buffer
    int   21h
 
;---------закрыть файл
    mov   ah, 3Eh
    int   21h
 
;----------запись н адиск
    mov ah,3    ;запись на диск
    mov al,1    ;число записываемых секторов
    mov cx,1    ;в данном случае номер сектора для записи (2 для ядра)
    mov dl,0    ;диск
    mov dh,0    ;головка
    lea bx,Buffer
    int 13h
 
    ret
 
FileName   db   'Kernel.bin',0
Buffer:
    end start
1
41 / 40 / 23
Регистрация: 10.03.2012
Сообщений: 374
23.12.2013, 00:47  [ТС]
AFP, так у меня есть программа для записи файла на дискету (в аттаче). И с созданием образа для borchs тоже разобрался. Проблема вот в чем: следующая программа работает верно (выводит время на экран)
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
.MODEL  TINY
.CODE
.286
ORG 7c00h
 
Main:
   mov ax, 2
   int 10h
   mov ah,2;получаю текущее время
   int 1Ah
   mov ah,0
   mov al,ch;час в формате BCD
   ror ax, 4
   shr ah, 4
   or ax,'00'
   mov word ptr string,ax
   mov ah,0
   mov al,cl;минуты в формате BCD
   ror ax, 4
   shr ah, 4
   or ax,'00'
   mov word ptr string+3,ax
   mov ah,0
   mov al,dh;секунды в формате BCD
   ror ax, 4
   shr ah, 4
   or ax,'00'
   mov word ptr string+6,ax
   mov   ax, 1300h
   mov   cx, len
   mov   bx, 0Fh
   mov   dx, 0
   mov   bp, offset string
   int   10h
   mov   ah, 0
   int   16h
 
exit:
 
string db ?,?,':',?,?,':',?,?
len    equ  $ - string
db (512-($-Main)) dup (0)
END Main
Но при запуске ее из другой программы на экран выводится только ' : : '. Код первичного загрузчика:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
CSEG SEGMENT
ORG 7C00h
Main:
   mov   ax, 2
   int   10h
   mov   ax, 1300h
   mov   cx, len
   mov   bx, 0Ah
   mov   dx, 101h
   mov   bp, offset msg
   int   10h
 
   mov   ah, 0
   int   16h
 
   xor   ax, ax 
 
   cli
   mov   ss, ax 
   mov   sp, offset Main 
   sti
 
   mov   ds, ax
   mov   es, ax
 
   mov   ch, 0
   mov   ax, 7e00h
   mov   es, ax
   mov   bx, 0
       
   mov   ax, 0203h
   mov   cl, 2
   mov   dx, 0
   int   13h
 
   xor   ax, ax
   push  es
   push  ax
   retf
msg   db   'Loader is running.', 13, 10, ' Press any key to continue ...'
len   equ  $ - msg
db (510-($-Main)) dup (0)
dw 0AA55h
CSEG ENDS
END Main
Код ядра:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
.MODEL  TINY
.CODE
.286
ORG 0
 
Main:
   mov ax, 2
   int 10h
   mov ah,2;получаю текущее время
   int 1Ah
   mov ah,0
   mov al,ch;час в формате BCD
   ror ax, 4
   shr ah, 4
   or ax,'00'
   mov word ptr string,ax
   mov ah,0
   mov al,cl;минуты в формате BCD
   ror ax, 4
   shr ah, 4
   or ax,'00'
   mov word ptr string+3,ax
   mov ah,0
   mov al,dh;секунды в формате BCD
   ror ax, 4
   shr ah, 4
   or ax,'00'
   mov word ptr string+6,ax
 
   mov   ax, 1300h
   mov   cx, len
   mov   bx, 0Fh
   mov   dx, 0
   mov   bp, offset string
   int   10h
   mov   ah, 0
   int   16h
 
exit:
 
string db ?,?,':',?,?,':',?,?
len    equ  $ - string
db (1515-($-Main)) dup (0)
END Main
Мои программы для записи на дискету в бутсектор и на другие сектора работают (я проверял). А с переходом на вторичный загрузчик уже который день не получается. Не пойму, в чем дело?
0
 Аватар для Naydli
217 / 53 / 4
Регистрация: 03.08.2013
Сообщений: 278
24.12.2013, 09:44
RocBoy-D, ваша строка читается не из того места в памяти. Мне с ORG'ами париться не приходилось, но у меня была схожая проблема. В вашем случае нужна вставка типа mov word ptr string-7C00h, мне лень считать.
1
780 / 412 / 75
Регистрация: 29.03.2013
Сообщений: 854
24.12.2013, 10:01
RocBoy-D, я думаю, что проще искать ошибки используя дебаггер (например td). Для этого я после компиляции прогоняю obj-файл через линкер 2 раза:
1) для получения EXE-файла (для последующей отладки в td);
2) для получения BIN-файла (для записи на диск).
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@echo off
cls
IF -%1==- GOTO NOPAR_ERR
 
IF EXIST %1.OBJ DEL %1.OBJ
IF EXIST %1.LST DEL %1.LST
IF EXIST %1.exe DEL %1.exe
IF EXIST %1.bin DEL %1.bin
 
 
\PRO\TASM\BIN\TASM /m3 %1.ASM, %1.OBJ, %1.LST
IF NOT EXIST %1.obj GOTO END
\PRO\TASM\BIN\TLINK /c /C /m3 %1.OBJ,%1.EXE,con
\PRO\TASM\BIN\TLINK /t /c /C /m %1.OBJ,%1.bin,con
GOTO END
 
 
:NOPAR_ERR
ECHO.
ECHO COMMAND LINE MUST INCLUDE FILE NAME AS PARAMETER.
 
:END
Добавлено через 3 минуты
Цитата Сообщение от mashuly Посмотреть сообщение
RocBoy-D, ваша строка читается не из того места в памяти.
Читается как раз из того, а вот записываются ASCII значения не туда куда надо.
1
 Аватар для Naydli
217 / 53 / 4
Регистрация: 03.08.2013
Сообщений: 278
24.12.2013, 10:08
Цитата Сообщение от Argogo Посмотреть сообщение
Читается как раз из того, а вот записываются ASCII значения не туда куда надо.
Благодарю за поправку. Неужто почти никто не заметил, что человеку нужно только высчитать расположение этих данных в памяти?

Добавлено через 5 минут
Еще один безумный вариант - сбить CS и DS.
1
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
24.12.2013, 13:38
Получается ЕХЕ - файл. В hex редакторе удалить шапку из нулей. Записать в первый сектор FDD/HDD.
Будьте внимательны, можно убить систему на винте.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
;Первичный загрузчик
.model tiny
.code
.386
;org 100h   ;для отладки
start:
org 7C00h
;start:     ;для отладки
 
;----заремить для отладки----
    xor ax,ax   ;для отладки
    mov ds,ax   ;для отладки
    mov es,ax   ;для отладки
    mov ss,ax   ;для отладки
;-----------------------------
   mov ax, 2
   int 10h
   mov ah,2;получаю текущее время
   int 1Ah
   mov ah,0
   mov al,ch;час в формате BCD
   ror ax, 4
   shr ah, 4
   or ax,'00'
   mov word ptr [string],ax
   mov ah,0
   mov al,cl;минуты в формате BCD
   ror ax, 4
   shr ah, 4
   or ax,'00'
   mov word ptr string+3,ax
   mov ah,0
   mov al,dh;секунды в формате BCD
   ror ax, 4
   shr ah, 4
   or ax,'00'
   mov word ptr string+6,ax
   mov   ax, 1300h
   mov   cx, len
   mov   bx, 0Fh
   mov   dx, 0
   mov   bp, offset string
   int   10h
   mov   ah, 0
   int   16h
;ret            ;для отладки
    mov bx,4000h    ;сегмент для ядра
    mov es,bx   ;все сегменты на ядро
    mov ds,bx
 
    mov ax,0203h    ;3 сектора
    mov cx,0002h
    xor dx,dx
    mov bx,100h
    int 13h
 
    mov bx,ss   ;первая команда в ядре будет mov ss,bx
 
;Переход на код из второго сектора дискеты
    push es
    push 100h
    retf
 
string db ?,?,':',?,?,':',?,?
len    equ  $ - string
;db (512-($-Main)) dup (0)
end start
Получается СОМ - файл. Нужен для отладки.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
;Первичный загрузчик
.model tiny
.code
.386
org 100h    ;для отладки
;start:
;org 7C00h
start:      ;для отладки
 
;----заремить для отладки----
;   xor ax,ax   ;для отладки
;   mov ds,ax   ;для отладки
;   mov es,ax   ;для отладки
;   mov ss,ax   ;для отладки
;-----------------------------
   mov ax, 2
   int 10h
   mov ah,2;получаю текущее время
   int 1Ah
   mov ah,0
   mov al,ch;час в формате BCD
   ror ax, 4
   shr ah, 4
   or ax,'00'
   mov word ptr [string],ax
   mov ah,0
   mov al,cl;минуты в формате BCD
   ror ax, 4
   shr ah, 4
   or ax,'00'
   mov word ptr string+3,ax
   mov ah,0
   mov al,dh;секунды в формате BCD
   ror ax, 4
   shr ah, 4
   or ax,'00'
   mov word ptr string+6,ax
   mov   ax, 1300h
   mov   cx, len
   mov   bx, 0Fh
   mov   dx, 0
   mov   bp, offset string
   int   10h
   mov   ah, 0
   int   16h
ret         ;для отладки
 
;для чтения ядра в память и передача туда управления
    mov bx,4000h    ;сегмент для ядра
    mov es,bx   ;все сегменты на ядро
    mov ds,bx
 
    mov ax,0203h    ;3 сектора
    mov cx,0002h
    xor dx,dx
    mov bx,100h
    int 13h
 
    mov bx,ss   ;первая команда в ядре будет mov ss,bx
 
;Переход на код из второго сектора дискеты
    push es
    push 100h
    retf
 
string db ?,?,':',?,?,':',?,?
len    equ  $ - string
;db (512-($-Main)) dup (0)
end start
Добавлено через 1 час 0 минут
Получается СОМ - файл. Записать начиная со второго сектора дискеты.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
;Ядро
;DOS, TASM, COM-файл
;tasm.exe /m filename.asm
;tlink.exe /t /x filename.obj
;
.model tiny
.code
.386
ORG 100h
START:
 
    mov ss,bx   ;для отладки заремить
 
   mov   ax, 2
   int   10h
 
   mov   ax, 1300h
   mov   cx, len
   mov   bx, 0Ah
   mov   dx, 101h
   mov   bp, offset msg
   int   10h
 
   mov   ah, 0
   int   16h
 
msg   db   'Loader is running.', 13, 10, ' Press any key to continue ...'
len   equ  $ - msg
 
    end start
1
780 / 412 / 75
Регистрация: 29.03.2013
Сообщений: 854
24.12.2013, 15:00
Цитата Сообщение от mashuly Посмотреть сообщение
Неужто почти никто не заметил, что человеку нужно только высчитать расположение этих данных в памяти? Добавлено через 5 минут
Еще один безумный вариант - сбить CS и DS.
Там вычислять ничего не надо. Надо DS в начале настроить, а то получается, что ES=CS=1000h, а DS непонятно что содержит, ибо при загрузке не проинициализирован. Кстати в лоадере (Loader.asm из аттача) ES не инициализируется, такчто можно надписи
'Loader is running.', 13, 10, ' Press any key to continue ...'
не увидеть.
1
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
24.12.2013, 19:26
Бинарники для записи на дискету:
Вложения
Тип файла: rar OS.rar (483 байт, 19 просмотров)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.12.2013, 19:26
Помогаю со студенческими работами здесь

Развертывание операционной системы
Что означает термин "развернуть операционную систему"?

Выбор операционной системы
Передо мной выбор- выбрать операционную систему У меня организация ГУ СО КК... социальная защита Какую операционку можно ставить?

Загрузка Операционной системы
Дарова! У меня такая проблема у меня 2 жеских,на одном была виста не давно поставил ХР на другой жеский, тепереь сразу загружаеться...

Поведение Операционной системы
Добрый день всем.Операционная система стоит у меня уже более 2 недель.Устанавливались программы,удалялись программы,диск дефрагментировался...

Выбор операционной системы
Здрасте) Хотел узнать какие еще более менее популярные ОС существует кроме windows,linux,mac,solaris .


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
BOINC: 22 года — и всё ещё работает
Programma_Boinc 12.03.2026
BOINC: 22 года — и всё ещё работает Дэвид Андерсон написал ретроспективу. Кратко: в 2001 году он ушёл из United Devices, где был CTO, и за несколько месяцев написал ядро BOINC — клиент, сервер,. . .
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru