LINUX.ORG.RU

Модуль ядра 2.4.хх. Ядро работает на arm926ejs. Проблема с функцией set_fs()


0

1

Доброго всем времении суток!

Коллеги, помогите решить следующую проблему. Есть старое ядро 2.4.хх, есть железяка работающая на arm926ejs под управлением этого ядра. Пишу модуль ядра для этой железяки, в коде модуля есть такие строчки:

.................... 1. old_fs = get_fs(); 2. set_fs(KERNEL_DS); 3. sock->ops->ioctl(...); // запрос к драйверу железяки 4. set_fs(old_fs); .................... Ошибка (даже не могу ее описать, т.к. железка «умирает» молча, ни kernel_panic, ни error какой-то, ничего...) ТОЧНО происходит либо в строке 1, либо 2. По-моему, скорее - 2. Я понимаю, что функция set_fs устанавливает значение лимита для ядра в регистр DS (это на х86), я понимаю, что в ARM'e никаких сегментных регистров нет. Но только дальше то что?! Коллеги, если кто сталкивался с подобным, или есть здравые мысли как это победить, посоветуйте пожалуйста.

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

Извините, адресок более точный дайте

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

А вот завтра на работе попробую и узнаю :-) По идее все должно работать, ведь насколько я понимаю для ARM нет сегментов памяти.

yura_lvk
() автор топика

А почему вы не можете посмотреть что делает данная функция на арме, если есть исходники?

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

static inline void set_fs (mm_segment_t fs) { current->addr_limit = fs;

modify_domain(DOMAIN_KERNEL, fs ? DOMAIN_CLIENT : DOMAIN_MANAGER); }

Честно говоря, мне это понимания не добавляет, однако совет хороший. Может быть вариант, что у меня кросс-компиляция криво сработала и вместо define KERNEL_DS из arm подлезло значение KERNEL_DS из i386. И в комментах к исходникам есть такое: Use set_fs(get_ds()) and then the *_user functions to allow them to access kernel memory. Однако, я все равно не понимаю, какие лимиты и сегменты в арме.

Короче, кому охота лезть в исходники, когда есть надежда, что кто-то уже на эти грабли наступал и подскажет :-)

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

Сегменты тут ни при чём. Память делится на память ядра и память юзерспейса. При вызове функции ядро проверяет, к какой области принадлежит указатель, и если вызывается юзер-функция, а указатель ядерный, то происходит ай-яй-яй. Так что если вот этот вот sock->ops->ioctl суть ядерная функция, то переключения лимита вообще не нужно.

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

Как правильно отметили ниже, к сегментам и регистрам это имеет мало отношения. А вы наверняка пробовали закомментировать 3 строку(с иоктл), в этом случае система падает?

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

Да, падает. Если закомментить вызовы set_fs(), то не падает, но ioctl выдает ошибку (код ошибки пока не посмотрел) и не отрабатывает как надо.

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

Может стоит попробовать как-то выкрутить дебаг? Я не сталкивался с 2.4 ядрами, но на 2.6 не пр помню , чтобы оно умирало без ругани в консоль

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