что значит код
ubfx r0, r0, #1, #1
-- извлечь битовое поле шириной 1 бит (правая единица) начиная с бита №1 (левая единица) из регистра r0 (правый r0) и поместить результат в r0 (левый r0).bx lr
-- перейти по адресу в регистре lr, обычно это возврат из подпрограммы.какая между ними разница
ubfx r0, r0, #1, #1
ubfx r0, r0, #2, #1
что я делаю не так
Вот, что я попытался сделать:
push word 0 pop es mov bx, 0x11*2+0xF000 mov word [es:bx], int10-$$
Я пытался гуглить, всю ночь потратил, …
проблема в отсутствии информации
В микропроцессорах Intel 8086/80186 таблица векторов прерываний расположена в первом килобайте памяти начиная с адреса 0000:0000 и содержит 256 векторов прерываний в формате сегмент:смещение.
boot:
push word 0
pop es
mov bx, 0x11*4
mov word [es:bx + 2], cs
mov word [es:bx], int10
откуда прерывания знают адрес, куда им вернуть результат.
Прерывание в коде int 21h и прочие Это какое?
int
-- программное. В отличие от прерывания, инициируемого уровнем или фронтом сигнала подключённого к контроллеру прерываний.выполнение прерывания std::cin>>line; Может и сутки длиться.
std::cin >>line
в конце концов превращается в системный вызов read
.Вот как по пунктам для этой команды. (С условием что есть еще 1 поток жаждущий ЦП).
cat /proc/<PID>/stack
и увидеть следующую картину:[<0>] wait_woken+0x67/0x80
[<0>] n_tty_read+0x426/0x5a0
[<0>] tty_read+0x135/0x240
[<0>] new_sync_read+0x115/0x1a0
[<0>] vfs_read+0xf4/0x180
[<0>] ksys_read+0x5f/0xe0
[<0>] do_syscall_64+0x33/0x80
[<0>] entry_SYSCALL_64_after_hwframe+0x44/0xa9
Как происходит доступ к эл. массива на уровне ядра?
Например массив Int* arr = new int[1024*1024*1024] он как храниться?
А физическая, для массива то же? Ведь, так будет доступ намного быстрее?
получается эмулятор каждый адрес вычислять что ли?
На виндовс, icore 5 процессоре вот сейчас, какой тип памяти работает. И какой тип виртуальной памяти на Risc 5 архитектурах.
Вот запускается программа. Что происходит. Типа создается процесс, в MMU в таблице страниц генерируется номер страницы PID>>24 + 0x4000000h адрес примерно. И заноситься в таблицу (https://ru.bmstu.wiki/MMU_(Memory_Management_Unit) ) Создаются типа страницы для данных. Окей
PID>>24 + 0x4000000h
, это вообще что?как программа вообще может в такой системе вызвать функцию из внешней библиотеки
Что за таблица дескрипторов. Где она находиться.
Как связана с таблицей страниц?
Что в конечном итоге храниться TLB буфере????
gcc
вызванный с флагом -fomit-frame-pointer
генерирует код без этой последовательности и использует rbp как ещё один регистр общего назначения.Почему тогда все регистры не помещаются в стек?
почему вычитается 32?
pushq %rbp
movq %rsp, %rbp
subq $32, %rsp
movsd %xmm0, -24(%rbp)
movsd %xmm1, -32(%rbp)
movsd -32(%rbp), %xmm0
subsd -24(%rbp), %xmm0
movsd %xmm0, -8(%rbp)
movsd .LC0(%rip), %xmm0
divsd -8(%rbp), %xmm0
movsd %xmm0, -16(%rbp)
relocation R_X86_64_32S against `.text' can not be used when making a shared object
что делать?
objdump -dr lib.o
27: 0f 01 1c 25 00 00 00 lidt 0x0
2e: 00
2b: R_X86_64_32S .text
lea rax, [rel idtDescriptor]
lidt [rax]
dq _idt
выдает непонятную фигню
res resb 1
…
mov [res], eax
more than one input file specified
nasm -felf64 bin BootLoader.asm -o BootLoader.bin
-felf64
и замени его на -fbin
.message
у тебя лежит перед кодом, в той же секции, хороший bin из этого не получится. Что нужно написать, чтобы загрузчик ос передавал управление коду в втором секторе?
почему-то не работает прерывание 0х20 для клавиатуры
я на винде только лог qemu могу просматривать
Я гуглил, но понятного объяснения не нашел.
Я пишу новую операционную систему и столкнулся с непредвиденным поведением ядра
проблема в файле kernel\kernel.asm
0x00008122: bb 00 81 movw $0x8100, %bx
0x00008125: 50 pushw %ax
0x00008126: b8 00 00 movw $0, %ax
0x00008129: 8e c0 movw %ax, %es
0x0000812b: 58 popw %ax
0x0000812c: cd 13 int $0x13
0x0000812e: 00 00 addb %al, (%bx, %si)
0x00008130: 00 00 addb %al, (%bx, %si)
0x00008132: 00 00 addb %al, (%bx, %si)
0x00008134: 00 00 addb %al, (%bx, %si)
0x00008136: 00 00 addb %al, (%bx, %si)
0x00008138: 00 00 addb %al, (%bx, %si)
0x0000813a: 00 00 addb %al, (%bx, %si)
0x0000813c: 00 00 addb %al, (%bx, %si)
0x0000813e: 00 00 addb %al, (%bx, %si)
0x00008140: 00 00 addb %al, (%bx, %si)
0x00008142: 00 00 addb %al, (%bx, %si)
0x00008144: 00 00 addb %al, (%bx, %si)
qemu-system-i386 -hda collector.bin -d in_asm,exec,cpu -D log
Как из файла ассемблера (NASM) запустить exe-шник?
Не отдельно, а как-будто ассемблерский файл это и есть ос?