Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

中断中无法使用copy_to_user

13 views
Skip to first unread message

萨达姆

unread,
Feb 26, 2014, 6:22:19 AM2/26/14
to
使用linux内核编程,建立驱动程序

每次中断后会从外设得到一组数据,试图使用copy_to_user把数据从kernel区搬到user
区,但总是报错,后来查了一下,原因有二,(1)这个函数可能睡眠,但是中断不允许

眠;(2)可能会指向一个根本不相关的进程地址空间。

这个倒是很容易理解,只是有什么可以代替这个函数的东东吗?可以在中断中把数据拷贝
过去。。。
--

[36m※ 修改:·sadamu 于 Feb 26 19:22:19 2014 修改本文·[FROM: 125.77.219.*] [m
[m [36m※ 来源:·水木社区 http://newsmth.net·[FROM: 125.77.219.*] [m

穆尼亚因

unread,
Feb 26, 2014, 6:33:25 AM2/26/14
to
中断里你是怎么得到用户内存地址的???不可思议。
copy_to_user里操作的全部是用户页面,很多信号量操作

【 在 sadamu (萨达姆) 的大作中提到: 】
: 标 题: 中断中无法使用copy_to_user
: 发信站: 水木社区 (Wed Feb 26 19:21:35 2014), 转信
:
: 使用linux内核编程,建立驱动程序
--

[m [1;37m※ 来源:·水木社区 newsmth.net·[FROM: 60.166.58.*] [m

萨达姆

unread,
Feb 26, 2014, 6:41:30 AM2/26/14
to
中断的入口处传入了一个struct的指针,这个struct中的一项是用户内存地址,初始化的
时候写入的


【 在 Muniain (穆尼亚因) 的大作中提到: 】
: 中断里你是怎么得到用户内存地址的???不可思议。
: copy_to_user里操作的全部是用户页面,很多信号量操作

--

[m [37m※ 来源:·水木社区 http://newsmth.net·[FROM: 125.77.219.*] [m

穆尼亚因

unread,
Feb 26, 2014, 7:04:49 AM2/26/14
to
中断所使用的内存页面和用户内存页面都不一样,你的用户内存地址在isr里肯定是undefined的,怎么操作?这和read/write函数是不一样的。

【 在 sadamu (萨达姆) 的大作中提到: 】
: 标 题: Re: 中断中无法使用copy_to_user
: 发信站: 水木社区 (Wed Feb 26 19:41:30 2014), 转信
:
: 中断的入口处传入了一个struct的指针,这个struct中的一项是用户内存地址,初始化的

萨达姆

unread,
Feb 26, 2014, 7:35:39 AM2/26/14
to
刚才google了一下,确实如同你说的一样

那你知道可不可以在驱动的中断中使用memcpy把数据从内核空间的一个地方拷贝到另外一
个地方呢?如果可以的话,用户回头调用read读出数据就可以了



【 在 Muniain (穆尼亚因) 的大作中提到: 】
: 中断所使用的内存页面和用户内存页面都不一样,你的用户内存地址在isr里肯定是
undefined的,怎么操作?这和read/write函数是不一样的。

Noname

unread,
Feb 26, 2014, 9:59:55 PM2/26/14
to
你这个编程方式有问题,应该是在驱动的read函数里等待信号,然后中断了填缓冲,并且触发信号,让read函数取数据到用户态。

【 在 sadamu (萨达姆) 的大作中提到: 】
: 标 题: 中断中无法使用copy_to_user
: 发信站: 水木社区 (Wed Feb 26 19:21:35 2014), 转信
:
: 使用linux内核编程,建立驱动程序
:
: 每次中断后会从外设得到一组数据,试图使用copy_to_user把数据从kernel区搬到user
: 区,但总是报错,后来查了一下,原因有二,(1)这个函数可能睡眠,但是中断不允许
: 睡
: 眠;(2)可能会指向一个根本不相关的进程地址空间。
:
: 这个倒是很容易理解,只是有什么可以代替这个函数的东东吗?可以在中断中把数据拷贝
: 过去。。。
: --
:
: [36m※ 修改:·sadamu 于 Feb 26 19:22:19 2014 修改本文·[FROM: 125.77.219.*] [m
: [m [36m※ 来源:·水木社区 http://newsmth.net·[FROM: 125.77.219.*] [m


--

[m [1;34m※ 来源:·水木社区 newsmth.net·[FROM: 101.95.17.*] [m

Noname

unread,
Feb 26, 2014, 10:22:14 PM2/26/14
to
中断的时候,用户态的空间是随机的。看中断发生的时候当时在跑哪个进程

【 在 sadamu (萨达姆) 的大作中提到: 】
: 标 题: Re: 中断中无法使用copy_to_user
: 发信站: 水木社区 (Wed Feb 26 20:35:38 2014), 转信
:
: 刚才google了一下,确实如同你说的一样
:
: 那你知道可不可以在驱动的中断中使用memcpy把数据从内核空间的一个地方拷贝到另外一
: 个地方呢?如果可以的话,用户回头调用read读出数据就可以了
:
:
:
: 【 在 Muniain (穆尼亚因) 的大作中提到: 】
: : 中断所使用的内存页面和用户内存页面都不一样,你的用户内存地址在isr里肯定是
: undefined的,怎么操作?这和read/write函数是不一样的。
:
: --
:
: [m [37m※ 来源:·水木社区 http://newsmth.net·[FROM: 125.77.219.*] [m

穆尼亚因

unread,
Feb 26, 2014, 10:42:33 PM2/26/14
to
中断发生的时候,工作在中断上下文,user space完全是不可控的,是什么进程,根本不会知道

【 在 Brock (Noname) 的大作中提到: 】
: 中断的时候,用户态的空间是随机的。看中断发生的时候当时在跑哪个进程


--

[m [1;36m※ 来源:·水木社区 newsmth.net·[FROM: 60.166.58.*] [m

萨达姆

unread,
Feb 26, 2014, 11:10:57 PM2/26/14
to
这种方式是最容易想到的,但是现在问题是中断一次得到一帧数据,read一次要读出一万
帧数据,如果让read不停的读取,则用户空间的程序运行效率太低。

现在只能在内核中开辟一个大buffer,每次中断后从小buffer拷贝数据到内核的大
buffer,当大buffer数据积累到一定程度后,read函数读出




【 在 Brock (Noname) 的大作中提到: 】
: 你这个编程方式有问题,应该是在驱动的read函数里等待信号,然后等发生中断了填缓
冲,并且触发信号,让read函数取缓冲的数据到用户态。
: [36m※ 修改:·Brock 于 Feb 27 11:01:01 2014 修改本文·[FROM: 101.95.17.*] [m

--

[m [31m※ 来源:·水木社区 http://newsmth.net·[FROM: 120.42.101.*] [m

Noname

unread,
Feb 27, 2014, 12:27:30 AM2/27/14
to
还有个办法,你把用户态的内存锁住,然后映射到内核态空间

【 在 sadamu (萨达姆) 的大作中提到: 】
: 标 题: Re: 中断中无法使用copy_to_user
: 发信站: 水木社区 (Thu Feb 27 12:10:57 2014), 转信
:
: 这种方式是最容易想到的,但是现在问题是中断一次得到一帧数据,read一次要读出一万
0 new messages