討論區快速選單
知識庫快速選單
政府補助!學嵌入式+物聯網 軟體開發過程中有哪些資安漏洞?
[ 回上頁 ] [ 討論區發言規則 ]
Linux driver 中使用浮點樹運算
更改我的閱讀文章字型大小
作者 : hst326(duck)
[ 貼文 44 | 人氣 1 | 評價 30 | 評價/貼文 0.68 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2010/7/30 上午 10:36:46
目前我正在練習修改 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:26:38
我自己先用簡單的程式測試一下,

發現 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:26:45
我自己先用簡單的程式測試一下,

發現 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:27:35
以下是我的 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
###########################################################################
 板主 : maple-leaf
 > UNIX - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - UNIX - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
UNIX
1 Anderson 1130 
2 old cat 450 
3 maple-leaf 420 
4 MooCow 310 
5 又改暱稱 290 
6 青衫 200 
7 sazabi 200 
8 member one 200 
9 愛睏魚 190 
10 pail 160 
UNIX
  專家等級 評價  
  一代宗師 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