LINUX.ORG.RU

Адаптирование стресс-теста под специфическую архитектуру


0

1

Адаптирую данный стресс-тест системных вызовов scrashme под нестандартную архитектру. Для более эффективного тестирования в данном тесте системным вызовам подаются аргументы, внешне выглядищие валидными(за это отвечают файлы sanitise*). В частности для системного вызова mremap производиться некое выравнивание нового значения(изначально случайного) размера виртуальной памяти при помощи некой архитектурозависимой константы TASK_SIZE.

#ifdef __x86_64__
#define TASK_SIZE       (0x800000000000UL - 4096)
#endif
#ifdef __i386__
#define PAGE_OFFSET 0xC0000000
#define TASK_SIZE (PAGE_OFFSET)
/*
 * Alternative possibilities for PAGE_OFFSET:
 * default 0xB0000000 if VMSPLIT_3G_OPT
 * default 0x78000000 if VMSPLIT_2G
 * default 0x40000000 if VMSPLIT_1G
 */
#endif
#ifdef __powerpc__
#define PAGE_OFFSET 0xC0000000
#define TASK_SIZE (PAGE_OFFSET)
#endif
#ifdef __ia64__
#define PAGE_OFFSET 0xe000000000000000
#define TASK_SIZE 0xa000000000000000
#endif
#ifdef __sparc__
#ifdef __arch64__
#define TASK_SIZE ~0UL
#else
#define TASK_SIZE 0xF0000000UL
#endif
#endif
....
....
void sanitise_mremap(
		unsigned long *addr,
		__unused unsigned long *old_len,
		unsigned long *new_len,
		unsigned long *flags,
		unsigned long *new_addr,
		__unused unsigned long *a6)
{
	unsigned long mask = ~(page_size-1);
	int i;

	*flags = rand()	& (MREMAP_FIXED | MREMAP_MAYMOVE);

	*addr &= mask;

	if (!*new_len)
		*new_len = rand();

	i=0;
	if (*flags & MREMAP_FIXED) {
		*flags &= ~MREMAP_MAYMOVE;
		*new_len &= TASK_SIZE-*new_len;
....
Вопрос, что это за константа, каким образом она зависит от архитектуры?

★★★

Ответ на: комментарий от anonymous

В нем кода меньше, разобраться быстрей можно, а идея одна и таже.

LIKAN ★★★
() автор топика
TASK_SIZE
    The maximum size of a user process in bytes.  Since user space
    always starts at zero, this is the maximum address that a user
    process can access+1.  The user space stack grows down from this
    address.

    Any virtual address below TASK_SIZE is deemed to be user process
    area, and therefore managed dynamically on a process by process
    basis by the kernel.  I'll call this the user segment.

    Anything above TASK_SIZE is common to all processes.  I'll call
    this the kernel segment.

    (In other words, you can't put IO mappings below TASK_SIZE, and
    hence PAGE_OFFSET).
Relan ★★★★★
()
Ответ на: комментарий от anonymous

я лох, кавычки забыл ._. Но принцип должен быть понятен.

anonymous
()
Ответ на: комментарий от Relan

Ок, а где эта констатнта дефайнится, точней где дефайниться определяющая её в х86(да и в моем случае тоже) константа PAGE_OFFSET.

LIKAN ★★★
() автор топика
Ответ на: комментарий от LIKAN

Ок, а где эта констатнта дефайнится, точней где дефайниться определяющая её в х86(да и в моем случае тоже) константа PAGE_OFFSET.

«Даю уроки пользования утилитой grep. Дорого.»

Relan ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.