LINUX.ORG.RU

set_fs()


0

0

Помогите разобраться что конкретно делает эта функция и для чего ее можно применять, а для чего нельзя. Я находил в гугле статьи про эту функцию но они все основанные на сис. вызове sys_open вследствии чего не смог понять некоторые аспекты. А именно интересует:

old_fs = get_fs()
set_fs(KERNEL_CS)
/* что именно тут произойдет, и что тут можно делать
* если например эту конструкцию заюзать из USER SPCASE неужто она
* даст доступ к данных в KERNEL SPACE ? Если даст то только к данным
* или к коду тоже (т.н. можно запускать ядровые функции)
* вызывается ли она с отличного от 0-го кольца привилегий ?
set_fs(old_fs)



Последнее исправление: Cupper (всего исправлений: 1)
Ответ на: комментарий от ttnl

arch/x86/include/asm/uaccess.h:

*
 * The fs value determines whether argument validity checking should be
 * performed or not.  If get_fs() == USER_DS, checking is performed, with
 * get_fs() == KERNEL_DS, checking is bypassed.
 *
 * For historical reasons, these macros are grossly misnamed.
 */

Наверное, этим комментариям можно верить.

ttnl ★★★★★
()
old_fs = get_fs();
set_fs(KERNEL_CS);
...
//here system calls can be invoked
...
set_fs(old_fs);

Как я понял это такой финт ушам. Чтоб можно было запустить код написаный в стиле sys-calls. Так как он ожидает в качестве параметров указатели на данные пространства пользователя из user-thead. А если мы хотим передать указатель на данные из адресного пространства kernel-thread, то делать надо такую фигню. Иначе могут быть проблемы с вызовами copy_to_user()/copy_from_user() в коде самого sys-call-а.

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

> Чтоб можно было запустить код написаный в стиле

sys-calls.


не совсем. см access_ok() && comments.

Иначе могут быть проблемы с вызовами copy_to_user()/copy_from_user()


да, ->addr_limit просто указывает чего get/put user & co
могут читать/писать.

idle ★★★★★
()

А если по существу вопроса, то set_fs() тебе не поможет поиметь ядро из user-space. Брось ты это дело. Займись лучше написанием прикладного софта, вместо этого быдло-хакерства.

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

>не совсем. см access_ok() && comments.

Я не силен в написании «ядреного» софта. Если не трудно, можешь пояснить зачем ещё это может понадобится? access_ok() насколько я помню нужен для того чтобы проверить корректность указателя, полученного «якобы» из userspace. Мне кажется вся эта махинация с set_fs() нужна лишь для того чтоб вызывать код, который думает, что ему подсовывают данные из userspace.

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

уху, исходники я тоже смотрел, потом гугл, потом опять исходники, потом опять гугл, и так много раз

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

нее :) я не быдло хакер %) это нужно в благих целях. Просто тут студенческие проект делаем, нужно решить проблему как можно из НЕ кернел спейса обратиться к функциям из кернел спейс, вариант был либо с помощью гейтов (я представляю его как механизм работы системных прерываний), а я вспомнил что видал тукую штуку как set_fs и недопонял ее, вследствии чего предположил что ее можно заюзать, но потом начало проясняться что это нето о чем я думал, а щас мой миф полностью разрушен.

Коли я уж развернул тут свою тему, может кто изучал/знает/делал «штуки» для переходя из USER_SPACE в KERNEL_SPACE, ну или просто направить на такой материал, что тоже будет неоценимо полезно.

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

>из НЕ кернел спейса обратиться к функциям из кернел спейс

ИСКЛЮЧИТЕЛЬНО через syscall-ы, которые реализованы на базе 80h прерывания (для x86). Чудес не бывает. Все библиотечные функции в конечном итоге вызывают syscall-ы.

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

>из USER_SPACE в KERNEL_SPACE

ИМХО проще всего написать примитивный драйвер символьного устройства с поддержкой ioctl(). И через ioctl() вызывать все функции.

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

Хочу продолжить эту тему, но несколько с другого бука. А кто нить знает как работает этот самый addr_limit который задается через set_fs ? Как все уже поняли KERNEL SPACE (KERNEL_DS) это от 3 до 4Gb, USER SPACE (USER_DS) это от 0 до 3 Gb. Но это голые слова, на практике же мы имеем KERNEL_DS = 4Gb = непомню что там в хексе USER_DS = 0xc000000 = 3Gb

с юсер спейсом предположим все понятно, адреса идут от 0 и до < USER_DS (addr_limit) а как это работает в случае с KERNEL_DS Oo ? Откуда процессу известно что оно должно начинать нумеровать адресе не с 0 а с 3Gb ?

А еще я не могу понять следующего: в GDT в десктрипторах __KERNEL_CS, __KERNEL_DS, USER_CS, USER_DS есть поля отвечающие за начало (base) и конец (linux) адресного пространства, и в них оно во всех от 0x00000000 до 0xffffffff. Тобишь от 0Gb до 4Gb. А адресное адресное пространство процесса подчиняется выше описанному правилу (от 0 до 3, от 3 до 4). Но здесь я пиняю на то что процессы использую виртуальное адресное пространство а в GDT указывается логические адреса. Я ошибаюсь ?

Буду рад любым ответам, советам, посылваниям :) Боветте и чезатти я читал, читаю. Это как раз от тудова такие вопросы и возникают.

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