Как узнать, какой адрес этих регистров уже после инициализации устройств и загрузки ОС?
ioremap()
или какой-нибудь его обёрткой. Если драйверу нужен доступ к регистрам -- драйвер просто вызывает ioremap()
сам и получает адрес. Если доступ нужен в юзерспейсе -- можно (при наличии разрешений) сделать mmap()
файлу /dev/mem
по смещению равному физическому адресу устройства.Или обратная задача: есть процесс, который пишет в некоторую область памяти, как узнать, возможно, это какие-то регистры SOM
cat /proc/<pid>/maps
и посмотреть, что отображено в эту область виртуальных адресов.// Получаю ошибку:
7FFF0000: The instruction at 0x7FFF0000 referenced memory at 0x7FFF0000. The memory could not be executed -> 7FFF0000 (exc.code c0000005, tid 6332)
В чем проблема?
7FFF0000
-- не исполняемая.Как починить?
7FFF0000
исполняемой. После этого вывод в лог должен заработать, но будет падать после него, потому что функция mySuperFunction
не возвращается. Почему ОС не запускается на Virtual box, а на QEMU запускаеться?
-enable-kvm
, то оно тоже не будет работать.ret
в реализацию GDT::load_gdt()
и не вызывать load_tss()
то оно начинает в qemu-kvm работать:diff --git a/src/GDT/GDT_impl.s b/src/GDT/GDT_impl.s
index 4f69835abd9d..5476837f3d0a 100644
--- a/src/GDT/GDT_impl.s
+++ b/src/GDT/GDT_impl.s
@@ -2,6 +2,7 @@
.extern _ZN8SimpleOS3GDT7gdt_ptrE
_ZN8SimpleOS3GDT8load_gdtEv:
lgdt _ZN8SimpleOS3GDT7gdt_ptrE
+ ret
.global _ZN8SimpleOS3GDT8load_tssEv
_ZN8SimpleOS3GDT8load_tssEv:
выводится ошибка - [: missing `]'
Что значит эта ошибка
if [ "$projectDir" == "video" && "$flag" != "noflag" ]; then
следующим образом: ключевое слово if
, команда [
с аргументами "$projectDir" == "video"
, оператор &&
, команда "$flag"
с аргументами != "noflag" ]
, разделитель ;
, оператор then
.[
(она же test
), очевидно, не нашла в своих аргументах закрывающей скобки ]
, которая должна там быть при таком её вызове.как ее можно исправить?
-a
вместо &&
, как говорит man test. std::copy(arr1, arr1 + n, buf);
int off = 0;
...
for (GLfloat i = 0; i <= 3.14; i += 0.01)
for (GLfloat j = 0; j <= 2.0 * 3.14; j += 0.01)
{
...
std::copy(arr1, arr1 + n, buf + off);
off += n;
}
кода я не нашел, или плохо искал
через ряд тейлора не вариант при больших значениях угла ряд медленно сходится
map::copy
, вот в этом месте. Нельзя копировать сложные объекты функцией memcpy()
, потому что при удалении копии её деструктор освободит данные оригинала. Для такого копирования следует либо использовать placement new, либо копировать целиком объект Node, типа того. Для того чтобы это работало потребуется реализовать глобальный оператор new, типа того. С этими изменениями конкретно описанная в топике проблема решается, но я вижу, что и другие методы класса map
реализованы с похожими ошибками, так что не расслабляйся и не думай, что это была единственная проблема в коде.FileSystem::get_root()
копирует всё дерево файловой системы, когда FileSystem::tree()
явно не собирается его менять, можно было бы в этом случае обойтись константной ссылкой. В чем может быть проблема?
struct IDTPtr {
uint16_t limit;
uint32_t base;
};
packed
, иначе компилятор вставляет паддинг для выравнивания поля base
на границу uint32_t
, из-за чего в IDT загружается неверный адрес.iret
из середины с++-функции, потому что компилятор организовал в ней кадр стека и вместо возврата iret
снимает и интерпретирует мусор из этого кадра:001000e6 <SimpleOS::IDT::dividing_by_zero()>:
1000e6: 55 push %ebp
1000e7: 89 e5 mov %esp,%ebp
1000e9: 53 push %ebx
1000ea: 83 ec 04 sub $0x4,%esp
1000ed: e8 15 01 00 00 call 100207 <__x86.get_pc_thunk.ax>
1000f2: 05 06 11 00 00 add $0x1106,%eax
1000f7: 83 ec 0c sub $0xc,%esp
1000fa: 8d 90 08 fe ff ff lea -0x1f8(%eax),%edx
100100: 52 push %edx
100101: 89 c3 mov %eax,%ebx
100103: e8 4c 00 00 00 call 100154 <SimpleOS::Terminal::print(char const*)>
100108: 83 c4 10 add $0x10,%esp
10010b: fa cli
10010c: cf iret
10010d: 90 nop
10010e: 8b 5d fc mov -0x4(%ebp),%ebx
100111: c9 leave
100112: c3 ret
mem*()
или большинство функций str*()
), есть часть, зависимость которой от ОС реализована в терминах других функций libc (например printf()
может выделять память и может записывать в файл, но обе эти функции уже реализованы в других местах libc), а есть часть напрямую взаимодействующая с ОС.$ gcc -m32 boot.s -nodefaultlibs -nostartfiles -Wl,-Tlinker.ld -no-pie -o boot.elf
$ readelf -S boot.elf
There are 8 section headers, starting at offset 0x3140:
Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[ 0] NULL 00000000 000000 000000 00 0 0 0
[ 1] .note.gnu.bu[...] NOTE 00100000 001000 000024 00 A 0 0 4
[ 2] .multiboot PROGBITS 00101000 003000 00000c 00 0 0 4096
[ 3] .text PROGBITS 00102000 002000 000009 00 AX 0 0 4096
[ 4] .bss NOBITS 00103000 003000 004000 00 WA 0 0 4096
[ 5] .symtab SYMTAB 00000000 00300c 0000a0 10 6 9 4
[ 6] .strtab STRTAB 00000000 0030ac 00004d 00 0 0 1
[ 7] .shstrtab STRTAB 00000000 0030f9 000044 00 0 0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
L (link order), O (extra OS processing required), G (group), T (TLS),
C (compressed), x (unknown), o (OS specific), E (exclude),
D (mbind), p (processor specific)
.multiboot
оказалась по смещению 0x3000. Сигналы доходят до меги, но она не включает ни один из светиков.
Если записать вывод данных в файл
# /opt/speedtest/speedtest | tee spdt.log
то в файле не видно промежуточных значений значений.
strace -f -e ioctl,write -o log <program command line>
Что это значит
���`�B��Χh� �l<*�� !�����
-- это вывод скетча на 9600. Откуда LoadProhibited -- непонятно.можно ли это как-то исправить?
idf.py monitor
обычно декодирует стек трейс и выводит соответствующие строчки исходников, можно начать отсюда. Для выхода из вложенных циклов при try/catch в случае исключения произойдёт свертка стека
будет ли тоже самое для goto?
movw $0x4F02, %ax
movb $0x03, %bl
int $0x10
bh
остался мусор, а этот вызов принимает аргумент в bx
. как это сделать вместе?
U2RXD
с разъёма P1
можно для этого использовать, если речь об этом модуле.