Форум программистов, компьютерный форум, киберфорум
ОС на Assembler
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/49: Рейтинг темы: голосов - 49, средняя оценка - 4.67
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6215 / 2449 / 403
Регистрация: 29.07.2014
Сообщений: 3,181
Записей в блоге: 4
03.11.2023, 08:15
Студворк — интернет-сервис помощи студентам
И ещё замечание..
Не нужно злоупотреблять вызовом прерывания int-10h.
Досовский отладчик "AVPUtil" от лаборатории Касперского может дизасмить все известные прерывания DOS/BIOS. Так вот если посмотреть в нём на код int-10h, он реализуется в (!)450-строк. И это не считая 20-ти внутренних обращений к другим участкам кода посредством вызовов call. В общем случае получается более 1000-строк кода, и если использовать их для вывода одного символа, то получаем явный оверхед.
2
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.11.2023, 08:15
Ответы с готовыми решениями:

Джаббер сервер для 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
03.11.2023, 11:26  [ТС]
"Подготовил" проект к работе с virtioNIC

ЗАГРУЗЧИК
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
; ========================================== BOOT
bits 16
org 7C00h
jmp $+2
 
start:
cli
xor ax, ax    ; ax=0
mov ds, ax    
mov es, ax    ; es=0
mov ss, ax    
mov sp, 7C00h
sti
 
; -------------- Чтение следующих секторов
mov ax, 0208h      ; AH=02; AL=01 (функция чтения секторов; 8 секторов = 512x8=4096 = 4 КБ )
mov cl, 2          ; CH=initial 00; CL=02 (; 2й сектор)
mov dh, 0
mov bx, 7E00h      ; =7C00h+0200h: (:512); Адрес для ядра
int 13h            ; читаем и кладем туда
 
jmp 07E0h:0        ; es:bx (seg:offset) переход к ядру; CS=07E0h, IP=0
 
; -----------------------------------------
times 510-($-$$) db 0
dw 0xAA55
ЯДРО
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
; ========================================== CORE
jmp MAIN
; com[__]: ii - перебор, oo - просмотр
; ------------------------------------------ re
re: ; 
    ; переход на новую строку
  mov ah, 14 ; 0Eh
  mov cx, 2
  reii: mov al, 0Ah ; LF
        int 10h
        loop reii
  mov al, 0Dh ; CR
  int 10h
  xor al, al
  ret
 
; ------------------------------------------ hex
hex:  ; ebx
      ; Вывод содержимого ebx в 16-рич виде
        mov ah, 14  ; режим вывода текста
        mov cx, 8   ; количество итераций
 hexii: rol ebx, 4  ; YYYY -> BL[XXXX_....]
        mov al, 15  ;   0000_1111
        and al, bl  ; & XXXX_YYYY -> 0000_YYYY
        add al, 48  ; 0..9
        cmp al, 58  
         jl hexoo   ; AL+48 < 58
        add al, 7   ; A..F
 hexoo: int 10h
        loop hexii
  call re
  ret
 
; ------------------------------------------ MAIN
MAIN:
mov ebx, 0xE4C2A13F ; test hex
call hex
 
; virtioNIC
mov cx, 1000h   ; DeviceID
mov dx, 1AF4h   ; VendorID
 
mov ax, 0xB102  ; функция поиска устройства
int 1Ah         ; поиск
 
mov dh, ah      ; копирую код возврата
 
mov  ah, 0Eh    ; режим вывода текста
mov  al, 'Y'    ; Yes
 
cmp  dh, 0      ; =0 -> ok
je   found      ; найдено
mov  al, 'N'    ; No
 
found:
int 10h
ЗАПУСК
Windows Batch file
1
2
3
4
5
6
7
8
9
dd if=/dev/zero of=boot.img bs=1024 count=1440
 
nasm -f bin -o boot-.bin boot-.asm
dd if=boot-.bin of=boot.img conv=notrunc
 
nasm -f bin -o core-.bin core-.asm
dd if=core-.bin of=boot.img bs=512 seek=1 conv=notrunc
 
qemu-system-x86_64 -m 1M -net nic,model=virtio -net user,hostfwd=tcp::5555-:80 -drive format=raw,file=boot.img,index=0,if=floppy
Какие есть замечания?
Теперь что нужно делать?
1
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6215 / 2449 / 403
Регистрация: 29.07.2014
Сообщений: 3,181
Записей в блоге: 4
03.11.2023, 11:49
Цитата Сообщение от Teamur Посмотреть сообщение
Теперь что нужно делать?
0. Установить CS:IP для jmp не 07E0:0000h, а 0000:7E00h,
1. Перейти в нереальный режим,
2. Составить алгоритм работы ОС,
3. Скачать спеку на VIRTIO и перечитать её 210-раз,
4. next..
3
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
03.11.2023, 12:16
4... Подумать, в каком режиме удобнее реализовать п.2, используя знания, полученные в п.3
5. Подумать о тестировании и отладке. Для начала в лабораторных условиях.
2
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6215 / 2449 / 403
Регистрация: 29.07.2014
Сообщений: 3,181
Записей в блоге: 4
04.11.2023, 08:01
Teamur, что там прописано в конфиг.пространстве PCI девайса?
выложи сюда дамп - посмотрим..
Базовый блок имеет размер 256-байт, а прочитать его можно так:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
;....
buff  rd  64
;....
;-------------------
     mov   ax,0xB102      ; найти устройство по VID/DID
     mov   dx,0x1AF4      ; VID 
     mov   cx,0x1000      ; DID
     xor   si,si          ; номер для многофункциональных устройств PCI
     int   1Ah            ; биос..
 
     mov   ax,0xB10A       ; считать DWORD из PciCfg (BX = bus:dev:func)
     xor   di,di           ; стартовый адрес данных в PciCfg = 0
     mov   bp,64           ; счётчик чтения: 64х4=256 байт
     mov   si,buff         ; адрес приёмного буфера
@readPciCfg:               ; цикл!
     push  ax bx di        ; <----(прерывание портит эти регистры) 
     int   1Ah             ; прочитать очередной DWORD 
     mov   [si],ecx        ; сбросить его в буфер
     pop   di bx ax        ; <----(восстановить регистры)
     add   si,4            ; сл.позиция в буфере
     add   di,4            ; сл.DWORD в PciCfg
     dec   bp              ; счётчик -1
     jnz   @readPciCfg     ; повторить BP-раз..
В гугле можно найти такой скрин, но это девайс "Console" с VID/DID=1AF4_1003h (см.первые два WORD).
Миниатюры
x64 Сервер  
2
 Аватар для Teamur
29 / 29 / 5
Регистрация: 06.01.2015
Сообщений: 336
04.11.2023, 10:27  [ТС]
R71MT, здравствуйте, смогу выложить только завтра, после обеда, тк буду в отъезде!

Добавлено через 1 минуту
R71MT,

Сейчас у меня написан такой код в 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
; virtioNIC
mov cx, 1000h   ; DeviceID
mov dx, 1AF4h   ; VendorID
mov ax, 0xB102  ; функция поиска устройства
int 1Ah         ; поиск
 
                ; -> BX[ BH=BusNum:8; BL=DevNum:5,FunNum:3 ]
 
call hex        ; EBX-> BX[BH:00h, BL:18h] -> BH=8[0], BL=00011000
 
;               32       31  24       16       11       8        2   0
; PCI_CONF_ADDR [EnaBit:1|_:7|BusNum:8|DevNum:5|FunNum:3|RegNum:6|_:2]
;               [E.......|BBBBBBBB|DDDDDFFF|RRRRRR..]
;               [                 |<--BH-->|<--BL-->]
;               [<-------16------>|<-------BX------>]
 
mov eax, 1_0000000_00000000_00011_000_000000_00b ; HardCoded PCI_CONF_ADDR
 
mov ebx, eax
call hex
 
cli
mov dx, 0x0CF8  ; PCI_INDX
out dx, eax     ; в порт
 
mov dx, 0x0CFC  ; PCI_DATA
 in eax, dx     ; из порта
sti
 
mov ebx, eax    ; 0xFFFFFFFF -> не найдено
call hex
0
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6215 / 2449 / 403
Регистрация: 29.07.2014
Сообщений: 3,181
Записей в блоге: 4
04.11.2023, 12:50
Цитата Сообщение от Teamur Посмотреть сообщение
mov ebx, eax    ; 0xFFFFFFFF -> не найдено
call hex в строке(20) наверное портит адрес в EAX.
Нужно добавить в строку(18) push eax, а в строку(21) pop eax.
1
 Аватар для Teamur
29 / 29 / 5
Регистрация: 06.01.2015
Сообщений: 336
05.11.2023, 15:18  [ТС]
R71MT, сделал так

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mov eax, 1_0000000_00000000_00011_000_000000_00b ; HardCoded PCI_CONF_ADDR
 
mov ebx, eax
call hex        ; -> 80001800
mov eax, ebx    ; восстанавливаю eax
 
cli
mov dx, 0x0CF8  ; PCI_INDX
out dx, eax     ; в порт
 
mov dx, 0x0CFC  ; PCI_DATA
 in eax, dx     ; из порта
sti
 
mov ebx, eax
call hex        ; -> 10001AF4
mov eax, ebx    ; восстанавливаю eax
Это хороший знак?
0
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6215 / 2449 / 403
Регистрация: 29.07.2014
Сообщений: 3,181
Записей в блоге: 4
05.11.2023, 15:34
Цитата Сообщение от Teamur Посмотреть сообщение
Это хороший знак?
ну да.. есть-же на выходе VID/DID.
теперь нужно считать всё PciCfg или как я привёл пример чз int-1Ah --> AX=B10Ah,
или через порты с прибавлением номера регистра в PCI_CONF_ADDR.
1
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
06.11.2023, 07:49
Цитата Сообщение от Teamur Посмотреть сообщение
Тогда какой смысл изобретать 32, 64 битные процессоры, можно оставаться на 16 битах?
Эмулировать 64-разрядный режим на 64-разрядной системе проще, и аппаратно, и программно.

QEMU вообще умеет напрямую запускать linux или multiboot kernel без всяких биосов.
U-Boot умеет bootить с virtio-blk
https://u-boot.readthedocs.io/... irtio.html

В современных qemu есть -machine microvm, в которой нет ни PCI, ни ISA, а только явно добавленные при запуске устройства virtio. Как раз для таких приложений, которым не нужны никакие монструозные ОС.

Добавлено через 1 час 22 минуты
qemu-system-x86_64 -machine microvm -device virtio-net-device -device virtio-serial-device -S

info mtree
Code
1
2
3
4
5
6
7
8
9
10
11
...  
    00000000feb02400-00000000feb025ff (prio 0, i/o): virtio-mmio
    00000000feb02600-00000000feb027ff (prio 0, i/o): virtio-mmio
    00000000feb02800-00000000feb029ff (prio 0, i/o): virtio-mmio
    00000000feb02a00-00000000feb02bff (prio 0, i/o): virtio-mmio
    00000000feb02c00-00000000feb02dff (prio 0, i/o): virtio-mmio
    00000000feb02e00-00000000feb02fff (prio 0, i/o): virtio-mmio
    00000000fec00000-00000000fec00fff (prio 0, i/o): ioapic
    00000000fec10000-00000000fec10fff (prio 0, i/o): ioapic
    00000000fee00000-00000000feefffff (prio 4096, i/o): apic-msi
    00000000fffe0000-00000000ffffffff (prio 0, ram): pc.bios
x /64xx 0xfeb02c00
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
00000000feb02e00: 0x74726976 0x00000001 0x00000001 0x554d4551
00000000feb02e10: 0x39bf8064 0x00000000 0x00000000 0x00000000
00000000feb02e20: 0x00000000 0x00000000 0x00000000 0x00000000
00000000feb02e30: 0x00000000 0x00000400 0x00000000 0x00000000
00000000feb02e40: 0x00000000 0x00000000 0x00000000 0x00000000
00000000feb02e50: 0x00000000 0x00000000 0x00000000 0x00000000
00000000feb02e60: 0x00000000 0x00000000 0x00000000 0x00000000
00000000feb02e70: 0x00000000 0x00000000 0x00000000 0x00000000
00000000feb02e80: 0x00000000 0x00000000 0x00000000 0x00000000
00000000feb02e90: 0x00000000 0x00000000 0x00000000 0x00000000
00000000feb02ea0: 0x00000000 0x00000000 0x00000000 0x00000000
00000000feb02eb0: 0xffffffff 0xffffffff 0x00000000 0x00000000
00000000feb02ec0: 0x00000000 0x00000000 0x00000000 0x00000000
00000000feb02ed0: 0x00000000 0x00000000 0x00000000 0x00000000
00000000feb02ee0: 0x00000000 0x00000000 0x00000000 0x00000000
00000000feb02ef0: 0x00000000 0x00000000 0x00000000 0x00000000
x /64xx 0xfeb02e00
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
00000000feb02c00: 0x74726976 0x00000001 0x00000003 0x554d4551
00000000feb02c10: 0x39000006 0x00000000 0x00000000 0x00000000
00000000feb02c20: 0x00000000 0x00000000 0x00000000 0x00000000
00000000feb02c30: 0x00000000 0x00000400 0x00000000 0x00000000
00000000feb02c40: 0x00000000 0x00000000 0x00000000 0x00000000
00000000feb02c50: 0x00000000 0x00000000 0x00000000 0x00000000
00000000feb02c60: 0x00000000 0x00000000 0x00000000 0x00000000
00000000feb02c70: 0x00000000 0x00000000 0x00000000 0x00000000
00000000feb02c80: 0x00000000 0x00000000 0x00000000 0x00000000
00000000feb02c90: 0x00000000 0x00000000 0x00000000 0x00000000
00000000feb02ca0: 0x00000000 0x00000000 0x00000000 0x00000000
00000000feb02cb0: 0xffffffff 0xffffffff 0x00000000 0x00000000
00000000feb02cc0: 0x00000000 0x00000000 0x00000000 0x00000000
00000000feb02cd0: 0x00000000 0x00000000 0x00000000 0x00000000
00000000feb02ce0: 0x00000000 0x00000000 0x00000000 0x00000000
00000000feb02cf0: 0x00000000 0x00000000 0x00000000 0x00000000
1
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
06.11.2023, 19:37
(qemu)info virtio
/machine/peripheral-anon/device[1] [virtio-serial]
/machine/peripheral-anon/device[0] [virtio-net]
(qemu)info virtio-status /machine/peripheral-anon/device[0]
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
35
36
37
38
39
/machine/peripheral-anon/device[0]:
  device_name:             virtio-net
  device_id:               1
  vhost_started:           false
  bus_name:                (NULL)
  broken:                  false
  disabled:                false
  disable_legacy_check:    false
  started:                 false
  use_started:             true
  start_on_kick:           false
  use_guest_notifier_mask: true
  vm_running:              false
  num_vqs:                 3
  queue_sel:               0
  isr:                     0
  endianness:              little
  status:
 
  Guest features:
 
  Host features:
        VIRTIO_RING_F_EVENT_IDX: Used & avail. event fields enabled,
        VIRTIO_RING_F_INDIRECT_DESC: Indirect descriptors supported,
        VIRTIO_F_RING_RESET: Driver can reset a queue individually,
        VIRTIO_F_ANY_LAYOUT: Device accepts arbitrary desc. layouts,
        VIRTIO_F_NOTIFY_ON_EMPTY: Notify when device runs out of avail. descs. on VQ
        VIRTIO_NET_F_GSO: Handling GSO-type packets supported,
        VIRTIO_NET_F_CTRL_MAC_ADDR: MAC address set through control channel,
        VIRTIO_NET_F_GUEST_ANNOUNCE: Driver sending gratuitous packets supported,
        VIRTIO_NET_F_CTRL_RX_EXTRA: Extra RX mode control supported,
        VIRTIO_NET_F_CTRL_VLAN: Control channel VLAN filtering supported,
        VIRTIO_NET_F_CTRL_RX: Control channel RX mode supported,
        VIRTIO_NET_F_CTRL_VQ: Control channel available,
        VIRTIO_NET_F_STATUS: Configuration status field available,
        VIRTIO_NET_F_MRG_RXBUF: Driver can merge receive buffers,
        VIRTIO_NET_F_MAC: Device has given MAC address,
        VIRTIO_NET_F_CTRL_GUEST_OFFLOADS: Control channel offloading reconfig. supported
  Backend features:
(qemu)info virtio-status /machine/peripheral-anon/device[1]
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
/machine/peripheral-anon/device[1]:
  device_name:             virtio-serial
  device_id:               3
  vhost_started:           false
  bus_name:                (NULL)
  broken:                  false
  disabled:                false
  disable_legacy_check:    false
  started:                 false
  use_started:             true
  start_on_kick:           false
  use_guest_notifier_mask: true
  vm_running:              false
  num_vqs:                 64
  queue_sel:               0
  isr:                     0
  endianness:              little
  status:
 
  Guest features:
 
  Host features:
        VIRTIO_RING_F_EVENT_IDX: Used & avail. event fields enabled,
        VIRTIO_RING_F_INDIRECT_DESC: Indirect descriptors supported,
        VIRTIO_F_RING_RESET: Driver can reset a queue individually,
        VIRTIO_F_ANY_LAYOUT: Device accepts arbitrary desc. layouts,
        VIRTIO_F_NOTIFY_ON_EMPTY: Notify when device runs out of avail. descs. on VQ
        VIRTIO_CONSOLE_F_EMERG_WRITE: Emergency write supported,
        VIRTIO_CONSOLE_F_MULTIPORT: Multiple ports for device supported
  Backend features:
1
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6215 / 2449 / 403
Регистрация: 29.07.2014
Сообщений: 3,181
Записей в блоге: 4
07.11.2023, 00:53
politoto, всё правильно.. это настройки устройства на хосте.
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Особенности гостя:
   Возможности хоста:
         VIRTIO_RING_F_EVENT_IDX    : поля событий включены,
         VIRTIO_RING_F_INDIRECT_DESC: поддерживаются косвенные дескрипторы,
         VIRTIO_F_RING_RESET        : драйвер может сбросить очередь индивидуально,
         VIRTIO_F_ANY_LAYOUT        : устройство принимает произвольные макеты дескрипторов,
         VIRTIO_F_NOTIFY_ON_EMPTY   : уведомлять, когда на устройстве заканчиваются доступные файлы в буфере
         VIRTIO_NET_F_GSO           : поддерживается обработка пакетов типа GSO,
         VIRTIO_NET_F_CTRL_MAC_ADDR : MAC-адрес, установленный через канал управления,
         VIRTIO_NET_F_GUEST_ANNOUNCE: поддерживается драйвер, отправляющий бесплатные пакеты,
         VIRTIO_NET_F_CTRL_RX_EXTRA : поддерживается доп.управление режимом приема,
         VIRTIO_NET_F_CTRL_VLAN     : поддерживается фильтрация VLAN канала управления,
         VIRTIO_NET_F_CTRL_RX       : поддерживается режим приема канала управления,
         VIRTIO_NET_F_CTRL_VQ       : доступен канал управления,
         VIRTIO_NET_F_STATUS        : доступно поле статуса конфигурации,
         VIRTIO_NET_F_MRG_RXBUF     : драйвер может объединять буферы приема,
         VIRTIO_NET_F_MAC           : Устройство предоставило MAC-адрес,
   Бэкэнд-функции:
Если открыть спеку на VirtIO, там фигурируют две сущности - устройство на стороне хоста, и драйвер на стороне гостя. На данный момент в блоке статуса видно, что устройство простаивает started: false, и драйвер (здесь код ос) должен сначала сообщить хосту, какие именно из перечисленных свойств он планирует использовать в своём функционале, после чего выставить флаг готовности хосту "DRIVER_OK". Только после этого хост изменит статус на started: true и можно будет приступать к общению с девайсом.

Чтобы проделать эти операции, драйвер должен получить адреса соответствующих структур в памяти, доступ к которым открывают регистры BAR в PciCfg. Поиск начинается с того, что читается байт по смещению(34h) в PciCfg под названием "Capability Pointer". В нём лежит смещение первой структуры "VIRTIO_PCI_CAP", а поле cap_next в этой структуре, хранит смещение следующей (последняя имеет маркер нуль).
Assembler
1
2
3
4
5
6
7
8
9
10
11
struct VIRTIO_PCI_CAP
   cap_vndr    db  0    ; PCI_CAP_ID_VNDR         (общее для всех поле)
   cap_next    db  0    ; Адрес сл.структуры      (общее для всех поле)
   cap_len     db  0    ; Длина данной структуры  (общее для всех поле)
   cfg_type    db  0    ; Тип структуры (см.ниже) (общее для всех поле)
   bar         db  0    ; В каком из BAR[0:5] указан базовый адрес в памяти
   id          db  0    ; (если имеются несколько возможностей САР одного типа, иначе 0)
   padding     dw  0    ; ----> (слово выравнивания)
   offset      dd  0    ; Смещение структуры внутри BAR
   length      dd  0    ; Длина структуры в байтах
ends
Всего таких структур может быть 7-штук, хотя на практике используются не все, по настроению хоста.
Тип текущей структуры указывается в её поле cfg_type, константы которых перечислены ниже:
Code
1
2
3
4
5
6
7
8
9
; Константы поля "cfg_type"
;----------------------------
VIRTIO_PCI_CAP_COMMON_CFG         =  1   ;// Общий конфиг - (!)Основная структура Virtio 
VIRTIO_PCI_CAP_NOTIFY_CFG         =  2   ;// Notifications (оповещения)
VIRTIO_PCI_CAP_ISR_CFG            =  3   ;// ISR Status  
VIRTIO_PCI_CAP_DEVICE_CFG         =  4   ;// Device specific configuration  
VIRTIO_PCI_CAP_PCI_CFG            =  5   ;// PCI configuration access  
VIRTIO_PCI_CAP_SHARED_MEMORY_CFG  =  8   ;// Shared memory region 
VIRTIO_PCI_CAP_VENDOR_CFG         =  9   ;// Vendor-specific data
В поле bar структуры лежит номер одного из шести регистров базовых адресов BAR[0:5] в PciCfg, где можно будет найти уже сами структуры. Поля offset+length хранит смещение структуры от базы + её размер. Драйвер конфигурирует устройство через структуру "VIRTIO_PCI_CAP_COMMON_CFG", а информирует хост структурой "NOTIFY". Для этого могут использоваться как прерывания int, так и сообщения MSI (определяет хост).

Чтобы ситуация прояснилась, можно взять дамп PciCfg функции VirtIO, и разобрать его вручную.
Поскольку ТС так и не предоставил свой, я приведу пример на каком-то левом, выловленном из сети:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Sample PCI Config Space For Virtio Net Device
The following is the hexadecimal dump of the configuration space of a virtio net device:
00:04.0 Ethernet controller: Red Hat, Inc Device 1041 (rev 01)
 
     00 01 02 03 04 05 06 07  08 09 0A 0B 0C 0D 0E 0F
     ------------------------------------------------
00:  f4 1a 41 10 07 05 10 00  01 00 00 02 00 00 00 00
10:  00 00 00 00 00 20 bd fe  00 00 00 00 00 00 00 00
20:  0c 00 00 fe 00 00 00 00  00 00 00 00 f4 1a 00 11
30:  00 00 b8 fe 98 00 00 00  00 00 00 00 0b 01 00 00
40:  09 00 10 01 04 00 00 00  00 00 00 00 00 10 00 00
50:  09 40 10 03 04 00 00 00  00 10 00 00 00 10 00 00
60:  09 50 10 04 04 00 00 00  00 20 00 00 00 10 00 00
70:  09 60 14 02 04 00 00 00  00 30 00 00 00 00 40 00
80:  00 10 00 00 09 70 14 05  00 00 00 00 00 00 00 00
90:  00 00 00 00 00 00 00 00  11 84 02 80 01 00 00 00
a0:  01 08 00 00 00 00 00 00  00 00 00 00 00 00 00 00
..........
f0:  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00
1. Значит берём байт "Capability Pointer" по смещению(34h) = 98. Это линк на первую структуру "VIRTIO_PCI_CAP".

2. Видим там: cap_vndr=11 (MSI-X), cap_next=84, cap_len=2, cfg_type=80, bar=1, offset=0801, length=0.

3. 32-битные регистры BAR[0:5] начинаются со-смещения(10h) и заканчиваются(24h). Здесь указан BAR1, а в дампе видим адрес 0xFEBD2000. Именно там можно будет найти всю подноготную сообщений MSI-X (Message Signaled Interrupt). Это отдельная тема, и нужно парсить PciCfg за пределами первых 256-байт (см.спеку на PCI).

4. Поле cap_next=84 говорит нам, что сл.структура "VIRTIO_PCI_CAP" лежит по смещению(84h) - здесь всё аналогично:
cap_vndr=09 (Vendor Specific), cap_next=70, cap_len=14, cfg_type=05, bar=0, offset=0, length=0.
По типу структуры(5) можно сделать вывод, что это "VIRTIO_PCI_CAP_PCI_CFG". В BAR0 лежит зеро, значит все конфиги задаются локально.

5. Сл.структура расположена по смещению(70h) и имеет тип(2) "VIRTIO_PCI_CAP_NOTIFY_CFG" - здесь уже интересней:
cap_vndr=09, cap_next=60, cap_len=14, cfg_type=02, bar=4, offset=3000h, length=400000h (4МБ).
В дампе BAR4=0хFE000000 и если прибавить к нему оффсет, получим адрес структуры сообщений 0хFE003000.

6. Таким-же макаром парсим и остальные структуры, пока не нарвёмся на структуру с полем "cap_next=00".
В данном случае она лежит по смещению(40h): cfg_type=01, bar=4, offset=0, length=1000h
Offset=0 означает, что начало данной структуры совпадает со значением в BAR4, и размером она 4КБ.

Структура типа(1) - это основная структура конфигурации "VIRTIO_PCI_COMMON_CFG", при помощи которой драйвер причёсывает девайс под себя. Адрес её в памяти будет равен значению в BAR4, т.е. 0хFE000000. Большинство полей - это битовая маска. После всех настроек и манипуляций с битами, нужно будет передать хосту статус через одноимённое поле device_status. По названию поле можно легко догадаться о характере, например все "Queue" описывают очередь в буфере, "Feature" это свойства, "Notify" оповещения, и т.д.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
struct VIRTIO_PCI_COMMON_CFG
   device_feature_select    dd  0   ; RW
   device_feature           dd  0   ; Read-only for driver
   driver_feature_select    dd  0   ; RW
   driver_feature           dd  0   ; RW
   msix_config              dw  0   ; RW
   num_queues               dw  0   ; Read-only for driver
   device_status            db  0   ; RW
   config_generation        db  0   ; Read-only for driver
   ; Свойства очереди сообщений "virtqueue"
   queue_select             dw  0   ; RW
   queue_size               dw  0   ; RW
   queue_msix_vector        dw  0   ; RW
   queue_enable             dw  0   ; RW
   queue_notify_off         dw  0   ; Read-only for driver
   queue_desc               dq  0   ; RW
   queue_driver             dq  0   ; RW
   queue_device             dq  0   ; RW
ends
Всё это до последнего тушканчика оговаривается в спеке на VirtIO - нужно только прочитать её, причём не по диагонали. Если проблемы с ингишом, то всегда придёт на помощь гугл: https://translate.google.com/?... =translate

Вот как выглядит лог уже настроенного, и готового к употреблению устройства.
Здесь видно, что статус сменился на started: true, а так-же используемые драйвером фишки, из списка предложенных хостом.
В блоке "Status" перечислены нотификации в том порядке, в котором посылает их хосту драйвер:
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
(qemu) info virtio-status /machine/peripheral/blk1/virtio-backend
/machine/peripheral/blk1/virtio-backend:
 
device_name            : virtio-blk
device_id              : 2
vhost_started          : false
bus_name               : (null)
broken                 : false
disabled               : false
disable_legacy_check   : false
started                : true
use_started            : true
start_on_kick          : false
use_guest_notifier_mask: true
vm_running             : true
num_vqs                : 4
queue_sel              : 0
isr                    : 0
endianness             : little
 
status:
   VIRTIO_CONFIG_S_ACKNOWLEDGE: Valid virtio device found,
   VIRTIO_CONFIG_S_DRIVER     : Guest OS compatible with device,
   VIRTIO_CONFIG_S_FEATURES_OK: Feature negotiation complete,
   VIRTIO_CONFIG_S_DRIVER_OK  : Driver setup and ready
 
Guest features:
   VIRTIO_BLK_F_FLUSH       : Flush command supported,
   VIRTIO_BLK_F_WRITE_ZEROES: Write zeroes command supported,
   VIRTIO_BLK_F_DISCARD     : Discard command supported,
   VIRTIO_BLK_F_TOPOLOGY    : Topology information available,
   VIRTIO_BLK_F_BLK_SIZE    : Block size of disk available,
   VIRTIO_BLK_F_GEOMETRY    : Legacy geometry available,
   VIRTIO_BLK_F_SEG_MAX     : Max segments in a request is seg_max
 
Host features:
   VIRTIO_RING_F_EVENT_IDX    : Used & avail. event fields enabled,
   VIRTIO_RING_F_INDIRECT_DESC: Indirect descriptors supported,
   VIRTIO_F_RING_RESET        : Driver can reset a queue individually,
   VIRTIO_F_VERSION_1         : Device compliant for v1 spec (legacy),
   VIRTIO_F_ANY_LAYOUT        : Device accepts arbitrary desc. layouts,
   VIRTIO_F_NOTIFY_ON_EMPTY   : Notify when device runs out of avail. descs. on VQ
   VHOST_USER_F_PROTOCOL_FEATURES: Vhost-user protocol features negotiation supported,
   VIRTIO_BLK_F_CONFIG_WCE    : Cache writeback and writethrough modes supported,
   VIRTIO_BLK_F_FLUSH         : Flush command supported,
   VIRTIO_BLK_F_WRITE_ZEROES  : Write zeroes command supported,
   VIRTIO_BLK_F_DISCARD       : Discard command supported,
   VIRTIO_BLK_F_MQ            : Multiqueue supported,
   VIRTIO_BLK_F_TOPOLOGY      : Topology information available,
   VIRTIO_BLK_F_BLK_SIZE      : Block size of disk available,
   VIRTIO_BLK_F_GEOMETRY      : Legacy geometry available,
   VIRTIO_BLK_F_SEG_MAX       : Max segments in a request is seg_max
 
Backend features:
(qemu)
3
 Аватар для Teamur
29 / 29 / 5
Регистрация: 06.01.2015
Сообщений: 336
07.11.2023, 12:43  [ТС]
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
; virtioNIC
mov cx, 1000h   ; DeviceID
mov dx, 1AF4h   ; VendorID
mov ax, 0xB102  ; функция поиска устройства
int 1Ah         ; поиск
 
                ; -> BX[ BH=BusNum:8; BL=DevNum:5,FunNum:3 ]
call hex        ; BusNum=00000000; DevNum=00011; FunNum=000
 
;               32       31  24       16       11       8        2   0
; PCI_CONF_ADDR [EnaBit:1|_:7|BusNum:8|DevNum:5|FunNum:3|RegNum:6|_:2]
;                 |<-------BX------->|=0x0018
mov eax, 1_0000000_00000000_00011_000_000000_00b ; HardCoded PCI_CONF_ADDR
 
mov ebx, eax
call hex        ; -> 80001800
mov eax, ebx    ; восстанавливаю eax
 
cli
mov dx, 0x0CF8  ; PCI_INDX
out dx, eax     ; в порт
 
mov dx, 0x0CFC  ; PCI_DATA
 in eax, dx     ; из порта -> 10001AF4
sti
 
; ----------------------------------------------
 
PciCfgBuff: resd 64   ; (resd 4) x 64 = 256
 
mov ax, 0xB10A        ; считать DWORD из PciCfg (BX = bus:dev:func)
xor di, di            ; стартовый адрес данных в PciCfg = 0
mov bp, 64            ; счётчик чтения: 64х4=256 байт
mov si, PciCfgBuff    ; адрес приёмного буфера
 
readPciCfg: 
push ax
push bx
push di               ; <- прерывание портит ax,bx,di
int  1Ah              ; следующий DWORD 
mov  [si], ecx        ; кладём в буфер
pop  di                
pop  bx
pop  ax               ; <- восстанавливаем ax,bx,di
add  si,4             ; сл.позиция в буфере
add  di,4             ; сл.DWORD в PciCfg
dec  bp               ; bp--
jnz  readPciCfg
 
 
mov ah, 14  ; режим вывода текста
mov al, 'J'
int 10h
Буква J не появляется ( символизирует завершение цикла )
А если всё правильно я увижу дамп в консоли табличкой или его надо перебрать и превратить в hex?
0
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6215 / 2449 / 403
Регистрация: 29.07.2014
Сообщений: 3,181
Записей в блоге: 4
07.11.2023, 13:25
Цитата Сообщение от Teamur Посмотреть сообщение
Буква J не появляется
убери буфер из строки(29) и поставь его после int-10h.
это без вывода данных на консоль, и нужно переводить байтики в хек.
2
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6215 / 2449 / 403
Регистрация: 29.07.2014
Сообщений: 3,181
Записей в блоге: 4
07.11.2023, 15:14
Teamur, вот тебе готовый загрузчик, который сдампит на консоль конфиг.пространство VirtioNet. Печать осуществляется прямым выводом в видеобуфер, а не через int-10h.
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
org  0x7c00
jmp  $+2
;-------------------
        cli
        xor    ax,ax
        mov    ds,ax
        mov    es,ax
        mov    ss,ax
        mov    sp,0x7c00
        sti
 
; Ставим видео-моду: txt.80x25
        mov    ax,3
        int    10h
 
; Получить BDF VirtioNet
        mov    cx,1000h     ;
        mov    dx,1AF4h     ;
        xor    si,si        ;
        mov    ax,0xB102    ;
        int    1Ah          ;
 
; Читать двордами из PciCfg (BX = bus:dev:func)
        mov    ax,0xB10A    ;
        xor    di,di        ;
        mov    bp,64        ;
@dumpPciCfg:                ;
        push   ax bx di cx dx
        int    1Ah          ;
        call   PrintHex     ; зовём процедуру печати!
        pop    dx cx di bx ax
        add    si,4         ; сл.позиция в буфере
        add    di,4         ; сл.DWORD в PciCfg
        dec    bp           ;
        jnz    @dumpPciCfg  ;
 
        xor    ax,ax        ; ждём клавишу..
        int    16h          ;
        jmp    $            ; зависнуть на текущем адресе
 
;----  Процедура выводит ECХ на экран в HEX ------------
cursor  dw     0            ; текущая позиция курсора
count   db     4            ; двордов в одной строке дампа
 
PrintHex:                   ;
        push   es 0xb800    ;
        pop    es           ;
        mov    di,[cursor]  ; ES:DI = сегмент видеобуфера В800:0000
        xchg   edx,ecx      ; EDX = число
        bswap  edx          ; восстановить порядок байт как в PciCfg
        mov    ecx,8        ; кол-во символов для вывода
 
@@:     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    ax,0x0720    ; пробел между двордами
        stosw               ;
        dec    [count]      ; вывели 4-дворда??? (одна строка дампа)
        jnz    @f           ; нет..
        add    di,88        ; иначе: курсор на новую строку
        mov    [count],4    ; восстановить счётчик двордов в строке
@@:     mov    [cursor],di  ; запомнить позицию курсора
        pop    es           ;
ret
 
;---------------------
times   510-($-$$) db 0
dw      0xAA55
Я тестил на своей виртуалке, поэтому VID/DID = 8086:1237h
У тебя должен показать правильные идентификаторы 1AF4:1000h.
Вложения
Тип файла: zip VirtioCfgBoot.zip (277 байт, 5 просмотров)
1
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
07.11.2023, 15:42
Цитата Сообщение от Teamur Посмотреть сообщение
увижу дамп в консоли табличкой или его надо перебрать и превратить в hex?
На этапе разработки и отладки можно сохранять дампы в файл из монитора qemu командами pmemsave или memsave, напр.:
pmemsave 03777765 8 biosdate.txt
а потом просматривать где угодно в нужном виде, превращать или анализировать своими вспомогательными программками.

По своей сути монитор и есть пульт управления виртуальной машиной.
2
 Аватар для Teamur
29 / 29 / 5
Регистрация: 06.01.2015
Сообщений: 336
09.11.2023, 11:17  [ТС]
R71MT, politoto, этим кодом:

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
; ========================================== CORE
jmp MAIN
; com[__]: ii - перебор, oo - просмотр
; ------------------------------------------ re
re: ; 
    ; переход на новую строку
  mov ah, 14 ; 0Eh
  mov al, 0Ah ; LF
  int 10h
  mov al, 0Dh ; CR
  int 10h
  xor al, al
  ret
 
; ------------------------------------------ hex
hex:  ; ebx
      ; Вывод содержимого ebx в 16-рич виде
        mov ah, 14  ; режим вывода текста
        mov cx, 8   ; количество итераций
 hexii: rol ebx, 4  ; YYYY -> BL[XXXX_....]
        mov al, 15  ;   0000_1111
        and al, bl  ; & XXXX_YYYY -> 0000_YYYY
        add al, 48  ; 0..9
        cmp al, 58  
         jl hexoo   ; AL+48 < 58
        add al, 7   ; A..F
 hexoo: int 10h
        loop hexii
  mov al, 0x20 ; SPACE
  int 10h
  ret
 
; ------------------------------------------ MAIN
MAIN:
; initial EBX-> 0000 7E00
 
; virtioNIC
mov cx, 1000h   ; DeviceID
mov dx, 1AF4h   ; VendorID
mov ax, 0xB102  ; функция поиска устройства
int 1Ah         ; -> BX[ BH=BusNum:8; BL=DevNum:5,FunNum:3 ]
 
;               32       31  24       16       11       8        2   0
; PCI_CONF_ADDR [EnaBit:1|_:7|BusNum:8|DevNum:5|FunNum:3|RegNum:6|_:2]
;                 |<-------BX------->|=0x0018
mov eax, 1_0000000_00000000_00011_000_000000_00b ; HardCoded PCI_CONF_ADDR
;             BDF=|Bus-----|Dev--|Fn-| : BusNum=00000000, DevNum=00011, FunNum=000
 
cli
mov dx, 0x0CF8  ; PCI_INDX
out dx, eax     ; в порт
mov dx, 0x0CFC  ; PCI_DATA
 in eax, dx     ; из порта -> 10001AF4
sti
 
call  re        ; пустая строка
 
; ----------------------------------------------
 
mov DX, 0x0808  ; 8 строк по 8 dword
xor di, di      ; regNum 0
 
Read_PCI_Conf_Dword_Row:
mov ax, 0xB10A  ; fn Read_PCI_Conf_Dword
mov bx, 0x0018  ; BDF
int 1Ah         ; ECX = Dword
 
mov ebx, ecx
call hex        
add di, 4       
dec DL          ; след dword
jnz Read_PCI_Conf_Dword_Row
call re
mov DL, 8       
dec DH          ; след строка
jnz Read_PCI_Conf_Dword_Row
 
; ----------------------------------------------
получил это
Миниатюры
x64 Сервер  
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
09.11.2023, 13:30
Teamur, а вставить этот текст в текст сообщения не картинкой, а текстом Вы не могли бы?
Или сохранить дамп в файл без преобразования в шестнадцатеричные цифры, а потом этот файл опубликовать?
1
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6215 / 2449 / 403
Регистрация: 29.07.2014
Сообщений: 3,181
Записей в блоге: 4
09.11.2023, 15:02
Teamur, ну оранжевые твои штаны..
В дампе "PCI Config Space" каждый байт имеет свою позицию, а весь дамп описывает строго определённая компанией PCI-SIGN структура. Ты-же выложил его как кучу навоза. Теперь нужно или звонить в их офис, чтобы переделали спецификацию под твой дамп, или-же тебе выстроить его в человеческом виде. Для кого я привёл образец выше? Даже готовый бинарь загрузчика прицепил в скрепку. Пипец.. Ладно ты пишешь код по своему, ну хотя-бы прислушивайся, что тебе говорят, а тем более наглядно показывают скрином.

Во-первых, после того-как считал дворд, нужно инструкцией bswap поменять позицию байт в дворде местами, т.е. ты читаешь 0х11223344, и теперь нужно отразить их зеркально в 0х44332211. Только тогда их порядок будет соответствовать спеке PCI. Первые 4-байта Vid/Did в дампе должны иметь вид: F41A0010. Во-вторых, в одной строке должно быть 16-байт (один параграф памяти), а не 32 как у тебя.
2
 Аватар для Teamur
29 / 29 / 5
Регистрация: 06.01.2015
Сообщений: 336
09.11.2023, 17:02  [ТС]
politoto, я не смог даже выделить текст, начинаю выделять в шапке qemu окна пишется
'Press Ctrl+Alt+G to release grab' - нажимаю, ничего не происходит, я без понятия как копировать то, что показывает qemu. Пришлось сделать скрин.
Надо было мне вручную напечатать

Добавлено через 4 минуты
Цитата Сообщение от R71MT Посмотреть сообщение
Teamur, ну оранжевые твои штаны..
я виноват, простите ребята

Добавлено через 26 минут
Цитата Сообщение от politoto Посмотреть сообщение
На этапе разработки и отладки можно сохранять дампы в файл из монитора qemu командами pmemsave
Я нашел монитор : View -> compatmonitor0 ( Ctrl+Alt+2 ),
собираюсь прописать

pmemsave 0x??? 256 dump.txt

только вот какое смещение взять?

Добавлено через 34 минуты
В общем так вроде нормально
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mov DX, 0x1004  ; 16 строк по 4 dword
xor di, di      ; regNum 0
 
Read_PCI_Conf_Dword_Row:
mov ax, 0xB10A  ; fn Read_PCI_Conf_Dword
mov bx, 0x0018  ; BDF
int 1Ah         ; ECX = Dword
bswap ecx       ; зеркалим по PCI спец
mov ebx, ecx
call hex
add di, 4       
dec DL          ; след dword
jnz Read_PCI_Conf_Dword_Row
call re
mov DL, 4       
dec DH          ; след строка
jnz Read_PCI_Conf_Dword_Row
F41A0010 03011000 00000002 00000000
01C00000 0010BDFE 00000000 00000000
0C0000FE 00000000 00000000 F41A0100
0000B8FE 98000000 00000000 0B010000
09001001 04000000 00000000 00100000
09401003 04000000 00100000 00100000
09501004 04000000 00200000 00100000
09601402 04000000 00300000 00100000
04000000 09701405 00000000 00000000
00000000 00000000 11840300 01000000
01080000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.11.2023, 17:02

Сервер 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С не видит интеренет. ...


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

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