Dubov 0 5 декабря, 2012 Опубликовано 5 декабря, 2012 (изменено) · Жалоба Правильно ли я понимаю, что запись из ядра(например при возникновении события/прерывания) осуществлется так: из пространства пользователя передаётся указатель, а в пространстве ядра пишем по этому казателю через copy_to_user ? Но я не понимаю как сообщить пространству ядра, что данные готовы? или просто отобразить буфер пространства ядра в пользовательское пространство через mmap и тогда что пишем в ядре будет и в юзерспейс писаться сразу? Изменено 5 декабря, 2012 пользователем Dubov Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kurtis 0 5 декабря, 2012 Опубликовано 5 декабря, 2012 · Жалоба сообщить пространству ядра, что данные готовы? Какие именно данные? От куда данные приходят? Какую проблемы вы решаете? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dubov 0 5 декабря, 2012 Опубликовано 5 декабря, 2012 · Жалоба Какие именно данные? От куда данные приходят? Какую проблемы вы решаете? простите не уточнил. Данные - это числа в массиве! Как заполняется массив на уровне ядра - не суть. Но заполняется циклически и последовательно(байт за байтом). Как только массив наполнится - сообщать нужно в пользовательское пространство что данные готовы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SyncLair 0 5 декабря, 2012 Опубликовано 5 декабря, 2012 · Жалоба после данных которые вы копируете надо написать строчку "Linus Aliluya!!!" и всё. ну конечно же нужно не сообщить а просто перевести процесс из состояния блокирован в состояние готов, надеюсь я правильно понимаю суть проблемы ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kurtis 0 5 декабря, 2012 Опубликовано 5 декабря, 2012 · Жалоба Если нужно просто прочитать данные из буфера ядра, то просто делаете обычный блокирующий вызов read(). Гляньте в LDD3, что-то подобное там было. Если коротко, то при вызове read будет что-то такое userspace read() -> libc обертка для системного вызова -> функция read() вашего драйвера, в пространстве ядра. Если данные готовы, то возвращаем данные, если данные не готовы, то ждем пока станут готовы, при этом пользовательский процесс останется "заблокирован" в системном вызове. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TigerSHARC 0 5 декабря, 2012 Опубликовано 5 декабря, 2012 (изменено) · Жалоба ... если данные не готовы, то ждем пока станут готовы... poll? Изменено 5 декабря, 2012 пользователем TigerSHARC Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Idle 0 6 декабря, 2012 Опубликовано 6 декабря, 2012 (изменено) · Жалоба Правильно ли я понимаю, что запись из ядра Правильно. Но я не понимаю как сообщить пространству ядра, что данные готовы? Блокируйте метод read вашего char device пока данные не накопятся. Приложение в юзерспейсе пусть читает в цикле. Изменено 6 декабря, 2012 пользователем Idle Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dubov 0 6 декабря, 2012 Опубликовано 6 декабря, 2012 · Жалоба похоже всётаки poll проще Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
am1808 0 7 декабря, 2012 Опубликовано 7 декабря, 2012 · Жалоба epoll() еще проще... а по теме, то вам не нужен ни poll(), ни select(), и не epoll() вам уже сказали, реализуйте нормально метод read(), делать блокировку на нем или нем - решайте сами Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Olej 0 26 декабря, 2012 Опубликовано 26 декабря, 2012 · Жалоба Правильно ли я понимаю, что запись из ядра(например при возникновении события/прерывания) осуществлется так: из пространства пользователя передаётся указатель, а в пространстве ядра пишем по этому казателю через copy_to_user ? Правильно, да не очень В Linux разделение на пространство ядра и пользователя - очень условное, для 32-бит Linux это выше/ниже границы 0xC000, copy_to_user всего лишь снимает проверку адреса относительно этой границы. См. например Драйверы и модули ядра Linux, там же есть полные примеры кода блокирующих и неблокирующих операций ввода и вывода в модулях ядра. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vshemm 0 27 декабря, 2012 Опубликовано 27 декабря, 2012 · Жалоба Правильно, да не очень В 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 0 27 декабря, 2012 Опубликовано 27 декабря, 2012 · Жалоба Не обращайте внимание - он просто рекламирует свою то ли недописанную, то ли просто неизданную книгу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Olej 0 27 декабря, 2012 Опубликовано 27 декабря, 2012 · Жалоба Не обращайте внимание - он просто рекламирует свою то ли недописанную, то ли просто неизданную книгу. Дурачок юный, если ты разуешь глаза и перестанешь петь самолюбуясь как тетерев на току, то обнаружишь: там элементарно нет никакой рекламы, ни единого рекламного банера, и сайты эти не имеют ко мне никакого касательства... и за пользование с тебя не просят ни копейки. Это конспект курса лекций, прочитанных по заказу в крупной международной компании (GlobalLogic) специализирующейся на разработке ПО (>3000 разработчиков по миру). И IBM считает это материал адекватным для публикации большой серией статей среди своих постоянных авторов. Этот материал не нужно дописывать, издавать... Он выставлен для свободного пользования теми, кому это понадобится. ... а не для тех, кто только рот открывает. :1111493779: З.Ы. В книге на с.43 неверно определена семантика copy_to/from_user() - они возвращают количество *недозаписанных* байт, и никогда не возвращают коды ошибок. И возвращаемое значение у них - беззнаковое. То что неправильно указали - может быть, это спасибо что указали, и я пересмотрю и перепроверю. А во всём остальном... : зачэ-э-э-э-м так много пысал? :1111493779: Никого я не собирался "пугать": Опять фигню пишете и путаете народ. Во-первых, разделение на пространство ядра/пользователя очень не условное, и логика работы с памятью в этих пространствах различается кардинально. Настолько, что ванильное ядро не работает без MMU (а еще есть ZONE_HIGHMEM, NUMA и пр. извраты). ... Всё, что так много написано - к существу дела на практике (обмена драйвера с юзерспейс) не имеет никакого касательства, написано "лишь бы поговорить"... никакие "извраты", ZONE_HIGHMEM и NUMA к этому вопросу и рядом никаким боком не лежали. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Idle 0 27 декабря, 2012 Опубликовано 27 декабря, 2012 · Жалоба Дурачок юный, если ты разуешь глаза и перестанешь петь самолюбуясь как тетерев на току, то обнаружишь: там элементарно нет никакой рекламы, ни единого рекламного банера, и сайты эти не имеют ко мне никакого касательства... и за пользование с тебя не просят ни копейки. Go fuck yourself, shithead. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Olej 0 27 декабря, 2012 Опубликовано 27 декабря, 2012 · Жалоба Go fuck yourself, shithead. Я ещё раз повторю для самых тупых (вы спрашивайте, спрашивайте... ): - это написано для тех, кому это может понадобиться, кому захочется ... могут считать это подарком к Новому Году. :santa2: - тебе оно неинтересно? не надо? ... такой умный? - так "вольному воля"(с): повернулся - застегнул ширинку - и пошёл... :1111493779: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться