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

 
 
> копирование в пространство пользователя, из ядра
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
 
Start new topic
Ответов
Olej
сообщение Dec 26 2012, 23:44
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 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
Сообщение #3


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

Группа: Участник
Сообщений: 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
Сообщение #4


Местный
***

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



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

Не обращайте внимание - он просто рекламирует свою то ли недописанную, то ли просто неизданную книгу.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Dubov   копирование в пространство пользователя   Dec 5 2012, 06:52
- - kurtis   Цитатасообщить пространству ядра, что данные готов...   Dec 5 2012, 08:00
|- - Dubov   Цитата(kurtis @ Dec 5 2012, 12:00) Какие ...   Dec 5 2012, 09:09
- - SyncLair   после данных которые вы копируете надо написать ст...   Dec 5 2012, 16:34
- - kurtis   Если нужно просто прочитать данные из буфера ядра,...   Dec 5 2012, 18:59
|- - TigerSHARC   Цитата(kurtis @ Dec 5 2012, 22:59) ... ес...   Dec 5 2012, 19:05
- - Idle   Цитата(Dubov @ Dec 5 2012, 10:52) Правиль...   Dec 6 2012, 07:42
- - Dubov   похоже всётаки poll проще   Dec 6 2012, 10:27
- - am1808   epoll() еще проще... а по теме, то вам не нужен ни...   Dec 7 2012, 06:36
|- - Olej   Цитата(Idle @ Dec 27 2012, 11:53) Не обра...   Dec 27 2012, 09:48
|- - Idle   Цитата(Olej @ Dec 27 2012, 13:48) Дурачок...   Dec 27 2012, 13:07
|- - Olej   Цитата(Idle @ Dec 27 2012, 17:07) Go fuck...   Dec 27 2012, 14:14
- - vshemm   IBM developerworks известен своими "серьезным...   Dec 27 2012, 17:03
- - Idle   Цитата(vshemm @ Dec 27 2012, 21:03) По к...   Dec 27 2012, 17:40
- - Dubov   Цитата(vshemm @ Dec 27 2012, 21:03) По ка...   Dec 28 2012, 06:09
- - Idle   Цитата(Dubov @ Dec 28 2012, 10:09) Это я...   Dec 28 2012, 06:55


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

 


RSS Текстовая версия Сейчас: 23rd August 2025 - 19:23
Рейтинг@Mail.ru


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