内核符号表是内核中一个全局的总表,这个表中声明了一些全局的函数。内核中的驱动程序只需要用 extern 声明后就可以直接调用这些函数了。

查看内核中的符号表:

cat /proc/kallsyms

将一个函数声明到内核符号表中去:

cacu_drv.c:

#include<linux/init.h>
#include<linux/module.h>
#include<linux/kernel.h>//一个加法函数
long add_integer(int a,int b)
{return a+b;
}
//将这个函数声明到内核符号表中
EXPORT_SYMBOL(add_integer);//一个减法函数
long sub_integer(int a,int b)
{return a-b;
}
//将这个函数声明到内核符号表中去
EXPORT_SYMBOL(sub_integer);//入口函数
static int __init cacu_module_init(void)
{printk("cacu module init\n");return 0;
}//出口函数
static void __exit cacu_module_exit(void)
{printk("cacu module exit\n");
}//驱动程序入口
module_init(cacu_module_init);
//驱动程序出口
module_exit(cacu_module_exit);MODULE_LICENSE("GPL");

在另一个模块中调用:

hello_drv.c:

#include<linux/kernel.h>
#include<linux/init.h>
#include<linux/module.h>//声明加法函数
extern long add_integer(int a,int b);
//声明减法函数
extern long sub_integer(int a,int b);//入口函数
static int __init hello_init(void)
{printk("hello module init\n");printk("200+100=%ld\n",add_integer(200,100));printk("200-100=%ld\n",sub_integer(200,100));return 0;
}//出口函数
static void __exit hello_exit(void)
{printk("hello module exit\n");
}//驱动程序入口
module_init(hello_init);
//驱动程序出口
module_exit(hello_exit);MODULE_LICENSE("GPL");

运行结果:

需要说明的是:

hello_drv.ko中用到的两个函数add_integer和sub_integer在cacu_drv.ko插入到内核中之前是不可用的。

因此必须先安装cacu_drv.ko 然后再安装hello_drv.ko

可以看到程序正常运行并计算出了结果

在卸载驱动时,由于hello_drv.ko中使用了cacu_drv.ko中的函数,因此在卸载时必须先卸载cacu_drv.ko

Linux驱动开发(二)内核符号表相关推荐

  1. LINUX驱动开发(二)GPIO驱动框架

    1. 驱动框架 pinctrl子系统+gpio子系统+设备树+platform总线. pinctrl子系统重点在设置引脚复用,gpio子系统用于初始化引脚. Linxu提供总线-设备-驱动模型,用于将 ...

  2. linux驱动开发扩展--内核启动logo

    static struct logo_data {int depth;int needs_directpalette;int needs_truepalette;int needs_cmapreset ...

  3. Linux 驱动开发 二十八:读写锁

    参考博客:Linux 内核同步(三):读-写自旋锁(rwlock)_StephenZhou-CSDN博客_linux rwlock 使用 spinlock 保护临界区时,多个读之间无法并发,只能被 s ...

  4. linux驱动开发之内核线程

    内核经常需要在后台执行一些操作,这种任务就可以通过内核线程(kernle thread)完成--独立运行在内核空间的标准进程.内核线程和普通的进程间的区别在于内核线程没有独立的地址空间,mm指针被设置 ...

  5. [Linux驱动开发五]实现ioctl函数

    目录 一.前言 1.1 ioctl用来做什么? 1.2 ioctl和unlock_ioctl区别? (1)ioctl()主要用于应用层系统调用 (2)unlock_ioctl主要用于驱动层系统调用 1 ...

  6. 嵌入式linux驱动开发实战教程,嵌入式Linux驱动开发实战视频教程

    嵌入式Linux驱动开发实战教程(内核驱动.看门狗技术.触摸屏.视频采集系统) 适合人群:高级 课时数量:109课时 用到技术:嵌入式 Linux 涉及项目:驱动开发.看门狗技术.触摸屏.视频采集 咨 ...

  7. i.MX 6ULL 驱动开发 二十九:向 Linux 内核中添加自己编写驱动

    一.概述 Linux 内核编译流程如下: 1.配置 Linux 内核. 2.编译 Linux 内核. 说明:进入 Linux 内核源码,使用 make help 参看相关配置. 二.make menu ...

  8. Linux驱动开发必看详解神秘内核(完全转载)

    Linux驱动开发必看详解神秘内核 完全转载-链接:http://blog.chinaunix.net/uid-21356596-id-1827434.html IT168 技术文档]在开始步入Lin ...

  9. Linux驱动开发(十五)---如何使用内核现有驱动(显示屏)

    前文回顾 <Linux驱动开发(一)-环境搭建与hello world> <Linux驱动开发(二)-驱动与设备的分离设计> <Linux驱动开发(三)-设备树> ...

最新文章

  1. 彻底解决windows2003不能共享文件夹或者共享后不能访问的问题
  2. 支持javascript的ppt软件_github重磅推荐!一个很好用的PPT生成工具
  3. mysql 分组查出来横向展示_Mysql探索(一):B+Tree索引
  4. 谨慎用药!这些药千万不能混在一起吃
  5. JSON –拯救杰克逊
  6. php 堵塞 消息队列,PHP的并发处理
  7. python调用jenkinsAPI构建jenkins,并传递参数
  8. 【C#夯实】我与接口二三事:IEnumerable、IQueryable 与 LINQ
  9. (转)海外基金销售新模式 机器人投顾与人工相结合
  10. python 爬取全国统计用区划代码和城乡划分代码
  11. 配置alexa skill(二)
  12. 电脑返回,电脑返回上一步快捷键(ctrl加什么是返回上一步)
  13. 微信游戏奇迹暖暖选取服务器失败,奇迹暖暖微信怎么登录失败
  14. uniapp扭蛋抽奖
  15. SAP 详细分析BOM物料清单
  16. sql语句存储过程的写法(mysql和java)
  17. QQ邮箱如何获得邮我代码
  18. Java -version 检查Java版本信息
  19. hard example mining(困难样本挖掘)
  20. Spring 5-代理和AOP 笔记

热门文章

  1. 7-1 约瑟夫环问题-hebust (10 分)
  2. matlab实验思考,MATLAB实验.doc
  3. RS-485电路设计及接口防护
  4. 哈尔滨工业大学 计算机系教授,哈尔滨工业大学计算机科学与技术学院导师简介:张田文...
  5. 【f1c200s/f1c100s】使用genimage工具制作img系统镜像
  6. excel填充遇到的坑
  7. VC++6.0 MSDN下载地址
  8. powerdns 系列之二 PowerDNS Authoritative Server
  9. 算法训练:嘘,别人我不告诉TA
  10. 使用Spring Security Oauth2 和 JWT保护微服务--资源服务器的编写