Форум программистов, компьютерный форум, киберфорум
ОС на Assembler
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/49: Рейтинг темы: голосов - 49, средняя оценка - 4.67
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6215 / 2449 / 403
Регистрация: 29.07.2014
Сообщений: 3,181
Записей в блоге: 4
27.11.2023, 12:26
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Teamur Посмотреть сообщение
возможно у вас ошибка здесь
нет, т.к. статус это маска, и нужно оставлять уже установленные биты.
тогда получаем Driver = Driver + Acknowledged

вот тебе ещё два простых образа..
в первом "Simple" нет Unreal, а во-втором "SimpleURM" он включён.
в обоих ос подтягивается с сектора(2) + имеется проверка на доступ к портам, для чего проверяются биты(0,1) регистра "Command" в пространстве PCI-Cfg (о котором ты говорил "семёрочка во-втором столбце"). Вот пример, образы и скрин, что ты должен увидеть. В инклуде virtio.inc найдёшь константы для исходника:
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
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
include 'virtio.inc'
org    0x7c00
jmp    start
BAR0   dw  0
BDF    dw  0
CMDR   dw  0
;//--------------
start: xor    ax,ax
       mov    ds,ax
       mov    es,ax
       mov    ss,ax
       mov    sp,0x7c00
       sub    sp,16
 
;if 0
       lgdt   fword[newGdt]
       jmp    UnrealMode
 
align         16
descTable     dq  0, 0x00cf93000000ffff ;<--- 4Gb дескр.данных
newGdt        dw  ($-descTable)-1
              dd  descTable
 
UnrealMode:
       cli
; NMI -
       in     al,0x70
       or     al,0x80
       out    0x70,al
; Protected
       mov    eax,cr0
       inc    al
       mov    cr0,eax
       jmp    $+2
; UnReal
       mov    bx,8
       mov    fs,bx
; Real-Mode
       dec    al
       mov    cr0,eax
       jmp    $+2
; NMI +
       in     al,0x70
       and    al,not 0x80
       out    0x70,al
 
       xor    ax,ax
       mov    fs,ax
       sti
;end if
 
;/***************************/
; VirtioNet BDF
       mov    dx,0x1AF4
       mov    cx,0x1000
       xor    si,si
       mov    ax,0xB102
       int    1Ah
       mov    [BDF],bx    ; сохранить его в переменной
 
; Взять порт I/O из BAR0
       mov    ax,0xB10A
       mov    di,0x10
       int    1Ah
       dec    cx          ; сбросить бит(0)
       mov    [BAR0],cx
 
; Взять регистр "Command" из PCI-Cfg
       mov    bx,[BDF]
       mov    ax,0xB109   ; Read word
       mov    di,0x04
       int    1Ah
       mov    [CMDR],cx
 
; Видеомода txt.80x25, и прячем курсор
       mov    ax,3
       int    10h
       mov    ax,0x0100
       mov    cx,0x2000
       int    10h
 
; Подрузить ОС в память
       mov    ax,0x0208
       mov    bx,0x7E00
       mov    cx,2
       xor    dx,dx
       int    13h
 
; Отдать ей управление
       push   cs
       push   0x7E00
       retf
;---------------------
times  510 - ($-$$) db 0
       dw     0xAA55
 
;//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
;//xxxxxxxxxxxxxxxxxxx    Код ядра ОС    xxxxxxxxxxxxxxxxxxxxxxx
;//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
org   7E00h
jmp   @begin
 
szOs     db   'UnOS in memory!   '
szIo     db   'I/O space enable: '
szMio    db   'MIO space enable: '
szPort   db   'Port data dump:   '
txtLen   =    $ - szPort
 
cursor   dw  164  ; текущая позиция курсора
size     dd  8    ; тетрад в числе для вывода (byte/word/dword)
;-------------------------------
@begin:
; Мессага, что ОС в памяти
       mov    si,szOs
       call   GetString
       mov    [cursor],(160*2)+4
 
; Проверить доступ к портам I/O
       mov    si,szIo
       call   GetString
       mov    ax,[CMDR]
       push   ax
       and    ax,1
       add    al,'0'
       push   es 0xb800
       pop    es
       mov    ah,7
       stosw
       mov    [cursor],(160*3)+4
; Проверить доступ к пространству MMIO
       mov    si,szMio
       call   GetString
       pop    ax
       shr    ax,1
       and    ax,1
       add    al,'0'
       mov    ah,7
       stosw
       pop    es
       mov    [cursor],(160*5)+4
; Ошибка, если нет доступа к порту I/O
       mov    ax,[CMDR]
       and    ax,1
       jnz    @ok
       call   @f
       db     'Port access error!'
@@:    pop    si
       call   GetString
       jmp    @err
 
; Выводим данные из порта I/O (первые 14h байт)
; *********************************************
@ok:   mov    si,szPort
       call   GetString
       mov    [cursor],(160*6)+4
 
       mov    bx,DEVICE_FEATURES
       call   PrintFeature32
       mov    [cursor],(160*7)+4
 
       mov    bx,DRIVER_FEATURES
       call   PrintFeature32
       mov    [cursor],(160*8)+4
 
       mov    bx,QUEUE_ADDRESS
       call   PrintFeature32
       mov    [cursor],(160*9)+4
 
       mov    bx,QUEUE_SIZE
       call   PrintFeature16
       mov    [cursor],(160*10)+4
 
       mov    bx,QUEUE_SELECT
       call   PrintFeature16
       mov    [cursor],(160*11)+4
 
       mov    bx,QUEUE_NOTIFY
       call   PrintFeature16
       mov    [cursor],(160*12)+4
 
       mov    bx,DEVICE_STATUS
       call   PrintFeature08
       mov    [cursor],(160*13)+4
 
       mov    bx,ISR_STATUS
       call   PrintFeature08
       mov    [cursor],(160*15)+4
 
       mov    bx,14h
       call   PrintFeature16
       mov    [cursor],(160*16)+4
 
       mov    bx,16h
       call   PrintFeature16
 
@err:  xor    ax,ax        ; ждём клавишу..
       int    16h          ;
       jmp    $            ; зависнуть на текущем адресе
;//*************************************************************
 
;----  Процедура печати строк ------------
GetString:                 ;
       push   es 0xb800 ;
       pop    es           ; ES = сегмент видеобуфера 0xB800
       mov    di,[cursor]  ; DI = смещение в нём
       mov    cx,txtLen    ; CX = длина строк
       mov    ah,7         ; цвет символа
@prnString:                ;
       lodsb               ; AL = очередной байт из DS:SI
       stosw               ; запись АХ по адресу ES:DI
       loop   @prnString   ; промотать цикл CX-раз..
       pop    es        ; ES на родину
ret                        ;
;----  Процедура выводит ECХ на экран в HEX ------------
PrintHex:
       pusha
       push   es 0xb800    ;
       pop    es           ;
       mov    di,[cursor]  ; ES:DI = сегмент видеобуфера В800:0000
       xchg   edx,ecx      ; EDX = число
       bswap  edx          ; восстановить порядок байт как в PciCfg
       mov    ecx,[size]   ; кол-во символов для вывода
@@:    shld   eax,edx,4    ; получить в AL очередную цифру
       rol    edx,4        ; удалить её из EDX
       and    al,0x0f      ; оставить в AL только эту цифру
       cmp    al,0x0a      ; три команды перевода
       sbb    al,0x69      ;    ..hex цифры из AL
       das                 ;        ..в соответствующий ASCII-код
       mov    ah,7         ; цвет символа
       stosw               ; вывод AХ в видеобуфер
       loop   @b           ; повторить для всех цифр
       mov    [cursor],di  ; запомнить позицию курсора
       pop    es           ;
       popa
ret
;----  Печать регистров порта ------------
PrintFeature32:
       mov    [size],8
       mov    dx,[BAR0]
       add    dx,bx
       in     eax,dx     ;<----32-бит
       bswap  eax
       xchg   eax,ecx
       call   PrintHex
ret
PrintFeature16:
       mov    [size],4
       mov    dx,[BAR0]
       add    dx,bx
       in     ax,dx      ;<----16-бит
       bswap  eax
       shr    eax,16
       xchg   eax,ecx
       call   PrintHex
ret
PrintFeature08:
       mov    [size],2
       mov    dx,[BAR0]
       add    dx,bx
       in     al,dx      ;<----08-бит
       bswap  eax
       shr    eax,24
       xchg   eax,ecx
       call   PrintHex
ret
Вложения
Тип файла: zip vioSimple.zip (2.4 Кб, 6 просмотров)
Тип файла: zip vioSimpleURM.zip (2.4 Кб, 3 просмотров)
Тип файла: zip virtio.inc.zip (4.6 Кб, 6 просмотров)
2
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.11.2023, 12:26
Ответы с готовыми решениями:

Джаббер сервер для Win x64
В поисковиках смотрел, но так и не нашел ни чего подходящего. Нужен джаббер сервер на Windows server 2008 x64. Кто что посоветует?

Сервер Domino 8.5.3 X64 И Файл Подкачки (pagefile)
Ребята, проблема в следующем: Имеется сервер Domino x64 8.5.3 с последними фиксапами. Оперативы 16 Гбайт. В последнее время админы...

Как перенести веб-сервер со всеми конфигами с Windows 10 x64 на Debian (ARM)?
В составе веб-сервера: Apache2 (2.4), PHP 7.3, MySQL 5.7, а также веб-сайт WordPress с плагинами и конфигом под ip windows-ноутбука. ...

209
 Аватар для Teamur
29 / 29 / 5
Регистрация: 06.01.2015
Сообщений: 336
27.11.2023, 14:17  [ТС]
R71MT, vioSimple - черный экран

Сейчас ставится vioUNR

Целый час устанавливается, незнаю может ISO сработает
Зачем тогда они пишут что поддерживают флоппи формат IMG

У них Appache,а консоль Guacamole

Если не получится, то я напишу в поддержку
только какие вопросы как думаете нужно задать, чтобы они поняли ?

И в разделе образы, отображаются qcow2, несмотря на то, что закидываю img
0
 Аватар для Teamur
29 / 29 / 5
Регистрация: 06.01.2015
Сообщений: 336
27.11.2023, 14:20  [ТС]
Раздел образы
Миниатюры
x64 Сервер  
0
 Аватар для Teamur
29 / 29 / 5
Регистрация: 06.01.2015
Сообщений: 336
27.11.2023, 14:23  [ТС]
Также иногда в консоли такое вылезает


При этом в процессе установки я могу туда вводить
Значит можно что-то узнать
Миниатюры
x64 Сервер  
0
 Аватар для Teamur
29 / 29 / 5
Регистрация: 06.01.2015
Сообщений: 336
27.11.2023, 14:37  [ТС]
R71MT, пока образ устанавливается ввел в консоль 'reboot'
и быстро сделал скриншоты
Миниатюры
x64 Сервер   x64 Сервер  
0
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6215 / 2449 / 403
Регистрация: 29.07.2014
Сообщений: 3,181
Записей в блоге: 4
27.11.2023, 14:45
Цитата Сообщение от Teamur Посмотреть сообщение
vioSimple - черный экран
тогда не знаю, что ему нужно.

Цитата Сообщение от Teamur Посмотреть сообщение
И в разделе образы, отображаются qcow2, несмотря на то, что закидываю img
значит конвертирует img в qcow2, поэтому долго загружается.

на скринах грузится с сидюка, потом наверное поиск на харде пойдёт, и после него флоп.
последовательность-же в настройках хоста должно меняться - покопайся в них.
2
 Аватар для Teamur
29 / 29 / 5
Регистрация: 06.01.2015
Сообщений: 336
27.11.2023, 19:45  [ТС]
R71MT, скриншоты консоли которые я здесь выкладывал я делал с браузера

Сейчас попробую установить Putty и по SSH подключусь, посмотрю

если эта та же консоль

Добавлено через 55 минут
R71MT, в общем ничего не удалось.

Сильно расстроен, столько времени потрачено

Линукс победил, снова поставлю Убунту 3.5-гиговую и буду как и раньше держать сайт на NodeJS
или поищу готовые микро дистрибутивы


А с наработанным кодом буду время от времени играться,
нап рисовать в видеобуфере прямоугольники и буквы, линии по Брезенхему

R71MT, спасибо вам огромное, вы Великий Мастер
когда с сайта будет профит, вы будете вознаграждены
1
 Аватар для Teamur
29 / 29 / 5
Регистрация: 06.01.2015
Сообщений: 336
28.11.2023, 18:30  [ТС]
R71MT, здравствуйте !
Цитата Сообщение от R71MT Посмотреть сообщение
mov sp,0x7c00
sub sp,16
здесь вы вычли 16 для того, чтобы разместить таблицу дескрипторов GDT в памяти до кода ядра ?
0
 Аватар для Teamur
29 / 29 / 5
Регистрация: 06.01.2015
Сообщений: 336
30.11.2023, 12:24  [ТС]
R71MT, я нашел ошибку

В коде загрузчика при получении NIC BDF командой
Assembler
1
mov dx, 0x1AF4
у вас затирается DL, который хранит номер загрузочного устройства ( спасибо Jin X ),
Цитата Сообщение от Jin X Посмотреть сообщение
Замечание есть: DL обнулять не надо, только DH, т.к. DL при старте = номеру загрузочного диска. Он может быть не 0 (и даже не 80h)
а поскольку у меня на хосте флоппи не равен 0, код остальных секторов не подгружается и на экране тьма

Ваш первый образ работал тк не было чтения других секторов несмотря на то, что DX был затерт

Сделав так:
Assembler
1
2
3
4
5
6
7
; Загрузка ОС в память
LoadOS:
mov ax,0x0208     ; AH=02; AL=01 (функция чтения секторов; 8 секторов = 512x8=4096 = 4 КБ )
mov bx,0x7E00     ; =7C00h+0200h: (:512); Адрес для ядра
mov cx,0x0002     ; CH=00; CL=02
  mov dh,0x00       ; DH=00; DL: BIOS хранит здесь номер загруз устройства !!! ✔️✔️✔️✔️✔️✔️✔️
int 0x13
Всё стало прекрасно выводится на хосте
3
 Аватар для Teamur
29 / 29 / 5
Регистрация: 06.01.2015
Сообщений: 336
30.11.2023, 12:29  [ТС]
Регистры Порта NIC на хосте
Миниатюры
x64 Сервер  
1
 Аватар для Teamur
29 / 29 / 5
Регистрация: 06.01.2015
Сообщений: 336
09.12.2023, 11:55  [ТС]
R71MT, здравствуйте

Сейчас исходный код такой.
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
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
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
; ============================================ BOOT
bits 16
org 0x7C00
 
BAR0 dw 0     ; NIC PORT
BDF  dw 0     ; NIC Bus,Device,Function
CMDR dw 0     ; ComManD Register из PCI-Cfg
 
curs dw 0     ; текущая позиция курсора
size dd 8     ; тетрад в числе для вывода (byte/word/dword)
 
; --------------------------------------------
 
start: 
xor  ax, ax       ; ax=0
mov  ds, ax       ; ds=0
mov  es, ax       ; es=0
mov  ss, ax       ; ss=0
mov  sp, 0x7BF0   ; +16(GDT) = 0x7C00
 
lgdt [GDT]        ; Подключаем Таблицу Дескрипторов
jmp Unreal
 
align  16
DSC  dq 0, 0x00cf93000000ffff ; Дескр.данных 4 ГБ
GDT  dw $-DSC-1               ; Размер таблицы
     dd DSC                   ; Адрес таблицы
 
; Unreal Mode ---------------------------------
Unreal:
cli
; NMI -
in   al,0x70
or   al,0x80  ; 1000'0000
out  0x70,al
; Protected
mov  eax,cr0
inc  al
mov  cr0,eax
jmp  $+2
; UnReal
mov  bx,8
mov  fs,bx
; Real-Mode
dec  al
mov  cr0,eax
jmp  $+2
; NMI +
in   al,0x70
and  al,0x7F  ; 0111'1111
out  0x70,al
 
xor  ax,ax
mov  fs,ax
sti
; --------------------------------- Unreal Mode/
 
jmp LoadOS
 
; ----  Процедура печати строк ------------
txt:              ;
push es
push 0xB800       ;
pop  es           ; ES = сегмент видеобуфера 0xB800
mov  di,[curs]    ; DI = смещение в нём
mov  cx,[tlen]    ; CX = длина строк
mov  ah,[colo]    ; цвет i: [black,blue,green,cyan, red,mag,yel,gray]
  pr:             ;
  lodsb           ; AL = очередной байт из DS:SI
  stosw           ; запись АХ по адресу ES:DI
  loop  pr        ; промотать цикл CX-раз..
  pop   es        ; ES загр
ret               ;
 
; ----------------  HEX ------------
hex:                    ; 
pusha
push    es
push    0xb800          ;
pop     es              ;
mov     di,[curs]       ; ES:DI = сегмент видеобуфера В800:0000
xchg    edx,ecx         ; EDX = число
bswap   edx             ; восстановить порядок байт как в PciCfg
mov     ecx,[size]      ; кол-во символов для вывода
 loo:
 shld   eax,edx,4       ; получить в AL очередную цифру
 rol    edx,4           ; удалить её из EDX
 and    al,0x0f         ; оставить в AL только эту цифру
 cmp    al,0x0a         ; три команды перевода
 sbb    al,0x69         ;    ..hex цифры из AL
 das                    ;        ..в соответствующий ASCII-код
 mov    ah,7            ; цвет символа
 stosw                  ; вывод AХ в видеобуфер
 loop   loo             ; повторить для всех цифр
 mov    word[curs],di   ; запомнить позицию курсора
 pop    es              ;
 popa
ret
 
; ------------------------------------------
 
; Загрузка ОС в память
LoadOS:
mov ax,0x0208     ; AH=02; AL=01 (функция чтения секторов; 8 секторов = 512x8=4096 = 4 КБ )
mov bx,0x7E00     ; =7C00h+0200h: (:512); Адрес для ядра
mov cx,0x0002     ; CH=00; CL=02
mov dh,0x00       ; DH=00; DL: BIOS хранит здесь номер загруз устройства !!! ✔️✔️✔️
int 0x13
 
; Передача управления
push cs
push 0x7E00
retf              ; CS:IP = 0000:7E00h
 
; -----------------------------------------
times 510-($-$$) db 0
dw 0xAA55
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
;xxxxxxxxxxxxxxxxxxxxxx    Kernel    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
 
jmp MAIN
; ------------------------------------------
; PciBios_:      Functions     AX=B1__h:
;         PRESENT                   01
;         FIND_PCI_DEVICE           02
;         FIND_PCI_CLASS_CODE       03
;         GENERATE_SPECIAL_CYCLE    06
;         READ_CONFIG_BYTE          08
;         READ_CONFIG_WORD          09
;         READ_CONFIG_DWORD         0A
;         WRITE_CONFIG_BYTE         0B
;         WRITE_CONFIG_WORD         0C
;         WRITE_CONFIG_DWORD        0D
;         GET_IRQ_ROUTING_OPTIONS   0E
;         SET_PCI_IRQ               0F
; ------------------------------------------
 
; --------- Печать регистров порта ---------
ooFeat32:
mov    dword[size],8
mov    dx,[BAR0]
add    dx,bx
in     eax,dx     ;<----32-бит
bswap  eax
xchg   eax,ecx
call   hex
ret
ooFeat16:
mov    dword[size],4
mov    dx,[BAR0]
add    dx,bx
in     ax,dx      ;<----16-бит
bswap  eax
shr    eax,16
xchg   eax,ecx
call   hex
ret
ooFeat08:
mov    dword[size],2
mov    dx,[BAR0]
add    dx,bx
in     al,dx      ;<----08-бит
bswap  eax
shr    eax,24
xchg   eax,ecx
call   hex
ret
ooMac08:
mov    dword[size],2
mov    dx,[BAR0]
add    dx,bx
in     al,dx      ;<----08-бит
xchg   eax,ecx
call   hex
ret
ooMac16:
mov    dword[size],4
mov    dx,[BAR0]
add    dx,bx
in     ax,dx      ;<----16-бит
xchg   eax,ecx
call   hex
ret
 
; ----------------------------------------
;          0     1    2     3     4   5   6   7
; цвет i: [black,blue,green,cyan, red,mag,yel,gray]
gray equ 0x07   ; фон: черный, символ: серый
grow equ 0x02   ; зеленый
cyan equ 0x03   ; бирюзов
yell equ 0x06   ; желтый
 
colo db 0x07    ; серый по умолчанию
 
text db 'PORT REGISTERS:'
tlen dw $-text
 
; Байт статуса гостя, чтобы сообщить о прогрессе и синхронизировать функции
VIRTIO_CONFIG_S_DEVICE_RESET equ 0   ; Сброс устр. на хосте (записать в регистр "DEVICE_STATUS")
VIRTIO_CONFIG_S_ACKNOWLEDGE  equ 1   ; Увидели устр. и обработали общие поля VIRTIO_CONFIG_F_VIRTIO
VIRTIO_CONFIG_S_DRIVER       equ 2   ; Нашли драйвер для устройства
VIRTIO_CONFIG_S_DRIVER_OK    equ 4   ; Драйвер использовал свои части конфигурации и доволен
VIRTIO_CONFIG_S_FEATURES_OK  equ 8   ; Драйвер завершил настройку функций
VIRTIO_CONFIG_S_NEEDS_RESET  equ 64  ; Устройство перешло в недопуст сост, драйвер долж сбросить его
VIRTIO_CONFIG_S_FAILED       equ 128 ; Мы отказались от этого устройства
 
; Общие регистры I/O относительно BAR0
DEVICE_FEATURES  equ 00h  ; 4 Б: RO маска со списком функций хоста
DRIVER_FEATURES  equ 04h  ; 4 Б: RW ..пишем выбранное из списка (см VIRTIO_NET_F_xx ниже)
QUEUE_ADDRESS    equ 08h  ; 4 Б: RW адрес циклических очередей(0-N)
QUEUE_SIZE       equ 0Ch  ; 2 Б: RO размер очереди в байтах (назначает хост)
QUEUE_SELECT     equ 0Eh  ; 2 Б: RW регистр выбора очереди
QUEUE_NOTIFY     equ 10h  ; 2 Б: RW регистр уведомлений хосту
DEVICE_STATUS    equ 12h  ; 1 Б: RW текущий статус гостя (см CONFIG_S_xx выше)
ISR_STATUS       equ 13h  ; 1 Б: RO регистр статуса обработчиков прерываний: бит(2) = изменено
NET_MAC          equ 14h  ; 6 Б: RO MAC-адрес сетевухи,
NET_STATUS       equ 1Ah  ; 2 Б: RW ...и её текущий статус
 
s_DEVICE_FEATURES  db 'DEVICE_FEATURES: '
n_DEVICE_FEATURES  dw $-s_DEVICE_FEATURES
  s_DRIVER_FEATURES  db 'DRIVER_FEATURES: '
  n_DRIVER_FEATURES  dw $-s_DRIVER_FEATURES
s_QUEUE_ADDRESS    db '  QUEUE_ADDRESS: '
n_QUEUE_ADDRESS    dw $-s_QUEUE_ADDRESS  
  s_QUEUE_SIZE       db '     QUEUE_SIZE: '
  n_QUEUE_SIZE       dw $-s_QUEUE_SIZE     
s_QUEUE_SELECT     db '   QUEUE_SELECT: '
n_QUEUE_SELECT     dw $-s_QUEUE_SELECT   
  s_QUEUE_NOTIFY     db '   QUEUE_NOTIFY: '
  n_QUEUE_NOTIFY     dw $-s_QUEUE_NOTIFY     
s_DEVICE_STATUS    db '  DEVICE_STATUS: '
n_DEVICE_STATUS    dw $-s_DEVICE_STATUS  
  s_ISR_STATUS       db '     ISR_STATUS: '
  n_ISR_STATUS       dw $-s_ISR_STATUS     
s_NET_MAC          db '        NET_MAC: '
n_NET_MAC          dw $-s_NET_MAC        
  s_NET_STATUS       db '     NET_STATUS: '
  n_NET_STATUS       dw $-s_NET_STATUS     
 
; ========================================================================================
MAIN:
; NIC BDF
mov cx, 0x1000      ; DeviceID, 2 Б
mov dx, 0x1AF4      ; VendorID, 2 Б
xor si, si          ; Source Index = 0
mov ax, 0xB102      ; AX = AH: PciFnI, AL: FIND_PCI_DEVICE
int 0x1A            ; BX = BH: BusNum, BL:[DevNum:5, FnNum:3]
mov word[BDF], bx   ; сохр 2 Б
 
; Взять порт I/O из BAR0
mov ax,0xB10A       ; dword
mov di,0x10
int 1Ah
dec cx              ; сбросить бит(0)
mov word[BAR0],cx
 
; Взять регистр "Command" из PCI-Cfg
mov bx,[BDF]
mov ax,0xB109       ; word
mov di,0x04
int 1Ah
mov word[CMDR],cx
 
; Очистка экрана и видеорежим: txt.80x25 ------------
mov ax,3
int 0x10
; Прячем курсор
mov ax,0x0100
mov cx,0x2000
int 0x10
; ---------------------------------------------------
 
; текст PORT REGISTERS
mov  word[curs], 160+2        ; ставим курсор
mov  si,  text                ; указываем на текст
mov  byte[colo], gray         ; цвет
call txt
mov  word[curs],(160*3)+2     ; пропуск строки
 
; Выводим данные из порта I/O (первые 14h байт)
; *********************************************
 
; DEVICE_FEATURES             ; 32 бит
mov  si, s_DEVICE_FEATURES    ; указываем на текст
mov  byte[colo], cyan         ; цвет
call txt
add  di, 2                    ; пробел
mov  word[curs],di            ; запомнить позицию курсора
 
mov  bx, DEVICE_FEATURES      ; 00h
mov  byte[colo], gray
call ooFeat32
mov  word[curs],(160*4)+2
 
; DRIVER_FEATURES             ; 32 бит
mov  si, s_DRIVER_FEATURES    ; указываем на текст
mov  byte[colo], cyan         ; цвет
call txt
add  di, 2                    ; пробел
mov  word[curs],di            ; запомнить позицию курсора
 
mov  bx, DRIVER_FEATURES      ; 04h
mov  byte[colo], gray
call ooFeat32
mov  word[curs],(160*5)+2
 
; QUEUE_ADDRESS               ; 32 бит
mov  si, s_QUEUE_ADDRESS      ; указываем на текст
mov  byte[colo], cyan         ; цвет
call txt
add  di, 2                    ; пробел
mov  word[curs],di            ; запомнить позицию курсора
 
mov  bx, QUEUE_ADDRESS        ; 08h
mov  byte[colo], gray
call ooFeat32
mov  word[curs],(160*6)+2
 
; QUEUE_SIZE                  ; 16 бит
mov  si, s_QUEUE_SIZE         ; указываем на текст
mov  byte[colo], cyan         ; цвет
call txt
add  di, 2                    ; пробел
mov  word[curs],di            ; запомнить позицию курсора
 
mov  bx, QUEUE_SIZE           ; 0Ch
mov  byte[colo], gray
call ooFeat16
mov  word[curs],(160*7)+2
 
; QUEUE_SELECT                ; 16 бит
mov  si, s_QUEUE_SELECT       ; указываем на текст
mov  byte[colo], cyan         ; цвет
call txt
add  di, 2                    ; пробел
mov  word[curs],di            ; запомнить позицию курсора
 
mov  bx, QUEUE_SELECT         ; 0Eh
mov  byte[colo], gray
call ooFeat16
mov  word[curs],(160*8)+2
      
; QUEUE_NOTIFY                ; 16 бит
mov  si, s_QUEUE_NOTIFY       ; указываем на текст
mov  byte[colo], cyan         ; цвет
call txt
add  di, 2                    ; пробел
mov  word[curs],di            ; запомнить позицию курсора
 
mov  bx, QUEUE_NOTIFY         ; 10h
mov  byte[colo], gray
call ooFeat16
mov  word[curs],(160*9)+2
 
; DEVICE_STATUS               ; 8 бит
mov  si, s_DEVICE_STATUS      ; указываем на текст
mov  byte[colo], cyan         ; цвет
call txt
add  di, 2                    ; пробел
mov  word[curs],di            ; запомнить позицию курсора
 
mov  bx, DEVICE_STATUS        ; 12h
mov  byte[colo], gray
call ooFeat08
mov  word[curs],(160*10)+2
 
; ISR_STATUS                  ; 8 бит
mov  si, s_ISR_STATUS         ; указываем на текст
mov  byte[colo], cyan         ; цвет
call txt
add  di, 2                    ; пробел
mov  word[curs],di            ; запомнить позицию курсора
 
mov  bx, ISR_STATUS           ; 13h
mov  byte[colo], gray
call ooFeat08
mov  word[curs],(160*12)+2
 
; NET_MAC                     ; 48 бит (6 байт)
mov  si, s_NET_MAC            ; указываем на текст
mov  byte[colo], cyan         ; цвет
call txt
add  di, 2                    ; пробел
mov  word[curs],di            ; запомнить позицию курсора
 
mov  bx,14h                   ; 14h
mov  si,6
ooMAC:
call ooMac08                  ; Mac i/6 байт
add  di, 6                    ; пробел
mov  word[curs],di            ; запомнить позицию курсора
inc  bx
dec  si
jnz  ooMAC
mov  word[curs],(160*13)+2
 
; NET_STATUS                  ; 16 бит (2 байта)
mov  si, s_NET_STATUS         ; указываем на текст
mov  byte[colo], cyan         ; цвет
call txt
add  di, 2                    ; пробел
mov  word[curs],di            ; запомнить позицию курсора
 
mov  bx, NET_STATUS           ; 1Ah
mov  byte[colo], gray
call ooFeat16
mov  word[curs],(160*14)+2
В дальнейшем буду выкладывать только фрагменты, связанные с решением конкретных задач
Следующий этап я так понимаю в том, что нужно сообщить хосту, что драйвер существует, сделать Acknowledge?

Стоит ли создавать новую тему?, а то эта переполнена водой
0
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16374 / 7686 / 1080
Регистрация: 11.11.2010
Сообщений: 13,765
10.12.2023, 05:15
Цитата Сообщение от Teamur Посмотреть сообщение
Стоит ли создавать новую тему?, а то эта переполнена водой
Teamur,
  1. я бы для начала попросил у модераторов открепить первое сообщение от остальных страниц,
  2. оценил бы остальные сообщения и попросил модераторов удалить сообщения с указанными номерами, чтобы удалить сообщения "переполненные водой"
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
11.12.2023, 11:26
Цитата Сообщение от Teamur Посмотреть сообщение
Стоит ли создавать новую тему?
Можно создать блог для проекта в целом, и там изложить суть и ссылки на связанные темы Форума, а также информировать о ходе работ.
https://www.cyberforum.ru/blogs/527659/

Новые темы лучше создавать для конкретных частных вопросов.
Напр, "особенности фрагментации сетевых пакетов при обмене через virtio-net"
1
 Аватар для Teamur
29 / 29 / 5
Регистрация: 06.01.2015
Сообщений: 336
13.12.2023, 10:45  [ТС]
R71MT, Здравствуйте! Возможно ли к Новому Году вывести Hello World в браузере ?

Сейчас я дошел до этапа выделения памяти для кольцевых буферов

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
; Сообщаем о наличии драйвера NIC
mov  dx,[BAR0]   ; номер порта в DX = С060h
add  dx,12h      ; сместиться в порту к "регистру статуса" = C072h
mov  al,0        ; Device_reset=0
out  dx,al       ; Reset!
inc  al          ; Acknowledge=1
out  dx,al       
mov  al,3       ; Driver=2 ( ACKNOWLEDGE + DRIVER )
out  dx,al       ; 
 
; ----------------------------------------------- Queue(0) In
mov dx, [BAR0]       ; DX = С060h
add dx, 0Eh          ; PORT+0Eh=C06Eh, QUEUE_SELECT: 2 Б
xor ax, ax           ; AX=0, очистить 2 Б
out dx, ax           ; выбрать Очередь(0) In
 
mov dx, [BAR0]       ; DX = C060h
add dx, 08h          ; PORT+08h= C068h, QUEUE_ADDRESS: 4 Б
mov eax,0x00100000   ; адрес очереди 4 Б
out dx, eax          ; установить адрес очереди In
 
; ----------------------------------------------- Queue(1) Out
mov dx, [BAR0]       ; DX = С060h
add dx, 0Eh          ; PORT+0Eh=C06Eh, QUEUE_SELECT: 2 Б
mov ax, 0x1          ; AX=1
out dx, ax           ; выбрать Очередь(1) Out
 
mov dx, [BAR0]       ; DX = C060h
add dx, 08h          ; PORT+08h= C068h, QUEUE_ADDRESS: 4 Б
mov eax,0x00120000   ; адрес очереди 4 Б
out dx, eax          ; установить адрес очереди Out
; Выделение памяти для кольцевых буферов
0
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6215 / 2449 / 403
Регистрация: 29.07.2014
Сообщений: 3,181
Записей в блоге: 4
13.12.2023, 11:13
Цитата Сообщение от Teamur Посмотреть сообщение
Возможно ли к Новому Году вывести Hello World в браузере ?
так это разве от меня зависит?
если не поспите 2 недели и уделите это время практике, то вполне возможно.

Цитата Сообщение от Teamur Посмотреть сообщение
Сейчас я дошел до этапа выделения памяти для кольцевых буферов
Помимо просто выделения памяти, там ещё нужно описать дескрипторы (где хранятся атрибуты RW), определить механизм оповещений серверу, и многое другое. Чем отличается кольцо "Available" от "Used" знаете? Что такое цепочки, индексы? Там не всё так просто, чтобы сел и за день написал (хотя это зависит от уровня подготовки). Какие функции вы выбрали из предложенных сервером?

Добавлено через 10 минут
Цитата Сообщение от Teamur Посмотреть сообщение
Выделение памяти для кольцевых буферов
неправильно!
адрес, который вы записываете в порт, нужно делить на 4096-байт (сдвинуть вправо на 12-бит).
так они сделали потому, чтобы адресовать 64-битную память, если таковая нужна.

вот вам почитать на досуге про устройство колец: https://blogs.oracle.com/linux... -to-virtio
2
 Аватар для Teamur
29 / 29 / 5
Регистрация: 06.01.2015
Сообщений: 336
13.12.2023, 11:19  [ТС]
Цитата Сообщение от R71MT Посмотреть сообщение
Чем отличается кольцо "Available" от "Used" знаете?
Когда устройство принимает или отправляет трафик, то кольцо находится в Used ( используется ),
а доступная для записи память - это Available.

Если нужно считать данные с устройства, то нужно указать ему на пустой буфер, а затем устройство запишет в него данные из сети.

И вроде при всех этих действиях нужно переключать регистры очередей, уведомляя устройство о намерении передать/ считать данные

Цитата Сообщение от R71MT Посмотреть сообщение
если не поспите 2 недели и уделите это время практике, то вполне возможно
теперь это возможно тк у меня отпуск в декабре

Основная цель - оставить только те действия в коде, без которых невозможно сделать сервер, т.е. упростить до предела

Прям буквально:
1) получить устройство
2) получить BAR0 порт
3) настроить устройство
4) заполнить дескрипторы
5) указать буферы
6) сделать прослушивание буфера RX
7) и просто напросто как только придет первый байт любого трафика вывести в консоль ОК

Минимально возможный список действий

А потом буду усложнять
0
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6215 / 2449 / 403
Регистрация: 29.07.2014
Сообщений: 3,181
Записей в блоге: 4
13.12.2023, 11:27
ну в общих чертах всё правильно, остаётся только реализовать это на практике.
особенно пункты 3,4.
2
 Аватар для Teamur
29 / 29 / 5
Регистрация: 06.01.2015
Сообщений: 336
13.12.2023, 13:13  [ТС]
R71MT, а как расшифровать исходный DEVICE FEATURES ?

На хосте это: 79 BF FF E7
0
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6215 / 2449 / 403
Регистрация: 29.07.2014
Сообщений: 3,181
Записей в блоге: 4
13.12.2023, 13:40
это двоичная маска функций, которые предлагает тебе хост.
назначение каждого бита имеется в инклуде, который я цеплял в скрепку.
из них ты создаёшь свою маску и прописываешь её в "DRIVER_FEATURES"
после записи обязательно нужно обратно считать и проверить, не сбросил-ли хост твои биты.
вот этот список, где для удобства я разделил маску по тетрадам:

Features Bits
Code
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
VIRTIO_NET_F_CSUM           =  0   ; Устройство обрабатывает пакеты с частичной контрольной суммой (типично для сетевых карт).
VIRTIO_NET_F_GUEST_CSUM     =  1   ; Драйвер обрабатывает пакеты с частичной контрольной суммой.
VIRTIO_NET_F_GUEST_OFFLOADS =  2   ; Канал управления разгружает поддержку реконфигурации.
VIRTIO_NET_F_MTU            =  3   ; Поддерживается отчет о макс. MTU устройства.
 
                            =  4   ; <----------(!) резерв
VIRTIO_NET_F_MAC            =  5   ; Устройство предоставило MAC-адрес.
VIRTIO_NET_F_GSO            =  6   ; Устройство обрабатывает пакеты GSO любого типа.
VIRTIO_NET_F_GUEST_TSO4     =  7   ; Драйвер может получить TSOv4.
 
VIRTIO_NET_F_GUEST_TSO6     =  8   ; Драйвер может получить TSOv6.
VIRTIO_NET_F_GUEST_ECN      =  9   ; Драйвер может получать TSO с помощью ECN.
VIRTIO_NET_F_GUEST_UFO      =  10  ; Драйвер может получить UFO.
VIRTIO_NET_F_HOST_TSO4      =  11  ; Устройство может получать TSOv4.
 
VIRTIO_NET_F_HOST_TSO6      =  12  ; Устройство может получать TSOv6.
VIRTIO_NET_F_HOST_ECN       =  13  ; Устройство может получать TSO с ECN.
VIRTIO_NET_F_HOST_UFO       =  14  ; Устройство может принимать UFO.
VIRTIO_NET_F_MRG_RXBUF      =  15  ; Драйвер может объединять буферы приема.
 
VIRTIO_NET_F_STATUS         =  16  ; Доступно поле статуса конфигурации.
VIRTIO_NET_F_CTRL_VQ        =  17  ; Канал управления доступен.
VIRTIO_NET_F_CTRL_RX        =  18  ; Поддержка режима RX канала управления.
VIRTIO_NET_F_CTRL_VLAN      =  19  ; Фильтрация VLAN канала управления.
 
                            =  20  ; <----------(!) резерв
VIRTIO_NET_F_GUEST_ANNOUNCE =  21  ; Драйвер может отправлять ненужные пакеты.
VIRTIO_NET_F_MQ             =  22  ; Устройство поддерживает многоочередность с авто-управлением приема.
VIRTIO_NET_F_CTRL_MAC_ADDR  =  23  ; Установите MAC-адрес через канал управления.
 
VIRTIO_F_NOTIFY_ON_EMPTY    =  24  ; Получаем ли мы обратные вызовы, когда кольцо полностью использовано?
VIRTIO_F_ANY_LAYOUT         =  27  ; Может ли устройство обрабатывать любой макет дескриптора?
VIRTIO_TRANSPORT_F_START    =  28  ; биты[28:31] используются virtio_ring для синхронизации.
VIRTIO_TRANSPORT_F_END      =  31  ; ...сейчас это только: RING_F_INDIRECT_DESC и RING_F_EVENT_IDX.


Добавлено через 12 минут
сейчас хост говорит тебе, что поддерживает следующие функции,
и ты должен прочитать их, и сбросить в этой маске не нужные тебе биты.
тогда ты точно не ошибёшься, и всё будет гуд:
79 BF FF E7 = 0111 1001 1011 1111 1111 1111 1110 0111
2
 Аватар для Teamur
29 / 29 / 5
Регистрация: 06.01.2015
Сообщений: 336
13.12.2023, 14:15  [ТС]
R71MT, здесь хост спрашивает?

VIRTIO_NET_F_MAC = 5 ; Устройство предоставило MAC-адрес

У меня в DEVICE FEATURES на месте 6 го по счёту бита стоит 0

но я уже получил MAC-адрес

значит уже в DRIVER FEATURES мне надо прописать 1, верно?

Добавлено через 14 минут
Если оставить как есть, то NIC будет засирать буферы ненужными данными, а потом их надо будет парсить и отсеивать?
Выковыривать из буфера Ethernet-пакеты среди ненужной информации?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.12.2023, 14:15

Сервер HP Primergy Econel 200 S2, Win2008R2 x64, RAID10 4x2000Gb падает скорость чтения/записи по сети
Здравствуйте. Подскажите, пожалуйста, в чем может быть проблема: Сервер бэкапов HP Primergy Econel 200 S2 Встроенный SATA RAID...

Linux Mint 20 x64, Firefox 79 x64. Отключить замыливание текста
Поставил Linux Mint 20, отключил сглаживание шрифтов, поставил шрифты от Windows XP, все хорошо, все нравится. Только в Firefox остался...

HP Pavilion g7 - 2160er переустановил Windows HP x64 на Ultimate x64 - проблема с подсветкой монитора
HP Pavilion g7 - 2160er переустановил windows home premium x64 на Ultimate x64/ Стала выеживаться подсветка монитора - хочет работает,...

Нестандартная ситуация, установка еще одной w7 x64 на уже установленный комп с w7 x64
Всем доброго времени суток ! Не совсем стандартная ситуация, которая посадила меня на гвоздь в позе &quot;шпагат&quot; ))) Есть машинка...

Ищу обновления KB938397-x64 и KB968730-x64 для Windows Server 2003x64
Господа плиз ХЕЛП! Ищем обновы KB938397x64 и KB968730x64 для Windows Server 2003x64 RUS, а то сволочной сервер 1С не видит интеренет. ...


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

Или воспользуйтесь поиском по форуму:
160
Ответ Создать тему
Новые блоги и статьи
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 24.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
Вот представьте что вам дали бессмертие.
kumehtar 24.07.2026
Вот представьте что вам дали бессмертие, ничего более не меняя. Вообще ничего, только бессмертие в нынешнем виде. Рады были бы? Что бы вы тут делали всё это время? Никакой пенсии. Никакого нового. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru