linux内核导出符号

   linux 2.6 系统的"/proc/kallsyms"文件对应着内核符号表,它记录了符号以及符号所在的内存地址。

模块可以使用如下宏导出符号到内核符号表:

EXPORT_SYMBOL(符号名);

EXPORT_SYMBOL_GPL(符号名);     //只适用于包含GPL许可权的模块;

符号必须在模块文件的全局部分导出,不能在函数中导出,这是因为上述这两个宏将被扩展成一个特殊用途的声明,而该变量必须是全局的。

使用方法:

1.在模块函数或符号定义后使用EXPORT_SYMOL_GPL(符号名);

2.在调用的模块中使用extern声明与之对应;

3.必须保证被调用的符号所在模块已被加载;

举例说明下,比如我们要使用driver/char/pwm.c中的变量pwm_dev及函数pwm_set_duty_cycle(),如下所示:

  1. struct pwm_dev pwm_dev = {  
  2.     .id = 11,  
  3.     .mux_offset = GPT11_MUX_OFFSET,  
  4. };  
  5. EXPORT_SYMBOL_GPL(pwm_dev);  


  1. int pwm_set_duty_cycle(struct pwm_dev *pd, u32 duty_cycle)  
  2. {  
  3.     u32 new_tmar;  
  4.   
  5.     if (duty_cycle > 100)  
  6.         return -EINVAL;  
  7.   
  8.     if (duty_cycle == 0) {  
  9.         pwm_off(pd);  
  10.         return 0;  
  11.     }  
  12.   
  13.     new_tmar = (duty_cycle * pd->num_settings) / 100;  
  14.   
  15.     if (new_tmar < 1)  
  16.         new_tmar = 1;  
  17.     else if (new_tmar > pd->num_settings)  
  18.         new_tmar = pd->num_settings;  
  19.   
  20.     pd->tmar = pd->tldr + new_tmar;  
  21.     pwm_on(pd);  
  22.     pd->current_val = duty_cycle;  
  23.   
  24.     return 0;  
  25. }  
  26. EXPORT_SYMBOL_GPL(pwm_set_duty_cycle);  
如果我们在板级文件board-am3517evm.c中调用该函数,需要先声明再调用:

  1. extern struct pwm_dev pwm_dev;  
  2. .......  
  3. ......  
  4. ......  
  5. pwm_set_duty_cycle(&pwm_dev,0);  
原文来自 http://blog.csdn.net/lvc851116/article/details/8123457
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值