Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.87
Petrolion
24 / 24 / 7
Регистрация: 02.02.2016
Сообщений: 124
#1

Битовые утечки при записи данных на диск - C++

06.06.2016, 14:42. Просмотров 3477. Ответов 119
Метки нет (Все метки)

Доброго дня форумчане!
Сорри если оффтоп но... Пишу в консольке на C++ (MSVCE 2010) различные движки по расчетам и тут столкнулся с опасной проблемой.
При записи на диск искажаются данные на один бит, где то один раз на 109 - 1011 данных. Бит просто "теряется" (был 1 стал 0 или наоборот) , соответственно данные уже не верны, что приводит к нулю все проделанную работу.
Из исследованного:
Бит теряется при записи как в поток текстового значения переменных (типа fileout << a[i] << endl;)
Так и при записи в двоичном виде (типа fileout.write(reinterpret_cast<char*>(a),size*sizeof(a[0]));)
Замечено, что данные в памяти верные, т.к. были пойманы моменты при повторном выводе из того же массива все данные были записаны корректно.
Ошибка не зависит от винчестера на который данные были записаны (были записи на 3 различных винта, один из которых рейд массив).
Чаще всего теряется один из старших битов (типа 24-й бит в unsigned long или 24-й в unsigned long long). Других потерянных бит не замечено.
Термин "потерянный" возможно применяю в данном случае не верно. Т.к. заметно искажение только при его инвертировании. Соответственно если был сбой и он вместо 1 записал сбойную 1 - этого я не найду.
Система молчит про контроль целостности данных. Винт тоже. У винтов и рейда все показатели в порядке (блоки не сыпятся, SMART в порядке).

Сталкивался ли кто с подобным? В чем может быть проблема?

В ближайшем будущем хочу переустановить систему и MSVCE 2013. Но не уверен, что система виновата.
Кто что подскажет?
1
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.06.2016, 14:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Битовые утечки при записи данных на диск (C++):

Избежать утечки памяти при преобразовании строки в массив символов - C++ Builder
Всем привет! Как избежать утечки памяти в таком коде: char* ConvertString(String input) { char *output = new char; ...

Утечки памяти при использовании new/delete для двумерных массивов - C++
Добрый день. Суть в том, что есть несколько функций, получающих на вход и возвращающих двумерные массивы. Реализация передачи массивов...

Битовые операции с разными типа данных - C++
Здравствуйте. В голове возник такой странный вопрос, а мб и не странный. Возможны ли битовые операции с разными типа данных, например int...

Битовые операции, битовые поля. - C++
Здравствуйте! Еслть 4 диапазона чисел: 0-100, 0-100, 0-6000, 0-3. Сделать в виде битовых операций. Записать в unsigned int. Использовать...

Ошибка при записи данных в файл - C++
Для записи перменной типа string выделяю динамически массив из 64 элементов char,после записи данных освобождаю память,но почему-то при...

Ошибка при записи в файл данных из обьекта класса - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;fstream&gt; using namespace std; class Vector { public: double x; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Evg
Эксперт CАвтор FAQ
17802 / 6008 / 387
Регистрация: 30.03.2009
Сообщений: 16,513
Записей в блоге: 26
11.06.2016, 14:16 #31
Цитата Сообщение от Petrolion Посмотреть сообщение
Обнаружил что если при запуске ошибка возникла в памяти, то она есть уже при всех считываниях (разумеется). Но при этом заполнение этого же массива нулями не показывает наличие сбоя в памяти при заполнении. Так же ведет себя заполнение единицами. Но при втором круге - заполнение восходящими значениями, опять возникает ошибка там же либо в другой ячейке. И так все время
Для порядку надо ещё и на бинарный код посмотреть. Я в intel'овской системе команд не разбираюсь, но, возможно, кто-то сдюжит на ассемблере целенаправленный тест написать. Тут важным моментом является то, что первый цикл с точки зрения построения кода и его исполнения принципиально отличается от второго и третьего. В первом цикле на каждой итерации изменяется значение в регистре, из которого затем данные попадают в память. Во втором и третьем цикле значения в этом регистре вычисляются вне цикла и внутри цикла уже не модифицируются. И если на какой-то итерации в первом цикле регистр оказался с неправильным значением, то с этого момента все записи в память пойдёт с неправильным значением

Цитата Сообщение от Petrolion Посмотреть сообщение
Мой результат теста показал, что если ошибка появилась, то она уже есть все время в пределах текущего запуска и массива
Тут уже писали, что если данный фрагмент кода постоянно исполняется на одном и том же ядре, то такое поведение вполне логично

В реальности процессор исполняет намного больше, чем написано в этом примере. Тут работа идёт с большим объёмом данных (1 гигабайт). А потому в процессе исполнения циклов постоянно работает механизм вытеснения данных из кэша. При этом кэши первого уровня, насколько я понимаю, находятся на каждом ядре, а кэши второго и третьего уровня общие. При протравливании кэша первого уровня ещё работает механизм когерентности кэшей, чтобы инвалидация кэша распространилась на все ядра. Сам процесс записи непосредственно в память тоже достаточно сложный, т.к. между кэшем и непосредственно планкой памяти куча всяких механизмов.

Весь цикл записи занимает много довольно тактов, а потому в процессе исполнения успевает возникать аппаратное прерывание от таймера. В момент перывания неисполненные операции работы с памятью сбрасываются в так называемый подвал (cellar) и их переисполнением занимается операционная система. Правда этот вариант отбрасывается, т.к. в этом случае дефектным было бы значение только по одному адресу в памяти, а не в большом блоке. После прерывания операционная система по каким-то причинам могла неправильно восстановить значение регистра, что так же привело бы к неправильному значению в большом блоке памяти

Добавлено через 2 минуты
Цитата Сообщение от Evg Посмотреть сообщение
Тут работа идёт с большим объёмом данных (1 гигабайт)
Пардон, тут 4 гигабайта. Если физической памяти меньше, то будут ещё и откачки-подкачки виртуальных страниц, что тоже делается через операционную систему

Добавлено через 6 минут
Цитата Сообщение от Evg Посмотреть сообщение
Правда этот вариант отбрасывается, т.к. в этом случае дефектным было бы значение только по одному адресу в памяти, а не в большом блоке
Увидел логи, по ходу я словесное описание не правильно понял. Сбой всё-таки единичный (портится значение только в одном адресе памяти). Т.е. варианты с проблемами, вызыванными прерыванием операционной сиситемы, скорее всего отбрасываются. Но странным выглядит то, что сбой происходит примерно по одним и тем же виртуальным адресам. Т.е. тут дело скорее в подсистеме памяти (начиная от кэша и далее), чем в вычислительных узлах процессора

Так что для порядку имеет смысл провести эксперимент с привязкой исполнения к конкретному ядру

Добавлено через 1 минуту
Обнуление и объединичивание блока памяти попробуй выкинуть из теста. По идее это лишний мусор, который только мешает. Так же полезно было бы выкинуть обработку нажатия клавиши и всю печать переделать на printf/fprintf. Это сильно упростит код функции main (на тот случай, если кто-то захочет проанализировать бинарный код). И оставить только одну печать (либо в лог, либо на экран)

Добавлено через 2 минуты
И проверку делать не по 8 раз, а по одному. Т.е. минимизировать пример, вопсроизводящий проблему

Добавлено через 3 минуты
И ещё одно наблюдение (правда ни на какие мысли не навело). По адресу 19EA69918 дефект всегда заключается в том, что в 24-м бите имеется единица, но должен быть 0, а по адресу 1A27BC928 ситуация всегда обратная
3
Petrolion
24 / 24 / 7
Регистрация: 02.02.2016
Сообщений: 124
11.06.2016, 16:25  [ТС] #32
Evg, спасибо за детальность. Поправки по ходу. Объем физической памяти 16 гиг. Своп вообще отключен. Процесс идет на одном ядре. Правда не зафиксировал его на определенном, но пока не возникает переполняющих потоков, он с него вроде не слазит. Объем массива для обработки 8 гиг. (unsigned long long). Кэши первого и второго уровней раздельны. Третий уровень общий.
Бит меняет значение с непонятно чего. Возможно при вычислении в момент присвоения (потому и еще два блока обнуления и заполнения). Действительно сейчас хочу уменьшить кол-во проверок до 2-х. Добавил по подсказке nonedark2008 получение номера ядра. Пока не отловил ошибку. Думаю добавить освобождение и повторное выделение памяти под массив. Чтобы спровоцировать ошибки без перезапусков.
Так же добавил 4-й блок:
C++
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
        c = (unsigned long long)k;
        for (int i = 0; i < n; i++,c++)     //Asc2 tab
            b[i]=c;
        cout << "Table asc2 ready. Read:" << hex;
        flog << "Table asc2 ready. Read:" << hex;
        for (int m = 0; m < 8; m++)
        {
            cout << m;
            flog << m;
            c = k;
            for (int i = 0; i < n; i++,c++)
                if (b[i] != c)
                {
                    cout << endl << "Error at adr(" << (b+i) <<"). Value: " << b[i] << " must be: " << c << " Proc: " << GetCurrentProcessorNumber() << endl;
                    flog << endl << "Error at adr(" << (b+i) <<"). Value: " << b[i] << " must be: " << c << " Proc: " << GetCurrentProcessorNumber() << endl;
                }
            if (_kbhit())
            {
                o = _getch();
                if (o == 27)
                {
                    cout << " Exit ? ";
                    o = _getche();
                    cout << endl;
                    if (o == 'y' || o == 'Y')
                        te = false;
                }
            }
        }
        cout << endl;
        flog << endl;
В нем уже нет вычислений при присвоении. Надеюсь будет результат. Но пока ловлю ошибку.
Много лет назад занимался ассемблером на 80286 и 80386, но теперь вряд ли потяну разобрать полученный бинарник даже с облегчениями типа fprinf или malloc. :-(
Возможно обнаружение ошибки может заключаться не в обнулении или установке 24 бита, а в том что в процессе ошибки мы ее замечаем. Т.е. если ошибочно бит сбрасывается, но в нем и так 0 то мы ее просто не видим. ("Видишь суслика? - Нет. - А он есть!") и наоборот, при ошибочной установке бита если он и так 1 . Т.о. ошибок может быть и больше.
0
Evg
Эксперт CАвтор FAQ
17802 / 6008 / 387
Регистрация: 30.03.2009
Сообщений: 16,513
Записей в блоге: 26
11.06.2016, 16:48 #33
Этот пример не соответствует тому, на котором возникала ошибка. Ошибка возникала в цикле

C
        for (int i = 0; i < n; i++)     //Asc tab
            b[i]=k+i;
и именно от этого цикла надо плясать. Т.е. берёшь программу из поста #28 и потихоньку отрезаешь ненужное. Использование функции printf нужно для того, чтобы она так и остались в виде вызова функций, в то время как для std::cout возможно что-то проинлайнится компилятором из внутренностей оператора << и будет мешать смотреть код (т.е. на фоне огромной простыни кода сложнее будет найти нужный цикл и посмотреть, чего там ещё компилятор понаделал)
1
Petrolion
24 / 24 / 7
Регистрация: 02.02.2016
Сообщений: 124
11.06.2016, 18:53  [ТС] #34
Запустил последний код и погонял его с проца на проц.
Не пойму что с моими лыжами... чего не едут. Вообще взрыв мозга.
Ошибки действительно стали появляться чаще, по разным адресам, в разных тестах (кроме всех нулей). Один раз может появиться, при этом во второй проверке ошибки нет. Появились ошибки в битовом заполнении всеми единицами.
Вложил ниже лог запуска. С проца на проц пересаживал задачу вручную (через виндовый диспетчер).
Запускаемый код:
C++
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
#include <iostream>
#include <fstream>
#include <conio.h>
#include <Windows.h>
using namespace std;
 
 
int main()
{
    int n = 1<<30;
    int k = 3<<24;
    unsigned long long c = 0;
    char o;
    bool te = true;
    int a = 0;
    ofstream flog;
    flog.open("Test.log",ios_base::app);
    
    while (te)
    {
        unsigned long long * b = new unsigned long long[n];
        cout << hex << "Array at addres (" << b << "). " << dec << " Proc: " << GetCurrentProcessorNumber() << endl;
        flog << hex << "Array at addres (" << b << "). " << dec << " Proc: " << GetCurrentProcessorNumber() << endl;
        for (int i = 0; i < n; i++)     //Asc tab
            b[i]=k+i;
        cout << "Table asc ready. Read:" << hex;
        flog << "Table asc ready. Read:" << hex;
        for (int m = 0; m < 2; m++)
        {
            cout << m;
            flog << m;
            c = k;
            for (int i = 0; i < n; i++,c++)
                if (b[i] != c)
                {
                    cout << endl << "Error at adr(" << (b+i) <<"). Value: " << b[i] << " must be: " << c << " Proc: " << GetCurrentProcessorNumber() << endl;
                    flog << endl << "Error at adr(" << (b+i) <<"). Value: " << b[i] << " must be: " << c << " Proc: " << GetCurrentProcessorNumber() << endl;
                }
            if (_kbhit())
            {
                o = _getch();
                if (o == 27)
                {
                    cout << " Exit ? ";
                    o = _getche();
                    cout << endl;
                    if (o == 'y' || o == 'Y')
                        te = false;
                }
            }
        }
        cout << endl;
        flog << endl;
 
        for (int i = 0; i < n; i++)     //Clr tab
            b[i]=0;
        cout << "Table clear ready. Read:" << hex;
        flog << "Table clear ready. Read:" << hex;
        for (int m = 0; m < 2; m++)
        {
            cout << m;
            flog << m;
            for (int i = 0; i < n; i++)
                if (b[i] != 0)
                {
                    cout << endl << "Error at adr(" << (b+i) <<"). Value: " << b[i] << " must be: 0" << " Proc: " << GetCurrentProcessorNumber() << endl;
                    flog << endl << "Error at adr(" << (b+i) <<"). Value: " << b[i] << " must be: 0" << " Proc: " << GetCurrentProcessorNumber() << endl;
                }
            if (_kbhit())
            {
                o = _getch();
                if (o == 27)
                {
                    cout << " Exit ? ";
                    o = _getche();
                    cout << endl;
                    if (o == 'y' || o == 'Y')
                        te = false;
                }
            }
        }
        cout << endl;
        flog << endl;
 
        for (int i = 0; i < n; i++)
            b[i]=0xffffffffffffffff;
        cout << "Table bit ready. Read:" << hex;
        flog << "Table bit ready. Read:" << hex;
        for (int m = 0; m < 2; m++)
        {
            cout << m;
            flog << m;
            c = 0xffffffffffffffff;
            for (int i = 0; i < n; i++)
                if (b[i] != c)
                {
                    cout << endl << "Error at adr(" << (b+i) <<"). Value: " << b[i] << " must be: " << c << " Proc: " << GetCurrentProcessorNumber() << endl;
                    flog << endl << "Error at adr(" << (b+i) <<"). Value: " << b[i] << " must be: " << c << " Proc: " << GetCurrentProcessorNumber() << endl;
                }
            if (_kbhit())
            {
                o = _getch();
                if (o == 27)
                {
                    cout << " Exit ? ";
                    o = _getche();
                    cout << endl;
                    if (o == 'y' || o == 'Y')
                        te = false;
                }
            }
        }
        cout << endl;
        flog << endl;
 
        c = (unsigned long long)k;
        for (int i = 0; i < n; i++,c++)     //Asc2 tab
            b[i]=c;
        cout << "Table asc2 ready. Read:" << hex;
        flog << "Table asc2 ready. Read:" << hex;
        for (int m = 0; m < 2; m++)
        {
            cout << m;
            flog << m;
            c = k;
            for (int i = 0; i < n; i++,c++)
                if (b[i] != c)
                {
                    cout << endl << "Error at adr(" << (b+i) <<"). Value: " << b[i] << " must be: " << c << " Proc: " << GetCurrentProcessorNumber() << endl;
                    flog << endl << "Error at adr(" << (b+i) <<"). Value: " << b[i] << " must be: " << c << " Proc: " << GetCurrentProcessorNumber() << endl;
                }
            if (_kbhit())
            {
                o = _getch();
                if (o == 27)
                {
                    cout << " Exit ? ";
                    o = _getche();
                    cout << endl;
                    if (o == 'y' || o == 'Y')
                        te = false;
                }
            }
        }
        cout << endl;
        flog << endl;
        delete [] b;
    }
    flog.close();
return 0;
}
Уже вовсю подозреваю мелкомягких. Доказать не могу.
Вложил откомпилиный у меня на MSVS2010 код в архиве.
Может ли кто в 2013 или 2015 его скомпилить и положить. Чтобы запустить мог. Может это система...
1
Вложения
Тип файла: zip Test.zip (3.1 Кб, 2 просмотров)
Тип файла: zip proba.zip (11.6 Кб, 3 просмотров)
avgoor
903 / 538 / 116
Регистрация: 05.12.2015
Сообщений: 1,497
11.06.2016, 19:49 #35
Цитата Сообщение от Evg Посмотреть сообщение
Но странным выглядит то, что сбой происходит примерно по одним и тем же виртуальным адресам. Т.е. тут дело скорее в подсистеме памяти (начиная от кэша и далее), чем в вычислительных узлах процессора
ХЗ где но скорее всего в процессоре. Надо смотреть еррату на конкретную модель камня.
0
Petrolion
24 / 24 / 7
Регистрация: 02.02.2016
Сообщений: 124
11.06.2016, 20:16  [ТС] #36
Цитата Сообщение от avgoor Посмотреть сообщение
ХЗ где но скорее всего в процессоре. Надо смотреть еррату на конкретную модель камня.
А где такое посмотреть? AMD Phenom II X6 1065T
Сейчас друг забросил откомпиленное в MSVS2015. Почти те же самые яйца - вид сбоку. Только стало больше ошибок на массиве заполненном всеми битами. :-(
Уже задумываюсь порешить систему.
0
avgoor
903 / 538 / 116
Регистрация: 05.12.2015
Сообщений: 1,497
11.06.2016, 20:42 #37
Petrolion, Начните с обновления биоса.

Добавлено через 12 минут
Цитата Сообщение от Petrolion Посмотреть сообщение
А где такое посмотреть?
Например http://developer.amd.com/wordpress/m...10h_Rev_Gd.pdf начиная со стр. 30
Пример от туда, правда не для вашего процессора:
A DIV Instruction Followed Closely By Other Divide Instructions May Yield Incorrect Results
1
Petrolion
24 / 24 / 7
Регистрация: 02.02.2016
Сообщений: 124
11.06.2016, 20:43  [ТС] #38
avgoor, новее для моей матери биоса нет.
0
avgoor
903 / 538 / 116
Регистрация: 05.12.2015
Сообщений: 1,497
11.06.2016, 20:49 #39
Цитата Сообщение от Petrolion Посмотреть сообщение
новее для моей матери биоса нет
Пичалька. Ну тогда, возможно,
Цитата Сообщение от Petrolion Посмотреть сообщение
Уже задумываюсь порешить систему.
спасет отца русской демократии. Хотя вряд ли.
0
Renji
1916 / 1314 / 298
Регистрация: 05.06.2014
Сообщений: 3,757
11.06.2016, 22:09 #40
Цитата Сообщение от Petrolion Посмотреть сообщение
Уже вовсю подозреваю мелкомягких. Доказать не могу.
1) Поставить QtCreator с mingw и проверить ошибку в нем.
2) Загрузиться с лайв-CD Дебиана, sudo apt-get install qt-sdk в консольке, опять-же проверить все в QtCreator. Сразу уточняю, лайв ставит новый софт в оперативку, на хард он ничего не пишет.
1
avgoor
903 / 538 / 116
Регистрация: 05.12.2015
Сообщений: 1,497
11.06.2016, 22:15 #41
Цитата Сообщение от Renji Посмотреть сообщение
Поставить QtCreator с mingw и проверить ошибку в нем.
Ничего не даст, т.к. если проблема аппаратная - ошибка может спрятаться и вылезти потом в другом месте.
Цитата Сообщение от Renji Посмотреть сообщение
Загрузиться с лайв-CD Дебиана, sudo apt-get install qt-sdk в консольке, опять-же проверить все в QtCreator. Сразу уточняю, лайв ставит новый софт в оперативку, на хард он ничего не пишет.
Опять же. Если проблема не исчезнет - это гарантированный результат, если исчезнет - это может ничего не значить.
1
Evg
Эксперт CАвтор FAQ
17802 / 6008 / 387
Регистрация: 30.03.2009
Сообщений: 16,513
Записей в блоге: 26
12.06.2016, 00:10 #42
Ещё одно наблюдение. В логах из поста #28 дефектными оказались адреса

Код
00000002C4DEA928   Value: 32a4551d must be: 33a4551d
00000002BA107918   Value: 334a8f1b must be: 324a8f1b
000000019EA69918   Value: 0ddcd31b must be: 0cdcd31b
00000001A27BC928   Value: 0c57791d must be: 0d57791d
концовки адресов весьма похожи. Там, где адрес заканчивается на 928, имеем незаконно взведённый 24-й бит, там, где адрес заканчивается на 918, имеем незаконно погашенный 24-й бит. Было бы интересно посмотреть ещё на парочку логов от той программы, сохранится ли там подобная тенденция

Добавлено через 2 минуты
Сразу не заметил лог в 34-м посте (из-за названия Test.zip). Там сия тенденция повторяется

Добавлено через 4 минуты
Зря ты работаешь в большим исходником программы. Его наоборот надо сокращать. В идеале до минимума (т.е. один цикл записи и один цикл проверки)

То, что имеем в печати виртуальные адреса, принципиально ничего не портит. Они отображаются на физические адреса с точностью до страницы (4 килобайт). Т.е. младшие 12 бит виртуального адреса будут совпадать с младшими 12 битами физического адреса

При этом закономерность по адресам наблюдается именно в младших 12 битах, что говорит скорее о проблемах с памятью (контроллер памяти, планки памяти, или что-то типа того). Если бы была проблема с кэшем, то совпадение адресов было бы в пределах 6 бит, исходя из того, что размер линии кэша равен 32 байтам (может там не 32, а 64 или 128, это уже не так важно). Я не знаю точных алгоритмов работы кэша, но по ощущениям они вряд ли работают с точностью до страницы памяти

Добавлено через 11 минут
Если культурно сократишь тест (выкинешь все conio.h), то его можно будет компилировать не только микрософтовским компилятором. Исправить тест в общем-то сможет любой, но проверить можешь только ты, а потому будет лучше, если ты выложишь нормально сокращённый пример, который скомпилируется в любом компиляторе. А потом тебе народ выдаст бинарники, а ты уже будешь смотреть, что из них падает, а что нет. Посмотрев на код падающих и не падающих бинарников в общем-то тоже можно будет увидеть какие-то закономерности

Добавлено через 1 минуту
Да и тему для порядку надо бы куда-нибудь в низкоуровневое программирование переместить
1
avgoor
903 / 538 / 116
Регистрация: 05.12.2015
Сообщений: 1,497
12.06.2016, 03:01 #43
Цитата Сообщение от Evg Посмотреть сообщение
При этом закономерность по адресам наблюдается именно в младших 12 битах
В 13-ти. Причем если 13-й бит=1 то 24-й бит - устанавливается, а если 13-й бит=0 - то 24-й - гасится.
1
Evg
Эксперт CАвтор FAQ
17802 / 6008 / 387
Регистрация: 30.03.2009
Сообщений: 16,513
Записей в блоге: 26
12.06.2016, 12:34 #44
Даже вон как. Т.е. может быть какая-нибудь ситуация, что на уровне физического проектирования (т.е. транзисторы, конденсаторы) при определённых динамических условиях (типа большой трафик в память на фоне вытеснения записи из конкретного места кэша) и при наличии некоторых статических условий (определённая комбинация бит в шине, передающей адрес или просто значение в регистре) сигнал с какой-то линии одной шины перебивает сигнал на линии другой шины. Такое может быть в том числе и в процессоре в момент выставления заявки на запись в память
1
avgoor
903 / 538 / 116
Регистрация: 05.12.2015
Сообщений: 1,497
12.06.2016, 13:44 #45
Цитата Сообщение от Evg Посмотреть сообщение
сигнал с какой-то линии одной шины перебивает сигнал на линии другой шины.
Все-таки, мне имхается, что проблема в микрокоде. Если б что-то перебивало на физическом уровне оно б зависело только от конкретных (может соседних? но не зная разводки не сказать) битов. Да и сама система кэша/памяти не может давать такие артефакты (ошибка только при 0x918 или при 0x928, была б зависимость от одного бита, другие были бы рандомными).
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.06.2016, 13:44
Привет! Вот еще темы с ответами:

Утечки при использовании порта завершения и соккетов - C++
Здравствуйте, уважаемые Гуру! Реализовываю сервер с использованием порта завершения. Всё работает, всё прекрасно. Одно меня смущает -...

ClientDataSet, Blob утечки памяти при записи в файл - Delphi
столкнулся с такой ситуацией, есть ClientdataSet в котором есть блоб поле, которое я записываю процедурой ниже: Procedure...

При записи файлов на диск, комптютер выдал ошибку, что данный диск не может дальше использоваться - Windows 7
При записи файлов на диск, через некоторое время мой комптютер выдал ошибку, что данный диск не может дальше использоваться(или что-то...

При закачке игры на жесткий диск пишет "Ошибка при записи на диск" - Жесткие диски
В системе 2 жестких диска. Так вот, при попытке установить на жесткий диск игры со стима пишет &quot;Ошибка при записи на диск&quot;, загрузка...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
12.06.2016, 13:44
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru