|
копирование в пространство пользователя, из ядра |
|
|
|
Dec 5 2012, 08:00
|
Местный
  
Группа: Свой
Сообщений: 466
Регистрация: 21-06-05
Пользователь №: 6 205

|
Цитата сообщить пространству ядра, что данные готовы? Какие именно данные? От куда данные приходят? Какую проблемы вы решаете?
|
|
|
|
|
Dec 5 2012, 09:09
|
Местный
  
Группа: Участник
Сообщений: 408
Регистрация: 28-05-12
Пользователь №: 72 052

|
Цитата(kurtis @ Dec 5 2012, 12:00)  Какие именно данные? От куда данные приходят? Какую проблемы вы решаете? простите не уточнил. Данные - это числа в массиве! Как заполняется массив на уровне ядра - не суть. Но заполняется циклически и последовательно(байт за байтом). Как только массив наполнится - сообщать нужно в пользовательское пространство что данные готовы.
|
|
|
|
|
Dec 6 2012, 07:42
|
Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
|
Dec 26 2012, 23:44
|
Местный
  
Группа: Свой
Сообщений: 351
Регистрация: 11-09-05
Из: Харьков
Пользователь №: 8 458

|
Цитата(Dubov @ Dec 5 2012, 10:52)  Правильно ли я понимаю, что запись из ядра(например при возникновении события/прерывания) осуществлется так: из пространства пользователя передаётся указатель, а в пространстве ядра пишем по этому казателю через copy_to_user ? Правильно, да не очень В Linux разделение на пространство ядра и пользователя - очень условное, для 32-бит Linux это выше/ниже границы 0xC000, copy_to_user всего лишь снимает проверку адреса относительно этой границы. См. например Драйверы и модули ядра Linux, там же есть полные примеры кода блокирующих и неблокирующих операций ввода и вывода в модулях ядра.
|
|
|
|
|
Dec 27 2012, 07:44
|
Частый гость
 
Группа: Участник
Сообщений: 167
Регистрация: 15-08-07
Пользователь №: 29 803

|
Цитата(Olej @ Dec 27 2012, 03:44)  Правильно, да не очень В 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() - они возвращают количество *недозаписанных* байт, и никогда не возвращают коды ошибок. И возвращаемое значение у них - беззнаковое.
|
|
|
|
|
Dec 27 2012, 07:53
|
Местный
  
Группа: Участник
Сообщений: 351
Регистрация: 5-04-05
Пользователь №: 3 874

|
Цитата(vshemm @ Dec 27 2012, 11:44)  Не обращайте внимание - он просто рекламирует свою то ли недописанную, то ли просто неизданную книгу.
|
|
|
|
|
Dec 27 2012, 09:48
|
Местный
  
Группа: Свой
Сообщений: 351
Регистрация: 11-09-05
Из: Харьков
Пользователь №: 8 458

|
Цитата(Idle @ Dec 27 2012, 11:53)  Не обращайте внимание - он просто рекламирует свою то ли недописанную, то ли просто неизданную книгу. Дурачок юный, если ты разуешь глаза и перестанешь петь самолюбуясь как тетерев на току, то обнаружишь: там элементарно нет никакой рекламы, ни единого рекламного банера, и сайты эти не имеют ко мне никакого касательства... и за пользование с тебя не просят ни копейки. Это конспект курса лекций, прочитанных по заказу в крупной международной компании (GlobalLogic) специализирующейся на разработке ПО (>3000 разработчиков по миру). И IBM считает это материал адекватным для публикации большой серией статей среди своих постоянных авторов. Этот материал не нужно дописывать, издавать... Он выставлен для свободного пользования теми, кому это понадобится. ... а не для тех, кто только рот открывает.  Цитата(vshemm @ Dec 27 2012, 11:44)  З.Ы. В книге на с.43 неверно определена семантика copy_to/from_user() - они возвращают количество *недозаписанных* байт, и никогда не возвращают коды ошибок. И возвращаемое значение у них - беззнаковое. То что неправильно указали - может быть, это спасибо что указали, и я пересмотрю и перепроверю. А во всём остальном... : зачэ-э-э-э-м так много пысал? Никого я не собирался "пугать": Цитата(vshemm @ Dec 27 2012, 11:44)  Опять фигню пишете и путаете народ.
Во-первых, разделение на пространство ядра/пользователя очень не условное, и логика работы с памятью в этих пространствах различается кардинально. Настолько, что ванильное ядро не работает без MMU (а еще есть ZONE_HIGHMEM, NUMA и пр. извраты). ... Всё, что так много написано - к существу дела на практике (обмена драйвера с юзерспейс) не имеет никакого касательства, написано "лишь бы поговорить"... никакие "извраты", ZONE_HIGHMEM и NUMA к этому вопросу и рядом никаким боком не лежали.
|
|
|
|
|
Dec 27 2012, 13:07
|
Местный
  
Группа: Участник
Сообщений: 351
Регистрация: 5-04-05
Пользователь №: 3 874

|
Цитата(Olej @ Dec 27 2012, 13:48)  Дурачок юный, если ты разуешь глаза и перестанешь петь самолюбуясь как тетерев на току, то обнаружишь: там элементарно нет никакой рекламы, ни единого рекламного банера, и сайты эти не имеют ко мне никакого касательства... и за пользование с тебя не просят ни копейки. Go fuck yourself, shithead.
|
|
|
|
|
Dec 27 2012, 14:14
|
Местный
  
Группа: Свой
Сообщений: 351
Регистрация: 11-09-05
Из: Харьков
Пользователь №: 8 458

|
Цитата(Idle @ Dec 27 2012, 17:07)  Go fuck yourself, shithead. Я ещё раз повторю для самых тупых (вы спрашивайте, спрашивайте...  ): - это написано для тех, кому это может понадобиться, кому захочется ... могут считать это подарком к Новому Году. - тебе оно неинтересно? не надо? ... такой умный? - так "вольному воля"(с): повернулся - застегнул ширинку - и пошёл...
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|