linux驱动开发--导出内核符号

导出内核符号模板代码,验证小实例:

/**
*Copyright (c) 2013.TianYuan
*All rights reserved.
*
*文件名称: Esdexp.c
*文件标识: 导出内核符号,此文件中的函数模块被Esdimp.c调用
*
*当前版本:1.0
*作者:wuyq
*
*取代版本:xxx
*原作者:xxx
*完成日期:2013-11-18
*/
#include <linux/init.h>
#include <linux/module.h>

//声明内核模块的许可权,如果不声明LISCENSE,模块加载时将收到内核被污染(kernel tainted)的警告
MODULE_LICENSE("GPL");

int esdexp_mult(int x, int y)
{
	printk("enter esdexp_mult!\n");
	return (x*y);
}

int esdexp_divd(int x, int y)
{
	printk("enter esdexp_divd!\n");
	return (x/y);
}

/*导出内核符号,定义的函数可以被其他函数调用*/
EXPORT_SYMBOL(esdexp_mult);
EXPORT_SYMBOL(esdexp_divd);

/**
*Copyright (c) 2013.TianYuan
*All rights reserved.
*
*文件名称: Esdimp.c
*文件标识: 验证Esdexp.c中的模块
*
*当前版本:1.0
*作者:wuyq
*
*取代版本:xxx
*原作者:xxx
*完成日期:2013-11-18
*/
#include <linux/init.h>
#include <linux/module.h>
/*两个ko文件, 安装应该有顺序的 modprob*/

//声明内核模块的许可权,如果不声明LISCENSE,模块加载时将收到内核被污染(kernel tainted)的警告
MODULE_LICENSE("GPL");

extern int esdexp_mult(int ,int );
extern int esdexp_divd(int ,int );

static int __init esdimp_init(void)
{
	int result = 0;
	/*编译器、代码可移植性、健壮性 */
	printk("enter esdimp_init!\n");
/*局部变量分配在栈内存中,赋初值。默认不一定为0*/
/*局部变量应该放在函数内,可执行代码之前。且赋初值。即:函数开头,否则会有警告信息。*/
	result = esdexp_mult(10, 17);
	printk("result = %d\n", result);
	return 0;
}

static void __exit esdimp_exit(void)
{
	int result = 0;
	printk("enter esdimp_exit!\n");
	result = esdexp_mult(1000, 60);
	printk("result = %d\n", result);
}

module_init(esdimp_init);
module_exit(esdimp_exit);

KERNELDIR ?=/root/Desktop/work/ldd3/linux-2.6.31_TX2440A
PWD := $(shell pwd)
obj-m += Esdimp.o Esdexp.o
#obj-m += Esdexp.o

default:
	$(MAKE) -C $(KERNELDIR) M=$(PWD) modules

clean:
	@rm -f *.o *.ord* *.sy* *.mod.* *.ko
时间: 2024-10-12 05:19:53

linux驱动开发--导出内核符号的相关文章

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

Linux驱动开发必看详解神秘内核 完全转载-链接:http://blog.chinaunix.net/uid-21356596-id-1827434.html   IT168 技术文档]在开始步入Linux设备驱动程序的神秘世界之前,让我们从驱动程序开发人员的角度看几个内核构成要素,熟悉一些基本的内核概念.我们将学习内核定时器.同步机制以及内存分配方法.不过,我们还是得从头开始这次探索之旅.因此,本章要先浏览一下内核发出的启动信息,然后再逐个讲解一些有意思的点. 2.1 启动过程 图2-1显示

红帽-台式机x64 架构linux 驱动开发的安装问题

问题描述 台式机x64 架构linux 驱动开发的安装问题 我们知道Linux下的驱动开发可以静态加载也可以动态加载的.本人想在台式机上面的小红帽 下静态安装驱动.每次动态加载太费事了,但是貌似没有嵌入式Linux 下面的简单.有哪些方法可以实现系统自动加载,难道只有修改启动脚本么? 请大牛不吝赐教!跪拜!三客优! 解决方案 自己编译一个系统内核吧,这样想怎么弄就怎么弄了 或者查阅红帽的开发手册,看看有木有说明 解决方案二: 谢谢,网上可以下载到红帽的内核么 台式机上面怎么放系统里面启动呢? 解

《Android深度探索(卷1):HAL与驱动开发》——1.5节如何学习Linux驱动开发

1.5 如何学习Linux驱动开发 Android深度探索(卷1):HAL与驱动开发 由于Linux的内核版本更新较快(稳定版本1至3月更新一次,升级版本1至2周更新一次),每一次内核的变化就意味着Linux驱动的变化(就算不需要修改驱动代码,至少也得在新的Linux内核版本下重新编译),所以Linux内核的不断变化对从事Linux驱动开发的程序员影响比较大.不过这对于学习Linux驱动开发来说影响相对较小.因为不管是哪个版本的Linux内核,开发Linux驱动的方法和步骤基本相同,只要掌握了一

linux驱动开发--字符设备:内核等待队列

      在Linux驱动程序中,可以使用等待队列(wait queue)来实现阻塞进程的唤醒.等待队列可以用来同步对系统资源的访问. 1.定义和初始化队列头wait_queue_head_t wqh; init_waitqueue_head(wait_queue_head_t *wqh); 2.定义和初始化等待队列DECLARE_WAITQUEUE(name, tsk); 3.添加.移除等待队列add_wait_queue(wait_queue_head_t *q, wait_queue_t

linux驱动开发--内核空间中内存的申请与释放

1.Linux内存管理 linux内存最小管理单位为页(page),通常一页为4kb. linux系统中,在初始化时,内核为每个物理内存页建立一个page的管理结构,操作物理内存时实际上就是操作page页. 物理地址:出现在cpu地址总线上的寻址物理内存的地址信号,是地址变换的最终结果. 线性地址(虚拟地址):在32位cpu架构上,可以表示4G的地址空间,也就是0x00000000-0xFFFFFFFF. 逻辑地址:实际上是一个相对地址,是程序代码经过编译之后在汇编程序中出现的地址. linux

linux驱动开发--copy_to_user 、copy_from_user函数实现内核空间数据与用户空间数据的相互访问

设备读操作 如果该操作为空,将使得read系统调用返回负EINVAL失败,正常返回实际读取的字节数 ssize_t (*read)(struct file *filp, char __user *buf, size_t  count, lofft *f_pos);filp:待操作的设备文件file结构体指针buf:待写入所读取数据的用户空间缓冲区指针count:待读取数据字节数f_pos:待读取数据文件位置,读取完成后根据实际读取字节数重新定位返回:成功实际读取的字节数,失败返回负值 设备写操作

linux驱动开发--内核定时器

1.内核定时器 时钟中断:由系统的定时硬件以周期性的时间间隔发生,这个间隔(也就是频率)由内核根据常数HZ来确定. HZ常数:她是一个与体系结构无关的常数,可以配置50-1200之间,可以在内核中配置 tick:她是HZ的倒数,也就是每发生一次硬件定时器中断的事件间隔.如HZ为200,tick为5毫秒. jiffies核心变数:它是linux核心变数(32位变数,unsigned long),它被用记录自开机以来,已经过多少个tick.每发生一次硬件定时器中断,jiffies变数会被加1. 定时

linux驱动开发--内核链表

1.内核链表定义 在<linux/list.h>中定义 struct list_head{ struct list_head *next, *prev; }; 在list_head结构中包含两个指向list_head结构的指针next和prev,在实际使用中,它通常被组织成双向循环链表. 内核链表结构体不包含数据域,只包含维护链表的指针域. 内核链表被包含在其他数据结构体中使用. 初始化链表头INIT_LIST_HEAD函数void INIT_LIST_HEAD(struct list_hea

linux驱动开发--字符设备:静态分配设备号

字符设备(char device)         采用字节流方式访问的设备称为字符设备,通常智能采用顺序访问方式,也有极少数可以前后移动访问指针的设备(如:帧捕捉卡等设备).系统标准字符设备,例如:字符中断.串口等设备.常见待开发设备驱动的字符设备,例如:触摸屏.键盘.视频捕捉设备.音频设备等. 设备号 主设备号     用于标识设备类型,内核代码根据该号码对应设备文件和对应的设备驱动程序 次设备号     用于标识通类型的不同设备个体,驱动程序根据该号码辨别具体操作的是哪个设备个体. 设备号