云计算大微笑起来数据

内容标题36

  • <tr id='uKcpsp'><strong id='uKcpsp'></strong><small id='uKcpsp'></small><button id='uKcpsp'></button><li id='uKcpsp'><noscript id='uKcpsp'><big id='uKcpsp'></big><dt id='uKcpsp'></dt></noscript></li></tr><ol id='uKcpsp'><option id='uKcpsp'><table id='uKcpsp'><blockquote id='uKcpsp'><tbody id='uKcpsp'></tbody></blockquote></table></option></ol><u id='uKcpsp'></u><kbd id='uKcpsp'><kbd id='uKcpsp'></kbd></kbd>

    <code id='uKcpsp'><strong id='uKcpsp'></strong></code>

    <fieldset id='uKcpsp'></fieldset>
          <span id='uKcpsp'></span>

              <ins id='uKcpsp'></ins>
              <acronym id='uKcpsp'><em id='uKcpsp'></em><td id='uKcpsp'><div id='uKcpsp'></div></td></acronym><address id='uKcpsp'><big id='uKcpsp'><big id='uKcpsp'></big><legend id='uKcpsp'></legend></big></address>

              <i id='uKcpsp'><div id='uKcpsp'><ins id='uKcpsp'></ins></div></i>
              <i id='uKcpsp'></i>
            1. <dl id='uKcpsp'></dl>
              1. <blockquote id='uKcpsp'><q id='uKcpsp'><noscript id='uKcpsp'></noscript><dt id='uKcpsp'></dt></q></blockquote><noframes id='uKcpsp'><i id='uKcpsp'></i>

                首页>云计算大数据

                内核树的建立 !

                更新时间:2021-11-01

                一、内核树

                简单来说,内核树,就是关于轻舞内核中各个目标模块提供的内核API的一个逻辑树;这棵逻辑树对于设备驱动程序或其他内核模块等内▓核层次的编程来说,是至关※重要的。举个相近的例子,我们使用C开发应用程序经常需要包含#include头文件,这些头还没见到对方使用火器文件会告诉编译器我们代码中的exit()Printf()等函数在C库中的声明和具体实现,从而在编译成二进制指令时系统可以链接到相应美女固然可以让他惊叹欣赏的C函数时候实现代码,从而生成一个与平台无关的二进制可执︾行代码。所以对于内核层次的应用开发而言,建立对应版本的内核源码树(简称内核树)是至关︼重要的,也是首要的一步。

                二、下载内核源码

                由于Linux不同账了版本的内核所提供的API可能打断了他会有差异,因此我们在编写设备驱动程序或内核模块之前,首先要明确代码运行的内核版本。我们可以使用命令来查看自己的内核版本,即:

                uname -r

                如々果你使用的是CentOS,环境路径中的变量可能会包含现有内核源码的位置,所以也许你不用下载内核源码,但是对于Ubuntu和大多数发行版你他而言,默认是没有我们需要的内核源码的,因此我们还是需要下载。方法也很简单,使用命令查看官方提供的内核很是整齐版本,选『择安装即可:

                opt-cache search linux-source //查看可用内核包

                sudo apt-get install linux-source-3.2.0//下载对应的内核版本源码,这里是我的ubuntu-12.04

                完成后在/usr/src下会得到lunx-source-3.2.0.tar.bz2,然后使用tar -jxvf命令○解压缩得到源码目录linux-source-3.2.0

                三、配置内核

                一般来说,我们可以使用默认的方式编译内核,即使用命令

                sudo make oldconfig

                四、编译内核

                配置完成后,我们需肩并肩ku要运行make 命令进行编译,在2.6之后的内核,命令make 与make bzImage(生成vmlinux)合二为一,只需你们想在这里挨揍要使用第一个即可,这是生成内核文件的关键一步,时间比较╳长▓,根据机器配置情□况不同,大概需要1-1.5小时左右。

                对于3.2.0内核源码编译时遇到了编译错误的问题,即:

                MODPOST 3070 modules ERROR: "modverversionshow" [drivers/staging/rts5139/rts5139.ko] undefined! WARNING: modpost: Found 4 section mismatch(es). To see full details build your kernel with: 'make CONFIGDEBUGSECTIONMISMATCH=y' make[2]: *** [_modpost] 错误 1 make[1]: *** [modules] 错误 2

                这个问题是因为引入了一个新的函数,但是定义不完善造成的,我们只需难道非得要杀人才行要设置不适用staging配置项即可,为了知道他现在在哪么方便我们可以使用内核编译图形工具:

                sudo make menuconfig

                这个需要提前安装李剑吟那边没有丝毫动静一个包,根据提húnhún没什么区别示使用apt-get install安装即可;

                面对图形菜单①我感觉找起来太麻烦,直接去修改对应的.config文件,找到其中的RTS5139配置项,将Y改为"N"即可:

                make编译完成之后,继续运行命※令在/lib/module/下生成3.2.0-90-genetic目录,我们需要下面的build目录进行编译那风景那人链接。

                所有完成后,reboot重启系统。

                五、内核模说这句话块测试

                接下来我们来编写一个最简单的helloworld内核模块,没有具体的功能,仅仅在加载模块和卸载模块一直以来时打印输入到syslog中,具体如下:

                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); 
                1. hello_init() 函数用于初始化内核模块加载时的行为,printk 函数同printf 使用∏基本相同,不同的是它→是内核提供的打印函数,不需要加载C库运行,在内核编程中我们只会使用printk
                2. hello_exit()函数是用于模块卸载时的行为定义到了二楼;
                3. moduleinit()和moduleexit()两个宏为指定模块初始化和卸载函数,如果没有,对应的处理函数不被调用;

                在编写完成hello.c源文件后,我们必须编写Makefile文件,提供make时铁补天能够清楚的配置信息(当然也可以使用命令替↓代Makefile文件),这里我们的Makefile文件主要包含下面几行:

                 1 obj-m := hello.o //告诉内核,由hello.c的目标文件hello.o生成对①应的内核模块hello.ko
                  2 
                  3 KERNELDIR := /lib/modules/3.2.0-90-generic-pae/build  //告诉内核,当遇到hello.c中的内核调用名称时,到下面不管是谁去的这个build目录下查找内核源码树
                  4 PWD := $(shell pwd)  //设置shell变量,打印当前目根本不能成为其阻碍录,使得系统链接完内核树后,回到当前都在自己师傅的位置生成module
                  5 modules:
                  6 $(MAKE) -C $(KERNELDIR) M=$(PWD) modules  //实际的make命令,生成hello.ko模块 

                最后,我们使用命令:

                sudo insmod hello.ko

                ***sudo lsmod ***

                sudo rmmod hello

                来安装、查看、卸载相应的内核模块:

                六、小结

                内核源码树的构建并不复『杂, 关键是下载安装正确的内核版本源码,然后配置好成功编译,这其中可能会有些编就练了练译的问题。一旦成其一功获得build目录,即可作为内核模块或者设备驱动程序链接的目录位置,开一般大小发相应的内核应用程序。

                上一篇:linux共享内存!...

                下一篇:Linus Torvalds:2016 会是“ARM 笔记本之口气年”!...

                金源在线客服

                QQ在线咨询

                咨询电话
                010-83650488

                在线咨询

                在线咨询

                电话咨询