LINUX.ORG.RU

Реализация list или vector в ядре.


0

0

Я так понял в ядре нет реализаций таких элементов. Если кому не сложно то не мог бы кто нить привести пример реализации какого нибудь из этих элементов, лучше того что будет быстрее функционировать в ядре.

P.S. рад бы погуглить но к сожалению трафик инета через мобилу не дешёвый, потому прошу здесь.

Заранее огромное спасибо!!!

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

А вот решил воспроизвести для начала в отдельном от ядра сишнике, и вот что получилось.

struct test{
	struct test *prev;
	struct test *next;
	char *n;
};

void __add_entry(struct test *new, struct test *prev, struct test *next)
{
	printf("__add_entry start\n");
	next->prev = new;
	new->next = next;
	new->prev = prev;
	prev->next = new;
	printf("__add_entry end\n");
}

void add_entry(struct test *new, struct test *s)
{
	printf("add_entry start\n");
	__add_entry(new, s, s->next);
	printf("add_entry end\n");
}

int main(int argc, char *argv[])
{
  int i;
  struct test *s;
  struct test *n;
  n->n = "test";
  add_entry(n,s);
  printf("Done!\n");
  return EXIT_SUCCESS;
}

А вот что вывод:

# ./test
add_entry start
__add_entry start
Segmentation fault

что не так?????

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

Енто и не так:

n->n = "test"; __add_entry(new, s, s->next);

здесь n и s указывают куда повезёт, вот и segmentation fault вылезает. Странно, что не его нет в первом случае. :(

PS: Кстати, есть волшебная опция -Wall, которая обругала бы оба этих места во время компиляции.

PPS: Не в виде наезда: а Вы уверены, что что достаточно хорошо знаете СИ, чтобы "ядрёными" хакерствами заниматься? Там впереди ещё сюрпризов вагон и маленький поезд. И в СИ, и в использовании GCC, и в мат. части. :)

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

Не понтов ради будет сказано :) , но С++ я знаю хорошо, а вот с С ниразу не сталкивался, вот отсюда такие вопросы. Плюс к этому, последний раз писал почти год назад (просто что бы летом от скуки не помереть решил написать файер, как говориться just for fun). В С++ указатель инициализировался через new а С он отсутствует, что стало для меня сюрпризом потому и туплю. Не мог бы показать как эти указатели инициализировать.

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

А инициализируются они очень легко. В СИ:

type_of_p* p; p = malloc(sizeof(type_of_p));

В ядре вместо malloc модно использовать kmalloc ( и соответственно kfree ). Кстати, заметили, что там листы замкнутые? То есть:

void init_list(test* list_head) { list_head->next = list_head->prev = list_head; }

У Вас это отсутствует.

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