Цитата(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() - они возвращают количество
*недозаписанных* байт, и никогда не возвращают коды ошибок. И возвращаемое значение у них - беззнаковое.