討論區快速選單
知識庫快速選單
網路投保旅行平安險 網路投保旅行平安險
[ 回上頁 ] [ 討論區發言規則 ]
Linux driver 中使用浮點數運算
更改我的閱讀文章字型大小
作者 : hst326(duck)
[ 貼文 44 | 人氣 1 | 評價 30 | 評價/貼文 0.68 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2010/7/30 下午 02:34:35
在 Linux 版發過這問題,感覺這邊比較適合問,
所以在這再問一次,如有不妥請見諒。

目前我正在練習修改 linux device driver 的 source code,

發現有使用 "浮點數"運算的code,在build完module後會有一堆WARNING

而且在 insmod 會失敗,用dmesg看到: Uknown symbol __xxxx

__xxx 大致上都是跟浮點數運算相關的。

我的問題是:

1. Linux device driver 是否不允許做 FP math ?

2. 如果允許 FP math,那我應該怎麼做才可以順利把 module 載入kernel ?

3. 如果不允許 FP math ,我應該如何修改我的code?
    (除了把 FP math 改成整數運算的方式,因為用到 FP math 的地方還蠻多的)

有相關經驗的,可以不吝分享一下方法嗎? 感謝
作者 : hst326(duck)
[ 貼文 44 | 人氣 1 | 評價 30 | 評價/貼文 0.68 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2010/7/30 下午 02:35:04
我自己先用簡單的程式測試一下,

發現 function 中是可以做浮點數運算,

但如果做浮點數運算的 " 變數 " 是另一個 function 傳來的,這樣就會出錯。

以下是我做的測試:

1. function 內做浮點數運算,不對傳來參數 q 做 FP math,
   可以正確用 insmod 載入 kernel

//////////////////////// sample code ///////////////////////////////////
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <asm/i387.h>

MODULE_LICENSE("Dual BSD/GPL");

void MyFloatFunction(double q)
{
// kernel_fpu_begin();
double a = 2.135792;
double b = 5.24453;
//q = q*a/b;
printk(KERN_ALERT "MyFloatFunction: q = %d \n", (int)(b/a) );
// kernel_fpu_end();
}

static int hello_init(void)
{
printk(KERN_ALERT "Hello, world");
// kernel_fpu_begin();
MyFloatFunction(333);
// kernel_fpu_end();
return 0;
}

static void hello_exit(void)
{
printk(KERN_ALERT "Goodbye, cruel world\n");
}

module_init(hello_init);
module_exit(hello_exit);
///////////////////////////////////////////////////////////////////////////////////////////////

2. function 內做浮點數運算,對傳來參數 q 做 FP math,
   無法用 insmod 載入 kernel,會出現 Unknown symbol __divdf3, Unknown symbol __muldf3, ....

//////////////////////// sample code ///////////////////////////////////
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <asm/i387.h>

MODULE_LICENSE("Dual BSD/GPL");

void MyFloatFunction(double q)
{
// kernel_fpu_begin();
double a = 2.135792;
double b = 5.24453;
q = q*a/b;
printk(KERN_ALERT "MyFloatFunction: q = %d \n", (int)q );
// kernel_fpu_end();
}

static int hello_init(void)
{
printk(KERN_ALERT "Hello, world");
// kernel_fpu_begin();
MyFloatFunction(333);
// kernel_fpu_end();
return 0;
}

static void hello_exit(void)
{
printk(KERN_ALERT "Goodbye, cruel world\n");
}

module_init(hello_init);
module_exit(hello_exit);
///////////////////////////////////////////////////////////////////////////////////////////////
作者 : hst326(duck)
[ 貼文 44 | 人氣 1 | 評價 30 | 評價/貼文 0.68 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2010/7/30 下午 02:35:48
以下是我的 Makefile,KERNEL_VERSION 請改成你自己的版本

####################################################
# MyHello Makefile sample

KERNEL_VERSION := linux-headers-2.6.32-24-generic
KERNEL_DIR := /usr/src/$(KERNEL_VERSION)
INSTALL_MOD_DIR :=/lib/modules/$(uname -r)/kernel/drivers/MyTestDriver
 
PWD := $(shell pwd)

obj-m := hello.o

hello:
@echo "Building My Test driver..."

@(make -C $(KERNEL_DIR) M=$(PWD) ARCH=x86 CROSS_COMPILE=$(CROSS_COMPILE) modules)

install:
@echo "Installing My Test driver..."
@(make -C $(KERNEL_DIR) M=$(PWD) INSTALL_MOD_DIR=$(INSTALL_MOD_DIR) INSTALL_MOD_PATH=$(INSTALL_MOD_PATH) modules_install)

clean:
-rm -f *.o *.ko .*.cmd .*.flags *.mod.c Module.symvers version.h modules.order
-rm -rf .tmp_versions
###########################################################################

 板主 : 徵求中
 > 驅動程式 - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - 驅動程式 - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
驅動程式
1 新兵衛 1240 
2 eBoy 980 
3 牧童哥 780 
4 北極熊 580 
5 天行者 580 
6 燒酒仙 440 
7 weber 380 
8 KEN 350 
9 jonay 180 
10 掌握文武半邊天 180 
驅動程式
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.046875