成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Linux內核如何訪問另外一個模塊的函數和變量

系統 Linux
有粉絲問我Linux內核如何訪問另外一個模塊的函數和變量,今天就這個問題給大家介紹一下內核中兩個模塊,一個A,一個B,A模塊中有操作函數,B模塊要調用A模塊的函數。

[[386922]]

一、問題整理

內核中兩個模塊,一個A,一個B,A模塊中有操作函數,B模塊要調用A模塊的函數。


二、分析

這是一個驅動工程師經常遇到的一個問題,該問題其實是模塊符號導出問題,實現該功能比較簡單,借助EXPORT_SYMBOL()即可。

1. 什么是符號?

這里的符號主要指的是全局變量和函數,靜態全局變量其實也可以被另外一個模塊訪問到。

2. 為什么要導出符號?

↓ Linux內核采用的是以模塊化形式管理內核代碼。內核中的每個模塊相互之間是相互獨立的,也就是說A模塊的全局變量和函數,B模塊是無法直接訪問的。

有些時候,我們寫一些模塊代碼的時候,發現部分函數功能別人已經實現了,此時我們就想如果我們可以調用他們已經實現好的函數接口就好了。那如何才能做到這點呢?

就靠符號導出了,也就是說你可以把你實現的函數接口和全局變量導出,以供其他模塊使用。

在Linux內核的世界里,如果一個模塊已經以靜態的方式編譯進的內核,那么它導出的符號就會出現在全局的內核符號表中。

在Ubuntu 14.04系統中,Linux內核的全局符號表存放在以下文件:

  1. /usr/src/linux-headers-3.2.0-29-generic-pae/Module.symvers 

如果打開這個文件,可以發現里面的內容就是:

  1. Addr------->符號名------>模塊名------>導出符號的宏 

 

3. 如何導出符號?

Linux內核給我們提供了兩個宏:

  1. EXPORT_SYMBOL(name); 
  2. EXPORT_SYMBOL_GPL(name); 

上面宏定義的任一個使得給定的符號在模塊外可用;GPL版本的宏定義只能使符號對GPL許可的模塊可用;符號必須在模塊文件的全局部分輸出,在任何函數之外,因為宏定義擴展成一個特殊用途的并被期望是全局存取的變量的聲明。

4. 模塊編譯時,如何尋找使用的符號?

  • a.在本模塊中符號表中,尋找符號(函數或變量實現)
  • b.在內核全局符號表中尋找
  • c.在模塊目錄下的Module.symvers文件中尋找

5. 案例演示

模塊A導出全局變量global_var和函數show兩個符號供模塊B使用。

A模塊

  1. #include <linux/init.h> 
  2. #include <linux/module.h> 
  3. static int global_var = 100; 
  4. static void show(void) 
  5.  printk("show():  global_var =%d \n",global_var); 
  6. static int hello_init(void) 
  7.  printk("module b :global_var=%d\n",global_var); 
  8.  return 0; 
  9. static void hello_exit(void) 
  10.  printk("hello_exit \n"); 
  11.  return
  12. }EXPORT_SYMBOL(global_var); 
  13. EXPORT_SYMBOL(show); 
  14. MODULE_AUTHOR("yikoulinux"); 
  15. MODULE_LICENSE("GPL"); 
  16. module_init(hello_init); 
  17. module_exit(hello_exit);  

B模塊

  1. #include <linux/init.h> 
  2. #include <linux/module.h> 
  3.  
  4. extern int global_var; 
  5. extern  void show(void); 
  6. static int hello_init(void) 
  7.  printk("module a: global_var= %d\n",global_var); 
  8.  show(); 
  9.  return 0; 
  10. static void hello_exit(void) 
  11.  printk("hello_exit \n"); 
  12.  return
  13. MODULE_AUTHOR("yikoulinux"); 
  14. MODULE_LICENSE("GPL"); 
  15. module_init(hello_init); 
  16. module_exit(hello_exit); 

調試步驟:

1.編譯模塊A,然后加載模塊A,在模塊A編譯好后,在它的當前目錄會看到一個Module.symvers文件,這里存放的就是我們模塊A導出的符號。

2.將模塊A編譯生成的Module.symvers文件拷貝到模塊B目錄下,然后編譯模塊B,加載模塊B。

3.通過dmesg查看模塊打印的信息。打印信息如下:


由結果可知,我們在B模塊中訪問到了模塊A的全局變量global_var以及函數show。

 

責任編輯:姜華 來源: 一口Linux
相關推薦

2021-07-06 14:36:05

RustLinux內核模塊

2014-07-24 14:35:26

Linux內核模塊

2018-10-15 10:10:41

Linux內核補丁

2009-09-11 08:44:36

2011-08-29 15:12:24

UbuntuLinux模塊

2025-05-15 09:12:27

2020-11-10 07:11:23

Linux內核補丁

2022-10-10 17:00:19

地址內核函數

2021-05-26 07:53:58

Linux運維Linux系統

2018-12-06 08:34:15

Linux訪問控制安全攔截技術

2021-05-18 14:25:30

Linux運維Linux系統

2018-06-19 09:07:57

Linux內核模塊

2023-07-25 15:17:38

Linux操作系統開發

2019-02-11 14:35:59

Linux硬件監控工具命令

2009-08-18 11:01:51

2023-02-27 12:53:14

Linux內核

2021-02-20 11:34:43

Linux內核指針

2013-08-01 10:58:53

2010-01-22 11:01:04

linux內核模塊

2023-09-28 13:21:32

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩欧美一级精品久久 | 日朝毛片 | 日本在线一二 | 国产欧美一区二区三区在线看蜜臀 | 欧美成人激情 | 国产欧美一区二区三区久久人妖 | 欧美亚洲国语精品一区二区 | 亚洲国产精品久久久久婷婷老年 | 韩国毛片一区二区三区 | 国产aa | 黄色在线免费播放 | 欧美四虎 | 欧美综合一区二区三区 | 欧美一区二区视频 | 欧美日韩在线观看一区 | 国产色网站 | 99视频免费播放 | 黄色毛片免费视频 | 日韩av一区二区在线观看 | 国产韩国精品一区二区三区 | 欧美一区二区三区视频在线观看 | 精品福利视频一区二区三区 | 精品美女 | 欧美综合一区二区三区 | 毛片在线免费 | 国产 亚洲 网红 主播 | 国产精品久久久久久久久久免费看 | 日本久久久一区二区三区 | 人人九九精 | 欧美在线视频免费 | eeuss国产一区二区三区四区 | 嫩呦国产一区二区三区av | 亚洲精品国产一区 | 在线观看免费国产 | 精品av | 五月婷亚洲 | 亚洲视频在线观看免费 | 精品一区二区三区在线观看 | 99亚洲精品 | 精品日韩在线 | 一二三区视频 |