调用linux内核模块的函数,从Linux内核模块中调用用户空间函数

我正在编写一个简单的Linux字符设备驱动程序,通过I / O端口将数据输出到一个硬件.我有一个函数执行浮点运算来计算硬件的正确输出;不幸的是,这意味着我需要在用户空间中保留此功能,因为Linux内核不能很好地处理浮点运算.

这是设置的伪表示(请注意,此代码不执行任何特定操作,它只显示我的代码的相对布局):

char calculate_output(char x){

double y = 2.5*x;

double z = sqrt(y);

char output = 0xA3;

if(z > 35.67){

output = 0xC0;

}

return output;

}

内核空间代码:

unsigned i;

for(i = 0; i < 300; i++){

if(inb(INPUT_PORT) & NEED_DATA){

char seed = inb(SEED_PORT);

char output = calculate_output(seed);

outb(output,OUTPUT_PORT);

}

/* do some random stuff here */

}

我想过使用ioctl传递来自userspace函数的数据,但是我不知道如何处理函数调用处于循环中并且在下一次调用calculate_output之前执行更多代码的事实.

我设想这个工作的方式是:

>主用户空间程序将启动内核空间代码(可能通过ioctl)

> userspace程序块并等待内核空间代码

> kernelspace程序向用户空间程序询问输出数据,并阻塞等待

> userspace program解锁,计算和发送数据(ioctl?),然后再次阻塞

> kernelspace程序解除阻塞并继续

> kernelspace程序完成并通知用户空间

> userspace解除阻止并继续执行下一个任务

那么我如何在内核空间和用户空间之间进行通信,并且还具有阻塞功能,以便我不会让用户空间不断轮询设备文件以查看是否需要发送数据?

需要注意的是:虽然定点算法在我的示例代码中可以很好地工作,但它不是实际代码中的一个选项;我需要浮点提供的大范围 – 即使不是 – 我害怕重写代码以使用定点算法会混淆未来维护者的算法.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值