Linux驱动实践:带你一步步理解驱动编译

当你现在在windows一个写好的驱动程序,比如hello_driver.c,如何去编译运行它?本文章试用于新手,该文章主要解释编译内核出现的名词

1.编译内核

1.1.为什么编译驱动程序之前要先编译内核?

⚫ 驱动程序要用到内核文件: 比如驱动程序中这样包含头文件:#include ,其中的 asm 是 一个链接文件,指向 asm-arm 或 asm-mips,这需要先配置、编译内核才会生成 asm 这个链接文件

⚫ 编译驱动时用的内核、开发板上运行到内核,要一致: 开发板上运行到内核是出厂时烧录的,你编译驱动时用的内核是你自己编译 的,这两个内核不一致时会导致一些问题。所以我们编译驱动程序前,要把自己 编译出来到内核放到板子上去,替代原来的内核

⚫ 更换板子上的内核后,板子上的其他驱动也要更换: 板子使用新编译出来的内核时,板子上原来的其他驱动也要更换为新编译出来的。所以在编译我们自己的第 1 个驱动程序之前,要先编译内核、模块,并且放到板子上去。

1.2.如何编译内核?

此处不赘述。以后会更新。

2.编译安装内核模块

2.1.什么是模块?

Linux内核非常庞大,包含很多组件。我们如何把需要的部分包含在内核中?
两种办法:
1)把所有需要的功能都编译进内核中。
会导致2个问题:生成的内核会非常大;为现有内核添加、删除功能,将不得不重新编译。

2)不包含所有功能,需要的时候,动态地加载代码到内核。
这种机制称为模块(Module)

模块特点:

  • 模块本身不被编译入内核映像,从而控制内核的大小。
  • 模块一旦被加载,就和内核中其他部分完全一样。

Linux中,一个.ko文件就是一个模块文件,可以通过insmod/rmmod/lsmod命令,动态地加载/卸载/查看模块。

2.2.什么是内核模块?

①  内核模块是一种没有经过链接,不能独立运行的目标文件,是在内核空间中运行的程序。经过链接装载到内核里面成为内核的一部分,可以访问内核的公用符号(函数和变量)。

②  内核模块可以让操作系统内核在需要时载入和执行,在不需要时由操作系统卸载。它们扩展了操作系统内核的功能却不需要重新启动系统。

③  如果没有内核模块,我们不得不一次又一次重新编译生成单内核操作系统的内核镜像来加入新的功能。这还意味着一个臃肿的内核。

细节可查看链接链接:https://blog.csdn.net/jiaFANluo/article/details/105197285

2.3如何编译安装内核模块?

此处不赘述。以后会更新。

3.将在ubuntu上的内核和模块安装到开发板上

使用NFS即可。

4.利用内核编译hello_driver.c成hello_driver.ko文件并加载

4.1什么是KO文件?

ko:是kernel object的英文简称。

KO是一个模块文件。ko也是Linux 2.6内核使用的动态连接文件,系统启动时的加载内核模块。

Linux中,一个.ko文件就是一个模块文件,可以通过insmod/rmmod/lsmod命令,动态地加载/卸载/查看模块。

4.2什么是驱动模块?

驱动模块与内核模块其实没有任何区别,编写方法都是一样的,都是.ko文件,只不过功能不一样

内核模块只是利用自身的优先级来去执行一些在应用层没法实现的事情,例如拦截内核中断处理实现钩子技术等,同时内核模块不会去访问硬件设备,它仅为应用层提供一些应用层没有权限去做的事情或为内核提供一些其它功能,例如hash算法之类的,内核与应用层是完全隔离开的只能通过中断来切换用户态和内核态。

而驱动模块则是实打实的为应用层提供一层访问硬件的API并且创建设备描述文件,例如/dev下的某个设备描述文件,同时会实现通用VFS接口例如:open、wirte、read这些接口给到应用层,内核模块一般是通过中断来与应用层进行调用交互的。

细节观看链接:https://blog.csdn.net/bjbz_cxy/article/details/106205910

4.3.如何编译hello_driver.c成hello_driver.ko?

此处不赘述。以后会更新。

4.4加载是来干什么的?要加载什么?如何实现加载?

1.加载是来干什么的?

玩过linux程序开发的人都知道,当一个驱动程序以模块化的模式编译之后,它并不是随着系统启动而直接活跃的,而是静静的躺在内核的某个角落里,此时是不可用的。应用程序想要调用该驱动,则必须先加载,然后才能使用。而且,使用完还存在一个卸载的过程。

2.要加载什么?

显而易见,是用来加载驱动模块的。

3.如何实现加载?

insmod命令都可以完成驱动模块的加载过程。下面以hello_driver.ko驱动模块为例来解释

进入hello.ko驱动模块文件所在的目录,然后直接输入下面的命令即可:

insmod hello_driver.ko

4.5.insmod命令解析

Linux insmod(英文全拼:install module)命令用于载入模块。

Linux有许多功能是通过模块的方式,在需要时才载入kernel。如此可使kernel较为精简,进而提高效率,以及保有较大的弹性。这类可载入的模块,通常是设备驱动程序。

4.6.补充:驱动模块的卸载和查看

上面既然已经了解了如何加载一个驱动模块,自然也要介绍一下如何卸载一个驱动模块。与加载命令对应。

rmmod

在任何目录下输入以下命令即可:

rmmod module_name

lsmod

查看模块

lsmod

5.大功告成,在开发板上运行程序即可

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值