当前位置:首页 > 日记 > 正文

linux驱动程序开发的详细介绍

linux驱动程序开发的详细介绍
注释:前提是,一般来说,内核代码错误可能导致用户进程的死亡,或者整个系统瘫痪。更严重的后果可能导致磁盘损坏。因此,最好有一台试验机进行系统测试。

前提,一般来说,内核代码错误可能导致用户进程的死亡,或者整个系统的瘫痪。更严重的后果可能导致磁盘损坏。因此,最好有一台试验机进行系统测试。
第一个内核模块(Hello World模块)

复制代码代码如下所示:
查看代码
#包括
#包括
module_license(双BSD和GPL );
静态__init int hello_init(void)
{
/ / printk函数在内核模块中定义,和内核需要自己多打印涵洞
因为它依赖于自己的操作,没有相应的库函数。
/ /模块insmod加载后调用printk,模块与内核
因为一些可以调用内核/公共符号,kern_alert是消息的优先级
printk(kern_alert 你好世界;
返回0;
}
静态__exit虚空(void)hello_exit
{
printk(kern_alert 再见);
}
module_init(hello_init);
module_exit(hello_exit);

在模块中定义的两个功能,一个模块加载到内核调用(hello_init),另一个在内核将从调用模块删除(hello_exit);在上面的代码中,module_init和module_exit两核宏,用来告诉内核从哪里开始,在哪里退出module_license宏模块用于声明以下免费许可,否则内核加载会出现警告。
好了,现在我们可以对上面的程序进行相应的测试了。在测试之前,我们已经编制了相应的makefile文件。模块的编译不同于普通程序的编译。
makefile文件

复制代码代码如下所示:
查看代码
# makefile为你好世界
# kernelrelease是内核源代码定义的第一个变量
Ifneq($(kernelrelease),#)判断变量是否为空(第一次执行未定义)
执行else语句不确定时#
obj-m:= HelloWorld。O #表明有一个模块被设置从目录文件HelloWorld。O,然后将设置
#名叫HelloWorld.ko
#如果有一个模块被称为module.ko,来自两个源文件file1 file2。C和C的假设。
#应该是:obj-m = O模块。
#模块对象:file1 file2 O O =。。
其他的
可得:= / / /美元库模块(壳uname -r) /建造
所有:
#当目标是,C $(可得)跳到内核源码目录读取makefile
# M = $(PWD)方法返回当前目录,继续阅读,当前执行的makefile,当再次执行
# $(kernelrelease)已经被定义,将之前的阅读其他内容
让C $(可得)M = $(PWD)模块
清洁:
rm -rf *。柯*。* MOD。O * MOD。symvers C *。
endif

相应的解释如上面所述。
作为一个编译内核:它必须是一个超级用户
在当前路径下输入
在编译完成后,进入insmd helloworld.ko加载内核,并使用dmesg |尾看到内核的输出信息。
使用rmmod的dmesg |尾看到打印出再见的使用相应的HelloWorld去核
printk不得出口到屏幕上,这是对kern_alert优先级相关,这还不够高。内核输出的内容可以在/ var /日志/ kern.log查看,并可以通过vim / / / kern.log VaR日志查看。
内核模块不同于应用程序。
1:应用程序运行后,相应的任务将被处理。在内核模块注册,它是用来满足未来的要求,并增加了__init初始化函数后,调用完成后,将立即释放内存空间。
2:当应用程序终止时,它不负责资源的恢复,并且由操作系统维护,但是内核模块在移除资源时必须释放资源。
3:应用程序可以调用相应的库函数,而内核模块只能调用内核中输入的函数。在内核模块编程中,源文件不应包含通常的头文件,但也有例外情况,如少数头文件的唯一例外。
4:处理错误的方式是不同的。在应用程序的中间部分,可以通过相应的调试器检查和修改错误,但在内核模块中,如果不终止整个系统,段错误将终止当前进程。
用户空间和内核空间:
应用程序在用户空间中运行,内核模块在内核空间运行,每个模式都有自己的内存映射,以及自己的地址空间。
内核与当前进程的关系:
内核模块所做的大部分操作代表一个特定的过程,内核代码可以通过访问全局项目流来引用当前进程,这被定义为:
#定义当前(get_current) /通过宏定义可以获得一个指针,指针的任务task_struct
内核代码可以使用当前流来使用特定于流程的信息。
内核符号表:
内核模块在加载时通过查找内核符号表来解决未定义的符号,内核符号表包含全局内核项的地址。加载模块时,模块中导出的符号也将成为内核符号表的一部分。
模块的输入符号通常使用以下两种形式:
export_symbol(名称)
export_symbol_gpl(名称)
以上宏定义使给定符号以外的模块使用,对_gpl版宏定义可以使符号可用的_gpl许可模块。
版本依赖:
该模块的代码都必须重新编译为每个连接到内核版本,在编写模块的过程中,第一步是阅读Makefile文件的内核,在编译内核树文件的过程(vermagic。O)连接到你的模块,在内核中的文件有很多相关的信息,包括版本…
模块参数:
模块参数指定用insmod和modprobe加载时。
到以前的HelloWorld的变化。C如下:
终端输入

复制代码代码如下所示:
使
Insmod HelloWorld.ko = test num = 10;
dmesg |尾3

你可以看到它。
使用module_param_array(名称、类型、数量、烫发)在声明数组参数
名称是数组的名称,类型是数组元素的类型,Num是无数个数组的数组,烫发是权限。
附录:insmod
insmod内核模块加载到内存中,它依赖于一个定义在内核/模块。C的系统调用sys_init_module函数分配内核内存来存储模块,然后复制模块代码的内存区域,使用内核符号表解决内核引用模块,和初始呼叫功能启动所有模块。什么.
的modprobe工具也被用来加载内核模块来记忆。不像insmod,它会在加载模块,看看它是否已经在当前的内核引用未定义的符号。如果有,它会在当前的搜索路径模块是否定义了该符号,如果是这样,该模块加载到内核。
rmmod用于去除内核模块,如果内核认为模块仍然在使用,或如果内核配置为不允许模块被删除,该模块的卸载会失败。
lsmod体现所有模块加载到当前的系统列表。
内核模块编程中的函数通常声明为静态的,因为它们在文件外是不可见的。

相关文章

对PHP加载和spl_autoload自动加载

对PHP加载和spl_autoload自动加载

加载机制,加载,电脑软件,PHP,spl_autoload,加载PHP机制 (1)对加载机制概述 当我们使用PHP的面向对象模式开发的系统,我们在一个单独的文件通常使用每个类的实现,这使得它易于重用的类,并在同一时间,便于日后的维护,这也是面向对象设计的基本思想。…

XP系统视频文件的三种实用解决方案

XP系统视频文件的三种实用解决方案

系统,删除,解决方案,三种,视频文件,评论:频率文件预览功能已经导致我们删除视频文件时,往往有一个提示,不能删除。我们如何解决这个问题这里有几个很好的方法来说明类似情况的朋友。 在xp系统中,有一个非常实用的视频功能,那就是视频预览,但那是…

Solaris下复制文件的技术

Solaris下复制文件的技术

复制文件,技术,电脑软件,Solaris,点评:uff1a 今天,一个问题被解决了。如果源路径中有链接,Solaris下的CP命令会自动将连接传输到实际文件。 这在实际使用中往往是不合适的。 Linux下的d参数可以避免这个问题,但是Solaris不支持这个参数。 通过…

,是servicelayer.exe-使用

,是servicelayer.exe-使用

电脑软件,servicelayer,exe,评论:详细介绍的过程中,对servicelayer.exe 进程文件:,或servicelayer.exe 过程名称:诺基亚连接库 过程类别:安全风险的过程 英文描述: servicelayer.exe是与诺基亚的连接库软件相关的过程。它 中文参考: 对不起,暂时没…

该smartexplorer.exe-意义smartexp

该smartexplorer.exe-意义smartexp

意义,过程,电脑软件,smartexplorer,exe,评论:smartexplorer.exe - smartexplorer过程 进程文件:smartexplorer或smartexplorer.exe 过程名称:Smart Explorer Browser 过程类别:安全风险的过程 英文描述: smartexplorer.exe是一个过程,属于smart…

它说明Linux下内核参数

它说明Linux下内核参数

参数,内核,电脑软件,Linux,评论:最后的数据发送和接后标记为需要它的第一KeepAlive探测包之间的间隔 tcp_keepalive_time整数 连接后标记为需要它,最终的数据发送和第一KeepAlive探测包之间的间隔。 默认值:2hours。 tcp_keepalive_probes…

使用Win7的远程桌面控制

使用Win7的远程桌面控制

控制,远程桌面,电脑软件,点评:Win7的远程桌面控制需要建立两个连接电脑。下面将介绍你如何使用Win7远程桌面控制有兴趣的朋友可以参考。 win7的远程桌面控制需要建立两台电脑连接到互联网。以下是以下内容: 在连接的计算机设置上: 首先,右击…

通过硬盘安装Fedora

通过硬盘安装Fedora

安装,硬盘,电脑软件,Fedora,复习:准备工作 你需要让Fedora安装DVD镜像。在Fedora 8,文件fedora-8-i386-dvd.iso。请把它放在脂肪或外部的分区,如果你把它放在一个文件夹,该文件夹的名称是最好的,而不是在中国。Fedora 8似乎并没有能够从NTFS分区…

linux安装与软件安装

linux安装与软件安装

软件安装,安装,电脑软件,linux,linux为计算机用户安装常用软件。然后我会深入学习和学习Linux安装。在这里,我将与你的Linux安装方式的讨论,我希望它会对你有用。决定不使用了。你找不到安装Linux的意义。没有太多的时间找出一些用法。所以决…

160wifi3新改造,乐趣和更好的使用

160wifi3新改造,乐趣和更好的使用

乐趣,电脑软件,160wifi 3.0.3.7下用户的期望终于发布了新版本的160wifi,如用户,用户需要创建用户体验最舒适的感觉为出发点,优化界面,提高稳定性,添加多种便利功能,让广大用户享受高速的网络软件而消除不稳定的担忧。乐趣和更好的利用,真正做到用…

是csinsm32.exe安全过程该csinsm32

是csinsm32.exe安全过程该csinsm32

过程,什么用,电脑软件,exe,点评:csinsm32.exe是诺顿和诺顿的清扫清扫产品的一部分,是用来监控程序的更改计算机配置文件 进程文件:csinsm32或csinsm32.exe 进程名称:Norton Cleansweep 过程类别:安全风险的过程 英文描述: Csinsm32.exe is a pa…

winserv.exe的过程是怎样的

winserv.exe的过程是怎样的

的是,过程,是怎样,电脑软件,winserv,评论:对winserv.exe工艺简介 进程文件:winserv或winserv.exe 进程名称:imiserv病毒 过程类别:安全风险的过程 英文描述: winserv.exe添加到系统,作为一个结果的imiserv病毒。它是一种用于从远程位置控制目标…