реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> копирование в пространство пользователя, из ядра
Dubov
сообщение Dec 5 2012, 06:52
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 408
Регистрация: 28-05-12
Пользователь №: 72 052



Правильно ли я понимаю, что запись из ядра(например при возникновении события/прерывания) осуществлется так:
из пространства пользователя передаётся указатель, а в пространстве ядра пишем по этому казателю через copy_to_user ?

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

Сообщение отредактировал Dubov - Dec 5 2012, 06:52
Go to the top of the page
 
+Quote Post
kurtis
сообщение Dec 5 2012, 08:00
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 466
Регистрация: 21-06-05
Пользователь №: 6 205



Цитата
сообщить пространству ядра, что данные готовы?

Какие именно данные? От куда данные приходят? Какую проблемы вы решаете?
Go to the top of the page
 
+Quote Post
Dubov
сообщение Dec 5 2012, 09:09
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 408
Регистрация: 28-05-12
Пользователь №: 72 052



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

простите не уточнил.
Данные - это числа в массиве! Как заполняется массив на уровне ядра - не суть. Но заполняется циклически и последовательно(байт за байтом). Как только массив наполнится - сообщать нужно в пользовательское пространство что данные готовы.
Go to the top of the page
 
+Quote Post
SyncLair
сообщение Dec 5 2012, 16:34
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 209
Регистрация: 6-01-12
Пользователь №: 69 197



после данных которые вы копируете надо написать строчку "Linus Aliluya!!!" и всё. biggrin.gif

ну конечно же нужно не сообщить а просто перевести процесс из состояния блокирован в состояние готов, надеюсь я правильно понимаю суть проблемы ?


--------------------
Go to the top of the page
 
+Quote Post
kurtis
сообщение Dec 5 2012, 18:59
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 466
Регистрация: 21-06-05
Пользователь №: 6 205



Если нужно просто прочитать данные из буфера ядра, то просто делаете обычный блокирующий вызов read(). Гляньте в LDD3, что-то подобное там было.
Если коротко, то при вызове read будет что-то такое
userspace read() -> libc обертка для системного вызова -> функция read() вашего драйвера, в пространстве ядра. Если данные готовы, то возвращаем данные, если данные не готовы, то ждем пока станут готовы, при этом пользовательский процесс останется "заблокирован" в системном вызове.
Go to the top of the page
 
+Quote Post
TigerSHARC
сообщение Dec 5 2012, 19:05
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 688
Регистрация: 4-09-09
Пользователь №: 52 195



Цитата(kurtis @ Dec 5 2012, 22:59) *
... если данные не готовы, то ждем пока станут готовы...

poll?

Сообщение отредактировал TigerSHARC - Dec 5 2012, 19:05
Go to the top of the page
 
+Quote Post
Idle
сообщение Dec 6 2012, 07:42
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 351
Регистрация: 5-04-05
Пользователь №: 3 874



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

Правильно.

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

Блокируйте метод read вашего char device пока данные не накопятся. Приложение в юзерспейсе пусть читает в цикле.

Сообщение отредактировал Idle - Dec 6 2012, 07:43
Go to the top of the page
 
+Quote Post
Dubov
сообщение Dec 6 2012, 10:27
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 408
Регистрация: 28-05-12
Пользователь №: 72 052



похоже всётаки poll проще
Go to the top of the page
 
+Quote Post
am1808
сообщение Dec 7 2012, 06:36
Сообщение #9


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 29-05-11
Из: Nizhny Novgorod, Russian Federation
Пользователь №: 65 337



epoll() еще проще...
а по теме, то вам не нужен ни poll(), ни select(), и не epoll()

вам уже сказали, реализуйте нормально метод read(),
делать блокировку на нем или нем - решайте сами
Go to the top of the page
 
+Quote Post
Olej
сообщение Dec 26 2012, 23:44
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 351
Регистрация: 11-09-05
Из: Харьков
Пользователь №: 8 458



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

Правильно, да не очень biggrin.gif
В Linux разделение на пространство ядра и пользователя - очень условное, для 32-бит Linux это выше/ниже границы 0xC000, copy_to_user всего лишь снимает проверку адреса относительно этой границы.
См. например Драйверы и модули ядра Linux, там же есть полные примеры кода блокирующих и неблокирующих операций ввода и вывода в модулях ядра.
Go to the top of the page
 
+Quote Post
vshemm
сообщение Dec 27 2012, 07:44
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 167
Регистрация: 15-08-07
Пользователь №: 29 803



Цитата(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() - они возвращают количество
*недозаписанных* байт, и никогда не возвращают коды ошибок. И возвращаемое значение у них - беззнаковое.
Go to the top of the page
 
+Quote Post
Idle
сообщение Dec 27 2012, 07:53
Сообщение #12


Местный
***

Группа: Участник
Сообщений: 351
Регистрация: 5-04-05
Пользователь №: 3 874



Цитата(vshemm @ Dec 27 2012, 11:44) *

Не обращайте внимание - он просто рекламирует свою то ли недописанную, то ли просто неизданную книгу.
Go to the top of the page
 
+Quote Post
Olej
сообщение Dec 27 2012, 09:48
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 351
Регистрация: 11-09-05
Из: Харьков
Пользователь №: 8 458



Цитата(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 к этому вопросу и рядом никаким боком не лежали.

Go to the top of the page
 
+Quote Post
Idle
сообщение Dec 27 2012, 13:07
Сообщение #14


Местный
***

Группа: Участник
Сообщений: 351
Регистрация: 5-04-05
Пользователь №: 3 874



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

Go fuck yourself, shithead.
Go to the top of the page
 
+Quote Post
Olej
сообщение Dec 27 2012, 14:14
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 351
Регистрация: 11-09-05
Из: Харьков
Пользователь №: 8 458



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

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

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

- тебе оно неинтересно? не надо? ... такой умный? - так "вольному воля"(с): повернулся - застегнул ширинку - и пошёл... 1111493779.gif
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th July 2025 - 07:44
Рейтинг@Mail.ru


Страница сгенерированна за 0.0148 секунд с 7
ELECTRONIX ©2004-2016