Почему ОС не запускается на 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:
кода я не нашел, или плохо искал
через ряд тейлора не вариант при больших значениях угла ряд медленно сходится
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
$ 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. Сигналы доходят до меги, но она не включает ни один из светиков.
Для выхода из вложенных циклов при try/catch в случае исключения произойдёт свертка стека
будет ли тоже самое для goto?
… 75% cpu 2:23,52 total
… 113% cpu 1:22,71 total
… 73% cpu 2:20,75 total
количество потоков в программе равно количеству потоков процессора (в моём случае - 8…
Как быть?
понял что проект VS обязательно должен быть оконным, в противном случае тупо не будет ресурсов
выяснил что проблема в sizeof(buf) который почему то равен 8 после передачи в функцию
как я могу это сделать?
include <файл в конце стрелки>
в h файл в начале стрелки. Стрелки использования добавляют include <файл в конце стрелки>
в cc файл в начале стрелки. ONESTOPBIT ломало передачу блока
DWORD ComIface::write(byte* data, int count)
DWORD ComIface::read_block(byte* buffer, int size)
hpet rt; while (get_stats().cbInQue < size) { if (!SetCommMask(port_handle, EV_RXCHAR)) { printf("SetCommMask failed with error %d.\n", GetLastError()); return NumberOfBytesRead; } WaitCommEvent(port_handle, &status, &overlap); WaitForSingleObject(overlap.hEvent, read_delay); if (rt.get_ms_dt_weak().count() > read_delay * size) { return NumberOfBytesRead; } }
Какие проблемы приводят к такому и как это чинить?
что я сделал не так, подскажите пожалуйста
if (b[i] >= x || b[i] <= y) { a[j] = b[i]; j++; } ... if (b[i] < x || b[i] > y) { a[j] = b[i]; j++; }
if
не являются взаимоисключающими, а значит j
может стать больше чем n
и запись в a[j]
вылезет за границу массива.if (!(b[i] >= x || b[i] <= y))
и это гарантирует, что индекс не выйдет за пределы массива, вне зависимости от правильности первого условия. initialization of 'hInstanse' is skipped by 'case' label, почему?
switch (uMsg) { ... case WM_CREATE: //получаем дескриптор приложения HINSTANCE hInstance = GetModuleHandle(0); ... break; case WM_MOUSEMOVE: //устанавливаем тот или иной курсор в зависимости от местонахождения мыши ...
WM_MOUSEMOVE
код попадёт в область где hInstance определён, но минует его инициализацию. Компилятор туповат, чтобы понять, что hInstance дальше не используется. Простейший фикс -- обернуть код обработчиков в блоки:switch (uMsg)
{
...
case WM_CREATE:
{
//получаем дескриптор приложения
HINSTANCE hInstance = GetModuleHandle(0);
...
}
break;
case WM_MOUSEMOVE:
{
//устанавливаем тот или иной курсор в зависимости от местонахождения мыши
...
}
...
считать количество русских букв, однако он не правильно это делает, что не так?
setlocale(LC_ALL, "");
const char *str = input.c_str();
while (*str) {
wchar_t c;
int n = mbtowc(&c, str, MB_CUR_MAX);
if (n < 0)
break;
if (wcschr(L"абвгд...юя", c))
++count;
str += n;
}
ctypes.restype(outdata)
, где outdata
-- тип rez1
, см), либо переделать функцию так, чтобы она не требовала скрытого параметра (например, добавив явный указатель на результат в список параметров, см). D:\ N E W\ 1637\ 1\Talking LED Alarm Clock Using TM1637 LED Module\Code/Code.ino:91: undefined reference to `sp3_THE' D:\ N E W\ 1637\ 1\Talking LED Alarm Clock Using TM1637 LED Module\Code/Code.ino:91: undefined reference to `sp3_THE' D:\ N E W\ 1637\ 1\Talking LED Alarm Clock Using TM1637 LED Module\Code/Code.ino:92: undefined reference to `sp3_TIME'
В чему может быть проблема ?
Как можно улучшить код?
d = n < 0 ? -n : n
выглядит куда лучше семистрочного if/else.if(n<0) {
cout<<"-";
}
Уже не знаю что делать
$ g++ -std=c++11 -g -fsanitize=undefined -fsanitize=address main.cc tools.cc -o test
$ ./test
==3245365==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x606000000060 at pc 0x55b559719b47 bp 0x7ffcc39300a0 sp 0x7ffcc3930098
READ of size 8 at 0x606000000060 thread T0
#0 0x55b559719b46 in Processor::encode(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >) toster/1320980/main.cc:41
std::bitset<16> KR = K_array[i];
, цикл по i идёт до 9, а в массиве K_array 8 элементов.