Перейти к содержанию
    

копирование в пространство пользователя

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

из пространства пользователя передаётся указатель, а в пространстве ядра пишем по этому казателю через copy_to_user ?

 

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

Изменено пользователем Dubov

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Какие именно данные? От куда данные приходят? Какую проблемы вы решаете?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Какие именно данные? От куда данные приходят? Какую проблемы вы решаете?

простите не уточнил.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если нужно просто прочитать данные из буфера ядра, то просто делаете обычный блокирующий вызов read(). Гляньте в LDD3, что-то подобное там было.

Если коротко, то при вызове read будет что-то такое

userspace read() -> libc обертка для системного вызова -> функция read() вашего драйвера, в пространстве ядра. Если данные готовы, то возвращаем данные, если данные не готовы, то ждем пока станут готовы, при этом пользовательский процесс останется "заблокирован" в системном вызове.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

... если данные не готовы, то ждем пока станут готовы...

poll?

Изменено пользователем TigerSHARC

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Правильно ли я понимаю, что запись из ядра

Правильно.

 

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

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

Изменено пользователем Idle

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

epoll() еще проще...

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

 

вам уже сказали, реализуйте нормально метод read(),

делать блокировку на нем или нем - решайте сами

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

из пространства пользователя передаётся указатель, а в пространстве ядра пишем по этому казателю через copy_to_user ?

Правильно, да не очень :biggrin:

В Linux разделение на пространство ядра и пользователя - очень условное, для 32-бит Linux это выше/ниже границы 0xC000, copy_to_user всего лишь снимает проверку адреса относительно этой границы.

См. например Драйверы и модули ядра Linux, там же есть полные примеры кода блокирующих и неблокирующих операций ввода и вывода в модулях ядра.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Правильно, да не очень :biggrin:

В 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() - они возвращают количество

*недозаписанных* байт, и никогда не возвращают коды ошибок. И возвращаемое значение у них - беззнаковое.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не обращайте внимание - он просто рекламирует свою то ли недописанную, то ли просто неизданную книгу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не обращайте внимание - он просто рекламирует свою то ли недописанную, то ли просто неизданную книгу.

 

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

 

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

И IBM считает это материал адекватным для публикации большой серией статей среди своих постоянных авторов.

Этот материал не нужно дописывать, издавать...

Он выставлен для свободного пользования теми, кому это понадобится.

 

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

 

З.Ы. В книге на с.43 неверно определена семантика copy_to/from_user() - они возвращают количество

*недозаписанных* байт, и никогда не возвращают коды ошибок. И возвращаемое значение у них - беззнаковое.

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

 

А во всём остальном... : зачэ-э-э-э-м так много пысал? :1111493779:

Никого я не собирался "пугать":

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

 

Во-первых, разделение на пространство ядра/пользователя очень не условное, и логика работы с памятью

в этих пространствах различается кардинально. Настолько, что ванильное ядро не работает без MMU (а

еще есть ZONE_HIGHMEM, NUMA и пр. извраты).

...

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Go fuck yourself, shithead.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Go fuck yourself, shithead.

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

 

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

 

- тебе оно неинтересно? не надо? ... такой умный? - так "вольному воля"(с): повернулся - застегнул ширинку - и пошёл... :1111493779:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...