-
Notifications
You must be signed in to change notification settings - Fork 4
/
blog.txt
344 lines (221 loc) · 23.9 KB
/
blog.txt
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
Built-in Proolix blog. Cyrillic in UTF-8 codetable
Author: Prool
Date format: dd.mm.yyyy
В прямом хронологическом порядке
Отчет о происходящем
--------------------------------------------------------------------------------------------
18-Nov-2016. Proolix-l нормально собирается в Ubuntu 15.10 64bit, gcc 5.2.1
И НЕ собирается в Ubuntu 16.10 64bit, gcc 6.2.0
Ошибка при сборке stage2
ctmp.s:590: Error: 8-byte relocation cannot be applied to 4-byte field
в строке
leal .LC0@GOTOFF(%ebx), %eax
Буду думать
22-Nov-2016. Проблему с методом адресации GOTOFF частично решил.
Двигаюсь дальше
* * *
Ну, мучиться, так мучиться. Проще переписать switch в виде батареи вложенных if, чем разбираться
в хитрой адресации.
И вместо глобальных переменных в смысле языка С надо использовать физические ячейки памяти (найти
для этого соответствующий неиспользуемый блок)
Это тупо и громоздко, но это будет работать!
24-Nov-2016 diskd сделано
На будущее: при инсталляции Пруликса на жесткий диск проще писать stage2 (ct) из ОЗУ, все равно оно
уже там, загружено
18-Dec-2016 инсталляция именно так и сделана (команда install)
29-Dec-2016 Обнаружена ошибка: в конце жесткого диска виртуальной машины геометрия считается неправильно: растет номер цилиндра,
а не головки и вычисляется цилиндр больше, чем есть. Проверить
30-Dec-2016 Созданы файлы todo.txt and bugs.txt
Ошибка, обнаруженная вчера, оказалась не ошибкой (см. bugs.txt)
11-Jan-2017
Сейчас загрузочную флешку я делаю при помощи unetbootin из образа загрузочной дискеты.
Но должно работать и без unetbootin, а именно: boot sector + binary image file 'ct'
Не забыть только, что флешка - это диск 0x80 и вообще инсталлировать на нее надо примерно как
на HDD, то есть как сделано в команде install
Проверить!
Сделать также тестовую сборку ядра Proolix-l (ct) в виде исполняемого файла Линукс.
Зачем? Для тестирования некоторых функций. Или для несложной инсталляции Пруликса
на флешку при помощи слегка модифицированной команды install (хотя то же
самое можно сделать и при помощи dd)
25-Jan-2017
Итак, что я сегодня выяснил:
Флешки бывают двух типов: флешка как HDD и флешка как дискета. У флешки-HDD первый физич. блок это master boot record
с таблицей partition table. А дальше идут разделы, чаще всего один. В терминах моего Ubuntu Linux флешка как физич. устройство
это /dev/sdb, а раздел /dev/sdb2. При загрузке с такой флешки сама флешка становится устройством 0x80 в терминах прерывания
0x13. А реальный физич. HDD - device 0x81.
Я загрузился с такой флешки (она была создана при помощи unetbootin) и набрал команду install. И инсталлировал Пруликс на
устройство 80, то есть на эту же флешку, только в raw формате (без syslinux и файловой системы). И смог загрузиться
с raw флешки.
Затем я сделал флешку другого типа (флешка-как-дискета). Первым блоком у нее идет boot sector, никакой MBR нет. На такую флешку
тоже можно при помощи unetbootin установить syslinux и загрузить с нее Proolix-l. Но при этом диск 80 - это реальный
HDD! Я этого тогда не знал и набрал команду install и инсталлировался на устройство 80 и установил Пруликс на реальный
HDD и запортил Винду на ноуте. Но такой случайный эксперимент показал, что установленный на реальный жесткий диск
реального компьютера Пруликс загружается и работает. (То есть загружается ядро, пока кроме ядра у Пруликса еще ничего нет,
файловой системы нет).
А Винду я потом восстановил без проблем, так как первый цилинд винчестера почти не используется. MBR я восстановил,
загрузившись с CD с Виндой и вначале запустив автоматич. восст. (оно ничего не дало), а потом выполнив
в консоли восстановления команду
bootrec /fixmbr
и потом на всякий случай
bootrec /fixboot
Винда стала нормально загружаться, но при этом в первом цилиндре (начиная с сектора номер 1, то есть второго сектора, то есть сектора,
непосредственно следующего за MBR) осталось ядро Пруликса и никто его не затер.
ЗАМЕЧАНИЕ СПУСТЯ НЕСКОЛЬКО ДНЕЙ: так я восстановил только диск C Винды. Для восстановления диска D пришлось использовать
rescue disk
Надо еще с Линуксом поэкспериментировать, он тоже вроде как не использует первый цилиндр
ЗАМЕЧАНИЕ: НЕ НАДО!
---------------------------------
14 июля 2017 года.
Пытался по-быстрому сделать загрузку ядра Пруликса при помощи GRUB. А именно по тому же шаблону, как memtest.
Не получилось, ни загрузка бинарного образа, ни elf'а. Надо читать документацию, а не выделываться!
16 июля 2017 года
Уже неск. дней работаю на реализацией FoolFS
Надо продумать структуры данных для системных вызовов open/read/write/close/delete_file. Особый цимес в том,
что ядро Пруликса компилируется через жопу и там невозможны статические переменные и переключатели (switch)
17 июля
Я начал забывать, что уже сделал. Статические переменные я реализовал, тоже через жопу, но "это работает".
Переменные объявляются в ассемблерном модуле prefix.s, а обращаться к ним можно как из ассемблерного модуля,
так и из модуля на C. Пример такой переменной - gCyl.
18 июля
Еще одна возможная польза от Пруликса: использовать его для термотренировки (термотестирования) компьютеров.
Пруликс никогда не спит, он постоянно крутит пустые циклы, чем нагружает процессор. Точнее пустые циклы
крутит BIOS, например, когда Пруликс находится в состоянии ожидания ввода с клавиатуры
24 июля
Для полноценного тестирования Пруликса нужно тестирование и отладка не только на виртуальной, но и на реальной
машине. Но не выделять же отдельный ноутбук только для Пруликса! Методы сосуществования с другими ОС я пока не
сделал, а хочется максимально просто. Только что пришла идея внедряться по принципу бутового вируса. То есть,
при инсталляции где-то запоминать затертые MBR и секторы после него и как-то восстанавливать
при загрузке "большой ОС" (то есть присутствующего там Линукса или Винды)
1 августа
ВНЕЗАПНО установил кроме эмулятора VirtualBox эмулятор kvm (qemu), запускающийся из командной строки.
И странно в режиме qemu-i386 (впрочем, и в qemu-x86_64) Пруликс не грузится с образа hdd (с того образа,
с которого нормально грузится в VirtualBox). С образа дискеты нормально грузится и в среде VirtualBox и
в kvm. Кроме того, образ hdd со старым ассемблерным ядром "boot" нормально грузится и в VirtualBox и в kvm.
(При этом бут сектор один и тот же, то есть тот, который не грузит с винчестера с-ядро "ct" и нормально грузит
а-ядро "boot"). Возможно, это связано еще и с тем, что у меня отнялась команда принудительной загрузки с винчестера
hdd0 (после перемещения ядра с 0x3050 на 0x3000)
Надо подумать и разобраться...
1 августа (продолжение)
Протестирована система восстановления операционной системы, расположенной на жестком диске физического компьютера
(естественно, это будет работать и на виртуальном компьютере, но там это просто не нужно)
Итак, мы хотим потестировать Пруликс на физическом компьютере так, чтобы не запортить установленную там ОС.
Есть, конечно, внешние системы бекапа-восстановления типа Акронис, но я написал свою.
1. Вставляем в физ. комп. флешку с Пруликсом (флешку, сделанную при помощи unetbootin из образа дискеты Пруликса,
это важно!)
2. Сохраняем первые 200 секторов первого винчестера физ. компа на неиспользуемые участки флешки
dd
81
0
80
1
200
3. (необзательно) Проверяем, не запортилась ли флешка, повторно загружаясь с нее (если с нее стало нельзя загрузиться,
значит что-то пошло не так и дальнейшие эксперименты лучше прекратить)
4. Инсталлируем Пруликс на первый винч. физ. компа
install
81
(да, при загрузке с флешки, сделанной unetbootin, устройство 0x81 - это первый винчестер физического компьютера,
0x80 - флешка-как-винчестер, 0x0 - виртуальный флоппи диск A)
5. Вытаскиваем флешку и загружаем физический компьютер и видим экран OS Proolix
6. После экспериментов с Пруликс (не создавайте слишком много файлов, чтобы не вылезть выше 200 сектора! проверяйте
номер последнего использованного блока командой super) загружаемся с флешки и восстанавливаем прежнюю ОС
dd
80
1
81
0
200
ПРЕДУПРЕЖДЕНИЕ И СТАНДАРТНАЯ ОТМАЗКА:
Я не даю никакой гарантии, что данные действия не повредят вашу информацию безвозвратно и не несу
никакой ответственности. То, что у меня это получилось, для вас не гарантирует ничего!
Багрепорты будут приняты с благодарностью, ругань и судебные иски будут отправлены в /dev/null
--------------------------------------------------------------------------------------------------------------------
6 сентября
Дальнейшие планы
- чтобы инсталляция Пруликс на винч. не затирала созданные там файлы, надо разделить инсталляцию ядра (команду
install) и форматирование диска (создание пустой файловой системы) командой format
- надо продумать о копировании и сохранении созданных файлов
Всю файловую систему можно копировать с винч. на дискету и обратно командой dd (только осторожно)
То же самое касается копирования с винч. на флешку и обратно
Если написать программу для работы с файловой системой FoolFS из Линукса, можно будет копировать файлы линукса на
образ дискеты (и соответственно, на флешку). И обратно. И на образ винчестера виртуальной машины
Для копирования отдельных файлов между устройствами сделать команды
readfile
writefile
для чтения файла в отдельный большой буфер (отдельный сегмент ОЗУ) и записи оттуда
Для автоматизации процесса придумать простейший формат файла-архива (то есть нечто типа посиксовой команды tar)
Ну и сделать простейший текстовый редактор
* * *
И сделать простейший msdos-эмулятор (примерно так, как это было сделано в старой ветке Proolix-d)
* * *
И загрузку собственных бинарных исполнимых файлов (пока в Пруликсе не будет своего компилятора, бинарники будут
делаться путем кросс-компиляции с использованием as и/или gcc)
-------------------------------------------------------------------------------------------------------------
7 сентября 2017 года
Не забыть добавить в команду rm освобождение блоков, занимамых файлом, а то появляются потерянные цепочки.
= СДЕЛАНО. Коммит от вечера 7 сент., примерно 23:05
И надо сделать chkdsk
13.09.2017. Если сегмента в 64к для ядра не хватит, можно будет сделать в отдельном сегменте оверлей.
Надо продумать об интерфейсе между ядром и оверлеем. Оверлеев может быть несколько! 640К хватит всем!
14.09.2017. Поигрался с Прульскриптом и пожалуй хватит. Он, конечно, стековый и прикольный и функционально полный,
но более-менее сложную программу делать на нем некомфорно. По крайней мере мне на прульксрипте программировать
менее комфотно, чем на C. Значит, надо как в старом проекте Proolix-d делать систему кросс-компиляции
Отака фігня, малята!
09.10.2017. Прерывание 91h (системный вызов) нормально работает из асм. утилиты и не работает из С. Точнее, из С
работает только с нулевого уровня стека, а из вызванной подпрограммы уже нет. Подумать почему, подумать, может
составной iret портит стек.
Может, переделать на уже опробованный вариант с прерываниями 92/92 (дурацкий метод ljmp/ljmp)
Кстати, вместо ljmp можно использовать int с соотв. коррекцией указателя стека (безопасно ли это?)
(спустя несколько минут)
Всё оказалось проще. В составном iret я для освобождения ячеек стека почему то использовал decw sp, а надо incw sp.
В прерывании 21 я освобождал стек командами popw ax, а в 91-м решил не портить ax и вначале написал фигню
(еще спустя неск. минут)
Но все равно сис. вызов из С пока не получается. Пойду спать...
10.10.2017 нашел халепу с .code16gcc, при котором добавляются префиксы к командам ret, iret, и некоторым другим.
И префиксы гадят. А при директиве .code16 вроде все ок в с-утилите. Но убирать в ядре .code16gcc не надо, оно
там нужно. Всё сложно, надо смотреть и тестировать внимательно!!!!111
* * *
Заработали из C: тестовый системный вызов и системный вызов, возвращающий значение. С передачей параметра в сисвызов
пока не все безоблачно. И ret из функции main() вызывает зависание, но я уже нашел, какие команды грубо отхачить, чтобы
стек не портился
save!
11.10.2017
Разобрался с сис. вызовом, которому передаю параметр, тем самым сделал маленький шажок вперед и опять уперся в глюк,
уже на чистом C...
12.10.2017
... потому что нельзя смешивать .code16 и .code16gcc. Точнее, смешивать можно, но потом в стеке можешь запутаться.
И скомпилированный при помощи gcc ассемблерный код нуждается ТОЛЬКО в .code16gcc,
соответственно для простоты и связанный с
C-программой мой ассемблерный код тоже должен быть скомпилирован с опцией .code16gcc
(спустя час с лишним)
Уфф, вроде разобрался и с зависанием при вызове из C функции на C, и с code16/code16gcc и со стеком, и со странными командами
leal в начале и конце скомпилированного кода
Работа с сис. вызовами из утилит на асме или C готова!
13.10.2017 я продумал как сделать работу с командной строкой. В начале кода любой утилиты будут две словных ячейки, куда ядро
положит far адрес командной строки. Программа ее сможет разбирать самостоятельно. А для готовых исходников надо сделать
модуль parse_cli, который будет парсить строку на кусочки, размещать их в конце сегмента (то есть в стеке, начиная со
смещения fffe) и формировать стандартные параметры main(argc,argv). А в будущем и (argc,argv,env)
И надо делать библиотеку libc
И на будущее в исполнимые файлы Пруликса вставить сигнатуру, например так
start: jmp continue
.word 0xDDDD
continue:
Так же было сделано в старой версии Proolix-d, только там заняты сигнатуры DEAD и DEAF (воторой для exe формата, не
реализованного в том проекте)
* * *
И получилась сигнатура EB 02 DD DD
А для скриптов на прульскрипте #proolskript, то есть #pro
Для текстовых документов proolix-style #txt, то есть #txt
Остальное это наверное досовские com файлы, для них надо запускать дос-эмулятор
ВОПРОС: надо ли у утилит, написанных на ассемблере и на С делать разные сигнатуры? Для чего
это может понадобиться? Чтобы С-утилитам какую-то среду готовить? Но с-утилиты могут и сами
себе готовить среду, в префиксе (файл prefix.S, который по сути есть rtl - runtime library
или в Turbo C и Proolix-d ЭТО называлось c0t.obj, точнее c0?.obj)
==============================================================================================================
24-Sep-2018
Длительное время моей рабочей ОС была Ubuntu. И вот она мне надоела своей монстроидностью (требованиями к ОЗУ и процессору, а у меня обычно слабенькие машины) и я перешел на Debian с легким оконным менеджером lxde. И вот сегодня в тестовых целях собрал Proolix в Дебиане.
Инструментальная ОС: Debian 9 x86_64
Компилятор: gcc 6.3.0
Компьютер Lenovo G470
Анонс: В будущем я планирую смертельный номер: сборку Proolix в среде MacOS. Стандартный компилятор там clang, а я с ним почти не работаю, я его и в Дебиане не знаю.
Пруль