我觉得最简单的解决方案是在内核驱动程序中创建一个字符设备,使用您自己的虚拟文件文件操作.之后用户空间可以打开此设备O_RDWR.您必须实现两个主要文件操作:
>read–这是内核将数据传递回用户空间的方法.此函数在调用read()调用的用户空间线程的上下文中运行,在您的情况下linux内核调用应用程序,它应当阻塞,直至内核具有须要晓得输出的另一个种子值.
>write–这是用户空间将数据传递到内核的形式.在您的情况下,内核只会对原本的读取进行响应并将其传递给硬件.
之后你最终在用户空间中使用一个简单的循环:
while (1) {
read(fd,buf,sizeof buf);
calculate_output(buf,output);
write(fd,output,sizeof output);
}
内核中根本没有循环–一切都在驱动事物的用户空间进程的上下文中运行,而内核驱动程序只负责将数据移入/移出硬件.
按照你在内核方面的“做一些随机的东西”,你可能不可能如此简单.假如你真的须要内核循环,这么你须要创建一个内核线程来运行该循环,之后在input_datalinux系统装win7,input_ready,output_data和output_ready的行中包含一些变量,以及一些等待和你须要的任何锁定.
当内核线程读取数据时,将数据装入input_ready并设置input_ready标志并发出输入waitqueue讯号linux内核调用应用程序,之后执行wait_event().读取文件操作将执行wait_event()并在数据打算就绪时将数据返回给用户空间.类似地puppy linux,写文件操作会将从用户空间获取的数据装入output_data并设置output_ready并向输出waitqueue发出讯号.
另一种(更丑恶,更不便携)的方式是使用像ioperm,iopl或/dev/port这样的东西来完成用户空间中的所有操作,包括低级硬件访问.
本文原创地址://gulass.cn/clnhmkzdyyhk.html编辑:刘遄,审核员:暂无