|簡體中文

比思論壇

 找回密碼
 按這成為會員
搜索



查看: 612|回復: 2
打印 上一主題 下一主題

linux内核函数的调用

[複製鏈接]

989

主題

1

好友

5288

積分

教授

Rank: 8Rank: 8

  • TA的每日心情

    2024-9-18 07:17
  • 簽到天數: 1252 天

    [LV.10]以壇為家III

    推廣值
    2
    貢獻值
    378
    金錢
    1714
    威望
    5288
    主題
    989

    回文勇士 文明人 中學生 高中生 簽到勳章 簽到達人 男生勳章 大學生 文章勇士 附件高人 附件達人 文章達人 教授

    樓主
    發表於 2012-9-2 20:04:37
    内核函数间的调用有两种方法:

        1)、把需要调用的函数编译进模块,与C语言的静态库类似。

        2)、把需要调用的函数导出到符号表,方便模块使用,与C语言的动态库类似。

        hello.c

        #include <linux/module.h>

        #include <linux/init.h>

        #include "call.h"

        static int __init hello_init(void)

        {

        printk("hello world\n");

        call_fun();

        return 0;

        }

        static void __exit hello_exit(void)

        {

        printk("bye\n");

        }

        module_init(hello_init);

        module_exit(hello_exit);

        MODULE_LICENSE("GPL");

        MODULE_AUTHOR("ZackLee");

        MODULE_VERSION("1.0");

        call.c

        #include <linux/module.h>

        void call_fun(void)

        {

        printk("I'm call function\n");

        }

        //如果是导出符号表的方法,则需要以下代码

        EXPORT_SYMBOL(call_fun);

        MODULE_LICENSE("GPL");

        call.h

        #ifndef __CALL_H__

        #define __CALL_H__

        void call_fun(void);

        #endif

        静态法:

        Makefile

        obj-m := test.o

        test-objs :=hello.c call.c

        all:

        $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules

        clean:

        $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) clean

        动态法:

        Makefile

        obj-m := hello.o call.o

        all:

        $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules

        clean:

        $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) clean

        静态法直接make,生成test.ko,insmod即可

        动态法稍微麻烦一点。make生成hello.ko和call.ko,其实也可以分开make,没有顺序的要求,先生成hello.ko或者call.ko都可以。

        在没有加载时,cat /proc/kallsyms |grep call_fun,看不到任何东东。

        加载hello.ko,insmod hello.ko,会报错:insmod: error inserting 'hello.ko': -1 Unknown symbol in module。有未识别的symbol,即call_fun。所以需要先加载call.ko,insmod call.ko,加载成功。

        cat /proc/kallsyms |grep call_fun,打印出如下:

        f7c81050 r __ksymtab_call_fun   [call]

        f7c81058 r __kstrtab_call_fun   [call]

        说明内核已经识别出call_fun.

        lsmod |grep call

        call                     609  0

        这时加载hello.ko会成功,insmod hello.ko

        lsmod |grep call

        call                     609  1 hello

        表示call模块中有函数被hello模块引用

        先卸载call会失败,rmmod call,会报错:ERROR: Module call is in use by hello

        应该先卸载hello,rmmod hello,卸载成功。

        lsmod |grep call

        call                     609  0

        然后卸载call,rmmod call,卸载成功。

        cat /proc/kallsyms |grep call_fun 不会打印任何东东。
    重要聲明:本論壇是以即時上載留言的方式運作,比思論壇對所有留言的真實性、完整性及立場等,不負任何法律責任。而一切留言之言論只代表留言者個人意見,並非本網站之立場,讀者及用戶不應信賴內容,並應自行判斷內容之真實性。於有關情形下,讀者及用戶應尋求專業意見(如涉及醫療、法律或投資等問題)。 由於本論壇受到「即時上載留言」運作方式所規限,故不能完全監察所有留言,若讀者及用戶發現有留言出現問題,請聯絡我們比思論壇有權刪除任何留言及拒絕任何人士上載留言 (刪除前或不會作事先警告及通知 ),同時亦有不刪除留言的權利,如有任何爭議,管理員擁有最終的詮釋權。用戶切勿撰寫粗言穢語、誹謗、渲染色情暴力或人身攻擊的言論,敬請自律。本網站保留一切法律權利。

    手機版| 廣告聯繫

    GMT+8, 2024-9-28 03:19 , Processed in 0.051579 second(s), 25 queries , Gzip On.

    Powered by Discuz! X2.5

    © 2001-2012 Comsenz Inc.

    回頂部