diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d5392cc --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +build/ +.kdev4/ +*~ +*.kdev4 + + + diff --git a/main.c b/main.c index 66f31f8..e14d33f 100644 --- a/main.c +++ b/main.c @@ -1,8 +1,79 @@ #include #include +#include +#include +#include +#include +#include +#include -int main(int argc, char *argv[]) -{ - puts("Hello, World!"); +#define BLOCK_SIZE (1024ULL*1024ULL*1024ULL*8) + +uint32_t test_patterns[] = {0x00000000, 0xFFFFFFFF, 0xAAAAAAAA, 0x55555555}; + +void fill_pattern(uint32_t *buf, size_t words, uint32_t pattern) { + for (size_t i = 0; i < words; i++) { + buf[i] = pattern; + } +} + +void fill_increment(uint32_t *buf, size_t words) { + for (size_t i = 0; i < words; i++) { + buf[i] = (uint32_t)i; + } +} + +int check_pattern(uint32_t *buf, size_t words, uint32_t pattern) { + int errors = 0; + for (size_t i = 0; i < words; i++) { + if (buf[i] != pattern) { + printf("Ошибка в тесте %zu: должен быть: 0x%08X, фактический: 0x%08X\n", i, pattern, buf[i]); + errors++; + if (errors > 10) break; + } + } + return errors; +} + +int main() { + if (mlockall(MCL_CURRENT | MCL_FUTURE) != 0) { + perror("mlockall ошибка!\nВозможно недостаточно прав!\n"); + return 1; + } + size_t words = BLOCK_SIZE / sizeof(uint32_t); + uint32_t *mem = malloc(BLOCK_SIZE); + if (!mem) { + perror("Память выделена!"); + return 1; + } + + // Основные паттерны 0x00000000, 0xFFFFFFFF, 0xAAAAAAAA, 0x55555555 + for (size_t p = 0; p < sizeof(test_patterns)/sizeof(test_patterns[0]); ++p) { + printf("Запушен патерн 0x%08X\n", test_patterns[p]); + fill_pattern(mem, words, test_patterns[p]); + printf("Жду\n"); + usleep(10000000); + printf("Проверяю\n"); + int err = check_pattern(mem, words, test_patterns[p]); + if (err == 0) printf("OK\n"); + else printf("Errors: %d\n", err); + } + + // Инкремент + printf("Запушен патерн инкрементации\n"); + fill_increment(mem, words); + usleep(10000000); + int err = 0; + for (size_t i = 0; i < words; i++) { + if (mem[i] != (uint32_t)i) { + printf("Ошибка в тесте %zu: должен быть: 0x%08X, фактический: 0x%08X\n", i, (uint32_t)i, mem[i]); + err++; + if (err > 10) break; + } + } + if (err == 0) printf("OK\n"); + else printf("Errors: %d\n", err); + + free(mem); return 0; }