linux 运行模块,构造和运行模块 - Linux设备驱动程序学习笔记_Linux编程_Linux公社-Linux系统门户网站...

news/2024/5/20 15:30:26/文章来源:https://blog.csdn.net/weixin_39534780/article/details/116642365

设置测试系统

1.在kernel.org的镜像网站上获得一个“主线”内核。

2.准备好一个内核源代码树。

2.6内核的模块要和内核源代码树中的目标文件链接,通过这种方式,构造一个更加健壮的模块装载器。

Hello World模块

#include

#inlcude

MODULE_LICENSE("Dual BSD/GPL");

static int hello_init(void)

{

printk(KERN_ALERT "hello,world\n");

return 0;

}

static void hello_exit(void)

{

printk(KERN_ALERT "Goodbye,cruel world\n");

}

module_init(hello_init);

module_exit(hello_exit);

涉及知识点:

module_init(init_function),module_exit(cleanup_function),

MODULE_LICENSE,

printk,KERN_ALERT等,

insmod,modprobe,rmmod,

makefile,make,

根据系统传递消息行机制的不同,读者得到的输出结果可能不一样。需要特别指出的是,上面的屏幕输出是在文本控制台上得到的;如果读者在某个与运行在windows系统下的终端仿真器中运行insmod,rmmod,则不会在屏幕上看到任何输出。实际上,他可能输出到某个系统日志文件中,比如:/var/log/messages

核心模块与应用程序的对比

应用程序 vs 核心模块 vs 事件驱动的应用程序

用户空间 vs 内核空间

cpu在被设计时,有保护系统软件不被应用程序破坏的功能。且这种保护功能分为不同级别,当

cpu中存在多个级别时,unix通常使用最高级和最低级,即:超级用户级和用户级,也即内核空间和用户空间。

内核中的并发

常见引起并发原因:1.linux系统中通常正在运行多个并发进程,并且可能有多个进程同时使用我们的驱动程序2.大多数设备能够中断处理器,而中断处理程序异步运行,而且可能在驱动程序正试图处理其他任务时被调用。3.linux可以运行在多处理器上,因此可能同时有多个处理器在使用该进程。

当前进程

Current 在中定义,是一个指向struct task_struct的指针,而task_struct结构在中定义。

Current指针指向当前正在运行的进程;

在open,read等系统调用的执行过程中,当前进程指的是调用这些系统调用的进程。

struct task_struct *current;

current->id :当前进程的id

current->comm. :当前进程的命令名

其他细节

1.      如果我们需要大的结构,应该调用动态分配该结构,而不是声明大的自动变量。

2.      常见函数前加有__两个下划线,这种函数通常是接口的底层组件,实际上,双下划线是告诉程序员:谨慎使用,后果自负

3.      内核代码不支持浮点数运算。

编译与装载

编译模块

1.       确保安装了正确版本的编译器,模块工具,和其它必要的工具,内核文档Documentation/Changes文件列出了需要的工具版本。

2.       makefile:obj-m:由内核构造系统使用的makefile符号,用来确定当前目录中应构造哪些模块。

如果已经构造了KERNELRELEASE,则说明是从内核构造系统调用的,因此可以利用其内建语句。

ifneq ($(KERNELRELEASE),)

obj-m :=hello.o

否则,是直接从命令行调用的,这时要调用内核构造系统。

else

KERNELDIR ?=/lib/modules/$(shell uname -r)/build\

PWD      :=$(shell pwd)

default:

$(MAKE) –C $(KERNELDIR) M=$(PWD) modules

endif

装载和卸载

1.      只有系统调用函数的名字前边带有sys_前缀。

2.      modprob区别于insmod :modprob会考虑要装载的模块是否引用了一些当前内核不存在的符号,如果是存在,modprob回查找,而insmod会失败,并在系统日志文件中记录”unresolved symbols”消息。

3.      lsmod列出当前装载到内核中的所有模块。

版本依赖

UTS_RELEASE:一个描述内核版本的字符串,例如:2.6.10

LINUX_VERSION_CODE:内核版本的二进制表示,版本中每一部分对应一个字节。如2.6.10对应的LINUX_VERSION_CODE是132618

KERNEL_VERSION(major,minor,release):创建参数版本,这个宏在我们需要将当前版本和一个已知的检查点比较时非常有用。

平台依赖

EXPORT_SYMBOL(name)

EXPORT_SYMBOL_GPL(name)

这两个宏均用于将给定的符号导出到模块外部。_GPL版本使得要导出的模块只能被GPL许可证下的模块使用。内核符号表

预备知识

MODULE_LICENSE( ),MODULE_AUTHOR( ),MODULE_DESCRIPTION( ),

MODULE_VERSION( ),MODULE_ALIAS( ),MODULE_DEVICE_TABLE( ),

初始化和关闭

__init,__initdata

__devinit,__devinitdata,

大部分的注册函数都带有register_前缀

__exit,__exitdata

初始化函数:

Static int __init initialization_function(void)

{

/*初始化代码*/

}

Module_init(initialization_function);

清除函数:

Static void __exit cleanup_function(void){

/*清除代码*/

}

Module_exit(cleanup_function);

初始化过程中的错误处理

举例:该段代码注册了三个设备,在出错的时候使用goto语句,它将只撤销出错时刻以前所成功注册的那些设施。

Int __init my_init_function(void)

{

Int err;

/*使用指针和名称注册*/

Err = register_this(ptr1,"skull");

If(err)  goto faile_this;

Err = register_that(ptr2,"skull");

If(err)  goto faile_that;

Err = register_those(ptr3,"skull")

If(err)  goto faile_those;

Return 0;  /*成功*/

Faile_those:unregister_that(ptr2,"skull");

Faile_that:unregister_this(ptr1,"skull");

Faile_this:return err;   /*返回错误*/

}

模块装载竞争

在支持某个设施的所有内部初始化完成之前,不要注册任何设施。

模块参数

#include

Module_param(variable,type,perm);

Module_param_array(name,type,num,perm);

用来创建模块参数的宏,用户可在装载模块时(或者对内建代码引导时)调整这些参数的值,其中的类型可以是:bool,charp,int,invbool,long,short,ushort,uint,ulong,intarray

在用户空间编写驱动程序

实际操作

源代码:

#include

#inlcude

MODULE_LICENSE("Dual BSD/GPL");

static int hello_init(void)

{

printk(KERN_ALERT "hello,world\n");

return 0;

}

static void hello_exit(void)

{

printk(KERN_ALERT "Goodbye,cruel world\n");

}

module_init(hello_init);

module_exit(hello_exit);

makefile:

ifneq ($(KERNELRELEASE),)

obj-m :=hello.o

else

KERNELDIR ?=/lib/modules/$(shell uname -r)/build\

PWD      :=$(shell pwd)

default:

$(MAKE) –C $(KERNELDIR) M=$(PWD) modules

endif

编译模块

#make

清除

#make clean

-----------

为了能够在终端显示信息,要修改

/lib/modules/2.6.10/build/include/linux/kernel.h

文 件的KERN_ALERT宏。

#define KERN_ALERT "<1>"

修改为

#define KERN_ALERT "<0>"

实际操作并未成功,不知道原因在哪------------

安装模块

#insmod hello.ko

终端 显示

hello module init

查看已安装的模块

#lsmod

卸载模块

#rmmod hello

终 端显示

hello module exit

-----------

有以下几点要注意:

1,hello.c文件中调用的头 文件

init.h中的module_init(),module_exit()

kernel.h中的 printk(),KERN_ALERT

module.h中的MODULE_LICENSE()

2,Makefile文件中的核心是

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

1),-C $(KERNELDIR)

表示 在$(KERNELDIR)目录下执行make命令。

2),M=$(PWD)

表示包含$(PWD)下的Makefile文件。

3),modules

表 示模块编译。

4), 用到了ifneq...else...endif语句

由于开始还没定义KERNELRELEASE,所以只能执行 else分支。

而在执行

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

后,会在内核的 Makefile中定义KERNELRELEASE,当进入本Makefile时,

则只会执行ifneq的第一个分支,即

obj-m := hello.o

这一句话是非常重要的。事实上,这个Makefile做的本份工作就是它。

我们也可以用命令行的方式来编译:

在 Makefile中的内容写为:

obj-m := hello.o

然后在终端敲入:

#make -C /lib/modules/2.6.10/build M=/home/tmp modules0b1331709591d260c1c78e86d0c51c18.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_787610.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

搜索引擎关键词快速排名软件_SEO技巧排名软件怎么做搜索引擎关键词排名?

一&#xff1a;影响seo的因素大概分成3个网站 相关度 ( 网站相关度用户搜索的词)网站链接 ( 网站链接外部链接 内部链接&#xff08;谷歌pr算法&#xff09;用户行为 (用户行为依据用户行为做为反馈机制&#xff0c;来提升产品对用户的满意度&#xff08;每一个企业都是为了最大…

nginx https透明代理_从官网入门系列-nginx web网站 反向代理 动静分离 负荷均衡(四)...

本文主要介绍nginx正向代理。本系列封面正向代理介绍为什么需要正向代理由于直接的网络不通&#xff0c;通过配置代理来间隔访问出于个人隐私的原因&#xff0c;我们希望隐藏自己的IP&#xff0c;让http服务器无法记录我们访问过它代理类型介绍1.http代理&#xff1a;透明代理&…

js 监听iframe 内部接口是否请求完成_使用Github的Webhooks+Node完成网站的自动化部署...

目前我的博客网站的部署方式&#xff0c;是通过github的webhooks监听push事件来触发远程服务器的自动化部署脚本&#xff0c;如下&#xff1a;本地环境->push到github仓库->触发远程自动化部署脚本->网站更新为最新的代码1.配置github代码仓库的webhook如上图进入到项…

网站打开速度多少毫秒为正常_SEO优化|虚拟主机与网站排名

上周我们提到标题决定网站长久排名&#xff0c;今天跟大家分享虚拟主机与SEO之间的知识点。网站是储存在虚拟主机上的&#xff0c;虚拟主机的性能直接影响到网站的性能&#xff0c;这是一个直接关联的问题。在操作SEO项目中&#xff0c;虚拟主机的选择甚至决定SEO的效果&#x…

无人机官方网站_无人机培训驾驶证,你了解多少?

无人机作为一个新的生成工具&#xff0c;确实创造了很多新的就业机会&#xff0c;比如、电力巡检、植保作业等&#xff0c;也打打破了好多的行业门槛如测绘、航拍。给了我们快速进入一个行业的机会。全新的行业有好处&#xff0c;门槛少&#xff0c;壁垒少。无人机作为一个飞行…

nginx php网站配置文件,nginx怎么配置文件路径

Nginx安装结束后&#xff0c;yum默认安装位置在/etc/nginx中。配置文件位于&#xff1a;/etc/nginx/nginx.conf&#xff0c;可以修改处理器数量、日志路径、pid文件路径等&#xff0c;默认的日志。错误日志 /var/log/nginx/error.log访问日志 /var/log/nginx/access.lognginx.c…

php跳转动画源码,网站go链接跳转动画

这篇文章上次修改于 642 天前&#xff0c;可能其部分内容已经发生变化&#xff0c;如有疑问可询问作者。蓝色页面加载中,请稍候...页面加载中...黑色加载中var msg document.title;msg "" msg;pos 0;function scrollMSG() {document.title msg.substring(pos, m…

请求php网页的过程示意图,php网站打开访问慢,排查过程案例!

问题描述&#xff1a;客户反馈昨天网站访问还是正常的&#xff0c;今天访问特别慢&#xff0c;环境源码什么都没动过 请求需要1分钟拿到机器资料后检查负载一切正常&#xff0c;查看客户使用的是宝塔linux面板&#xff0c;lnmp环境&#xff0c;可以通过slow log追踪到问题点我们…

PHP设计网站的框架,用PHP制作静态网站的模板框架(三)

用PHP制作静态网站的模板框架(三)更新时间&#xff1a;2006年10月09日 00:00:00 作者&#xff1a;避免页面元素重复“这确实不错”&#xff0c;你也许会想&#xff0c;“我的网站主要就是由大量的静态页面构成。现在我可以从所有页面中删除它们的公共部分&#xff0c;要更新这…

php在线视频网站,GitHub - unkaer/olvideos: 简易 PHP 在线视频网站,搜索并播放资源站视频。...

olviedos简易 PHP 在线视频网站&#xff0c;无需数据库&#xff0c;占用空间小。基本原理 搜索(API或爬取)资源站视频 在线播放。演示演示站点&#xff1a;️在线视频站 (彩虹云cfCDN)备用站点 (HerokucfCDN 自动更新最新版)结构.├── README.md├── index.php 搜索首页├─…

php】微趣网源码_腾讯微博应用网站系统_病毒式放大流量_,腾讯微博应用网源码 腾讯微趣网app源码整站程序自助下载...

腾讯微博应用网源码 腾讯微趣网app源码整站程序自助下载腾讯微博应用微趣网源码安装说明&#xff1a;第一步 我们先要申请腾讯的APP访问 http://dev.open.t.qq.com/developer/add 注册一个自己的账户&#xff0c;并且注册完毕之后登录自己的邮箱选择右键的连接进行账号确认&…

android 怎么实现手机网站支付_支付宝手机网站支付签约不了、签约评分不足等问题处理,强开支付宝产品功能权限!...

一、如何开通支付宝手机网站支付正常来说&#xff0c;按照官方的指引要求填写相关资料&#xff0c;即可开通支付宝手机网站支付。但是&#xff0c;更多的时候我们的申请都会碰到一些阻力&#xff0c;常见的阻力就是“系统综合评估签约条件不满足&#xff0c;谢谢您的支持”&…

为什么选择spring security oauth2_SpringBoot入门建站全系列(三十五)整合Oauth2做单机版认证授权...

SpringBoot入门建站全系列&#xff08;三十五&#xff09;整合Oauth2做单机版认证授权一、概述OAuth 2.0 规范定义了一个授权&#xff08;delegation&#xff09;协议&#xff0c;对于使用Web的应用程序和API在网络上传递授权决策非常有用。OAuth被用在各钟各样的应用程序中&am…

telnet3389能通但是不能远程桌面_自我建站记录-一次不能发送验证BUG

本人一直从事JAVA后端开发,但一直想做一个自己的网站.为了学习和了解更多.所以没用建站程序,是自己一行一行敲HTLM和JS码出来的.本人码后端还行,但是前端真的是太水了.截至目前,前端在移动端显示效果还是非常糟糕.当然,我也一直在改.也希望知乎大佬多给我意见和指导.好了,说说今…

vb.net access 打开程序数据没了_【巨阵科技】网站打开速度很慢的原因

如今&#xff0c;大多数的企业都有在建设自己的企业网站&#xff0c;网站是建设好了&#xff0c;但有很多毛病却不知道是怎么造成的。比如说网站打开的速度很慢。影响网站打开速度的因素是有很多的&#xff0c;发现网站打开慢&#xff0c;那就分析网站建设中的原因&#xff0c;…

php asp网站本地调试,php/asp网站程序本地调试软件

这是php/asp网站程序本地调试软件&#xff0c;网站程序本地调试软件对网站程序有很大帮助&#xff0c;许多站长对编程不太熟悉&#xff0c;当自己的php/asp网站程序需要修改时&#xff0c;修改后的文件&#xff0c;本地电脑无法看到自己的修改效果&#xff0c;因为本地安装调控…

日语输入法电脑版_【狐狸专栏】日语学习必备网站一览

新的一年到啦~初心联盟全体成员给大家拜年啦&#xff01;祝大家在新的一年里学业进步&#xff0c;身体健康&#xff0c;万事顺利~今天为大家推荐几个日语学习网站&#xff0c;活用这些网站收获多多哟&#xff01;1Yahoo日文字典网址&#xff1a; http://dic.yahoo.co.jp/网页上…

wordpress yoast调用自定义类型_适合WordPress自建站卖家使用的15个SEO插件

从小型个人博客到一众大公司的复杂网站&#xff0c;WordPress拥有全球近1/3的网站&#xff0c;此外WordPress是许多自建站卖家首选的网站构建器和内容管理系统。WordPress插件数据库中有超过18000个插件&#xff0c;包括SEO、控件等等。本文为自建站卖家盘点了针对搜索引擎优化…

我的家乡网站_《家乡》票房失守2亿,《姜子牙》高开低走,今年国庆档没有黑马...

国庆假期期间除了出去游玩之外&#xff0c;怎么可能少得了去电影院看电影呢&#xff1f;作为电影票房的突出贡献时期&#xff0c;每年的国庆档可以说是大片云集、群星荟萃了&#xff0c;尤其是去年开始“我和我的XX”系列电影问世后&#xff0c;每年的国庆档几乎可以集齐圈内大…

find_all可以连续使用_Python爬虫使用正则爬取网站,正则都不会就别玩爬虫了!...

本文章的所有代码和相关文章&#xff0c; 仅用于经验技术交流分享&#xff0c;禁止将相关技术应用到不正当途径&#xff0c;滥用技术产生的风险与本人无关。本文章是自己学习的一些记录。欢迎各位大佬点评&#xff01;源码在GitHub上面&#xff0c;且相关介绍更加全面。链接如下…