Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: копирование в пространство пользователя
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > Linux
Dubov
Правильно ли я понимаю, что запись из ядра(например при возникновении события/прерывания) осуществлется так:
из пространства пользователя передаётся указатель, а в пространстве ядра пишем по этому казателю через copy_to_user ?

Но я не понимаю как сообщить пространству ядра, что данные готовы? или просто отобразить буфер пространства ядра в пользовательское пространство через mmap и тогда что пишем в ядре будет и в юзерспейс писаться сразу?
kurtis
Цитата
сообщить пространству ядра, что данные готовы?

Какие именно данные? От куда данные приходят? Какую проблемы вы решаете?
Dubov
Цитата(kurtis @ Dec 5 2012, 12:00) *
Какие именно данные? От куда данные приходят? Какую проблемы вы решаете?

простите не уточнил.
Данные - это числа в массиве! Как заполняется массив на уровне ядра - не суть. Но заполняется циклически и последовательно(байт за байтом). Как только массив наполнится - сообщать нужно в пользовательское пространство что данные готовы.
SyncLair
после данных которые вы копируете надо написать строчку "Linus Aliluya!!!" и всё. biggrin.gif

ну конечно же нужно не сообщить а просто перевести процесс из состояния блокирован в состояние готов, надеюсь я правильно понимаю суть проблемы ?
kurtis
Если нужно просто прочитать данные из буфера ядра, то просто делаете обычный блокирующий вызов read(). Гляньте в LDD3, что-то подобное там было.
Если коротко, то при вызове read будет что-то такое
userspace read() -> libc обертка для системного вызова -> функция read() вашего драйвера, в пространстве ядра. Если данные готовы, то возвращаем данные, если данные не готовы, то ждем пока станут готовы, при этом пользовательский процесс останется "заблокирован" в системном вызове.
TigerSHARC
Цитата(kurtis @ Dec 5 2012, 22:59) *
... если данные не готовы, то ждем пока станут готовы...

poll?
Idle
Цитата(Dubov @ Dec 5 2012, 10:52) *
Правильно ли я понимаю, что запись из ядра

Правильно.

Цитата(Dubov @ Dec 5 2012, 10:52) *
Но я не понимаю как сообщить пространству ядра, что данные готовы?

Блокируйте метод read вашего char device пока данные не накопятся. Приложение в юзерспейсе пусть читает в цикле.
Dubov
похоже всётаки poll проще
am1808
epoll() еще проще...
а по теме, то вам не нужен ни poll(), ни select(), и не epoll()

вам уже сказали, реализуйте нормально метод read(),
делать блокировку на нем или нем - решайте сами
Olej
Цитата(Dubov @ Dec 5 2012, 10:52) *
Правильно ли я понимаю, что запись из ядра(например при возникновении события/прерывания) осуществлется так:
из пространства пользователя передаётся указатель, а в пространстве ядра пишем по этому казателю через copy_to_user ?

Правильно, да не очень biggrin.gif
В Linux разделение на пространство ядра и пользователя - очень условное, для 32-бит Linux это выше/ниже границы 0xC000, copy_to_user всего лишь снимает проверку адреса относительно этой границы.
См. например Драйверы и модули ядра Linux, там же есть полные примеры кода блокирующих и неблокирующих операций ввода и вывода в модулях ядра.
vshemm
Цитата(Olej @ Dec 27 2012, 03:44) *
Правильно, да не очень biggrin.gif
В Linux разделение на пространство ядра и пользователя - очень условное, для 32-бит Linux это выше/ниже границы 0xC000, copy_to_user всего лишь снимает проверку адреса относительно этой границы.
См. например Драйверы и модули ядра Linux, там же есть полные примеры кода блокирующих и неблокирующих операций ввода и вывода в модулях ядра.


Опять фигню пишете и путаете народ.

Во-первых, разделение на пространство ядра/пользователя очень не условное, и логика работы с памятью
в этих пространствах различается кардинально. Настолько, что ванильное ядро не работает без MMU (а
еще есть ZONE_HIGHMEM, NUMA и пр. извраты).

Во-вторых, сравнение идет не с 0xC000, а с addr_limit текущего процесса, который легко меняется. Даже
если предположить, что речь идет о x86 и все значения выставлены по дефолту, граница будет 0хС0000000.

В-третьих, copy_to_user() как раз *включает* проверку на эту границу, чтобы пользователь не смог передать
ядерный адрес и затереть структуры ядра.

И, наконец, основная задача copy_to_user() и подобных функций (кроме копирования) - построить специальные
таблицы эксепшенов и фиксапов для отличия случая передачи неверных параметров от реального бага при
возникновении page fault в ядре. Юзерские страницы могут отсутствовать по массе причин, и далеко не всегда
это должно приводить к Oops. Например, юзер передал невалидный указатель (NULL), или валидный, но на read-only
память (причем не стековую) и т.д. В данном случае нужно просто вернуть код ошибки/послать SIGSEGV. Поэтому
любое обращение по юзерскому указателю из ядра нужно делать через подобные функции.

Так что ТС все правильно понимает, стоит добавить только, что copy_to_user() и ко могут спать, поэтому их
можно вызывать только из контекста процесса (нельзя вызывать из прерывания/softirq/tasklet`ов).

З.Ы. В книге на с.43 неверно определена семантика copy_to/from_user() - они возвращают количество
*недозаписанных* байт, и никогда не возвращают коды ошибок. И возвращаемое значение у них - беззнаковое.
Idle
Цитата(vshemm @ Dec 27 2012, 11:44) *

Не обращайте внимание - он просто рекламирует свою то ли недописанную, то ли просто неизданную книгу.
Olej
Цитата(Idle @ Dec 27 2012, 11:53) *
Не обращайте внимание - он просто рекламирует свою то ли недописанную, то ли просто неизданную книгу.


Дурачок юный, если ты разуешь глаза и перестанешь петь самолюбуясь как тетерев на току, то обнаружишь: там элементарно нет никакой рекламы, ни единого рекламного банера, и сайты эти не имеют ко мне никакого касательства... и за пользование с тебя не просят ни копейки.

Это конспект курса лекций, прочитанных по заказу в крупной международной компании (GlobalLogic) специализирующейся на разработке ПО (>3000 разработчиков по миру).
И IBM считает это материал адекватным для публикации большой серией статей среди своих постоянных авторов.
Этот материал не нужно дописывать, издавать...
Он выставлен для свободного пользования теми, кому это понадобится.

... а не для тех, кто только рот открывает. 1111493779.gif

Цитата(vshemm @ Dec 27 2012, 11:44) *
З.Ы. В книге на с.43 неверно определена семантика copy_to/from_user() - они возвращают количество
*недозаписанных* байт, и никогда не возвращают коды ошибок. И возвращаемое значение у них - беззнаковое.

То что неправильно указали - может быть, это спасибо что указали, и я пересмотрю и перепроверю.

А во всём остальном... : зачэ-э-э-э-м так много пысал? 1111493779.gif
Никого я не собирался "пугать":
Цитата(vshemm @ Dec 27 2012, 11:44) *
Опять фигню пишете и путаете народ.

Во-первых, разделение на пространство ядра/пользователя очень не условное, и логика работы с памятью
в этих пространствах различается кардинально. Настолько, что ванильное ядро не работает без MMU (а
еще есть ZONE_HIGHMEM, NUMA и пр. извраты).
...

Всё, что так много написано - к существу дела на практике (обмена драйвера с юзерспейс) не имеет никакого касательства, написано "лишь бы поговорить"... никакие "извраты", ZONE_HIGHMEM и NUMA к этому вопросу и рядом никаким боком не лежали.

Idle
Цитата(Olej @ Dec 27 2012, 13:48) *
Дурачок юный, если ты разуешь глаза и перестанешь петь самолюбуясь как тетерев на току, то обнаружишь: там элементарно нет никакой рекламы, ни единого рекламного банера, и сайты эти не имеют ко мне никакого касательства... и за пользование с тебя не просят ни копейки.

Go fuck yourself, shithead.
Olej
Цитата(Idle @ Dec 27 2012, 17:07) *
Go fuck yourself, shithead.

Я ещё раз повторю для самых тупых (вы спрашивайте, спрашивайте... biggrin.gif ):

- это написано для тех, кому это может понадобиться, кому захочется ... могут считать это подарком к Новому Году. santa2.gif

- тебе оно неинтересно? не надо? ... такой умный? - так "вольному воля"(с): повернулся - застегнул ширинку - и пошёл... 1111493779.gif
vshemm
IBM developerworks известен своими "серьезными" публикациями, впрочем, истинность или ложность выражения
не зависит от его этимологии, верно? Я просто оставлю небольшую цитату отсюда (напомню, речь идет о copy_to/from_user()):

Цитата
Заслуживает внимания тот факт, что все эти вызовы получают два адресных параметра: источник (from) и приёмник (to), но это будут значения, относящиеся к разным системам координат, т.е. к разным адресным пространствам. В принципе, в каком-то частном случае эти адреса могут численно совпадать, указывая при этом на совершенно разные физические области.

Nuff said.
Idle
Цитата(vshemm @ Dec 27 2012, 21:03) *

По какой-то странной иронии мой единственный патч в ядре - именно в copy_*_user sm.gif sm.gif.
Dubov, извини за флуд.
Dubov

Цитата(vshemm @ Dec 27 2012, 21:03) *
По какой-то странной иронии мой единственный патч в ядре - именно в copy_*_user sm.gif sm.gif.
Dubov, извини за флуд.

что за патч? не понял, причём тут патч?
Idle
Цитата(Dubov @ Dec 28 2012, 10:09) *

Это я не вам. Разобрались с копированием?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.