Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: set_fs()  (Прочитано 950 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн cupper

  • Автор темы
  • Любитель
  • *
  • Сообщений: 98
    • Просмотр профиля
set_fs()
« : 03 Февраль 2010, 23:06:57 »
Мог бы кто ни дуть разъяснить что именно и для чего делает эта функция.

Я понимаю ее таким образом: предположим некий код выполняется в user space а в этом коде нужно получить доступ к некой переменной ( или функции) по указателю, но он указывает на kernel_space  и для того чтобы получить доступ к нему мы можем сделать так
set_fs(KERNEL_DS) // откыли доступ из юзер спейса к кернел спейсу
вызвали функцию или скопировали параметр из kernel space
set_fs(USER_DS) // закрыли доступ

Но что то мне кажется что я заблуждаюсь. Поправьте ктонить...
« Последнее редактирование: 03 Февраль 2010, 23:11:16 от cupper »

Оффлайн Akum

  • Новичок
  • *
  • Сообщений: 35
    • Просмотр профиля
Re: set_fs()
« Ответ #1 : 04 Февраль 2010, 23:47:36 »
Вот что нагуглил:
http://forum.shelek.ru/index.php/topic,8031.0/wap2.html

Наверное юзаеться так:
fs=get_fs();
set_fs(KERNEL_DS)
вызвали функцию или скопировали параметр из kernel space
set_fs(fs)     
Ubuntu 9.10 x64 / P5K Premium / E660 / DDR2*3G / 8600GTS / HDD 750G
Ubuntu-Server 9.10 x86 / Celerom 2.66 / DDR2*1.5G / ati9950 / HDD 3Tб

Оффлайн cupper

  • Автор темы
  • Любитель
  • *
  • Сообщений: 98
    • Просмотр профиля
Re: set_fs()
« Ответ #2 : 04 Февраль 2010, 23:57:41 »
да я гугл весь прочел, но так и не уловил всей сути. Мне б мнение того кто реально ее использовал

Оффлайн Akum

  • Новичок
  • *
  • Сообщений: 35
    • Просмотр профиля
Re: set_fs()
« Ответ #3 : 05 Февраль 2010, 00:07:00 »
Во тоже чел спрашивает про set_fs() и там все по полочкам разложено правдо на забугорном))
http://kerneltrap.org/mailarchive/linux-kernel-newbies/2007/10/25/354893/thread#mid-354893
Ubuntu 9.10 x64 / P5K Premium / E660 / DDR2*3G / 8600GTS / HDD 750G
Ubuntu-Server 9.10 x86 / Celerom 2.66 / DDR2*1.5G / ati9950 / HDD 3Tб

Оффлайн cupper

  • Автор темы
  • Любитель
  • *
  • Сообщений: 98
    • Просмотр профиля
Re: set_fs()
« Ответ #4 : 05 Февраль 2010, 12:50:58 »
читал я это уже. Если не сложно напишите как вы это понимаете.

Оффлайн cupper

  • Автор темы
  • Любитель
  • *
  • Сообщений: 98
    • Просмотр профиля
Re: set_fs()
« Ответ #5 : 15 Февраль 2010, 23:20:24 »
Хочу продолжить эту тему, но несколько с другого бука. А кто нить знает как работает этот самый 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 указывается логические адреса. Я ошибаюсь ?
« Последнее редактирование: 15 Февраль 2010, 23:22:39 от cupper »

 

Страница сгенерирована за 0.07 секунд. Запросов: 24.