Linux 2.6内核的编译步骤及模块动态加载

MQTT阿里云OTA 调试记录 2.验证,这个验证是什么意思呢,就是阿里云会把你包的信息,比如包大小,streamid(相当于包的识别码),版本号发送给你的设备,然后如果你没发送升级成功的包给阿里云,这里会是一直验证中的状态,那你的设备每次重新连接阿里云,发送connect包给阿里云的时候,阿里云就会发送一次这个验证(upgrade)包。提取到了之后就可以发送请求包了,这个请求包比较坑,也可能是我没付费,他的包一次最多只有1024个字节的数据。之前说了,验证状态下,设备发送connect包给阿里云,阿里云就会发一个upgrade包给你。 阅读详情
本文是基于2.6的内核,也建议各位可以先看一下《 Linux内核 设计与实现(第二版)》作为一个 基础 知识的铺垫。当然,从实践角度来看,只要按着以下的步骤去做也应该可以实现成功编译内核及加载 模块 。
  个人用的Linux版本为:Debian GNU/Linux,内核版本为:2.6.20-1-686.

  第一步,下载Linux内核的源代码,即构建LDD3( Linux Device Drivers 3rd)上面所说的内核树。

  如过安装的Linux系统中已经自带了源代码的话,应该在/usr/src 目录 下。如果该目录为空的话,则需要自己手动下载源代码。下载代码的方法和链接很多,也可以在CU上通过http://download.chinaunix.net/search/?key=&q=kernel&frmid=53去下载。不过,下载的内核版本最好和所运行的Linux系统的内核版本一致。当然,也可以比Linux系统内核的版本低,但高的话应该不行(个人尚未实践)。

  Debian下可以很方便的通过Debian源下载:

  首先查找一下可下载的内核源代码:

  # apt-cache search linux-source

  其中显示的有:linux-source-2.6.20,没有和我的内核版本完全匹配,不过也没关系,直接下载就可以了:

  # apt-get install linux-source-2.6.20

  下载完成后, 安装 在/usr/src下,文件名为:linux-source-2.6.20.tar.bz2,是一个压缩包,解压缩既可以得到整个内核的源代码:

  # tar jxvf linux-source-2.6.20.tar.bz2

  解压后生成一个新的目录/usr/src/linux——source-2.6.20,所有的源代码都在该目录下。

  注:该目录会因内核版本的不同而不同,各位动手实践的朋友只需知道自己的源代码所在的具体位置即可。

  第二步:配置及编译内核。

  进入/usr/src/linux——source-2.6.20目录下,可以看到Makefile文件,它包含了整个内核树编译信息。该文件最上面四行是关于内核版本的信息。对于整个Makefile可以不用做修改,采用默认的就可以了。

  一般情况下,需要先用命令诸如"make menuconfig", "make xconfig"或者"make oldcofig"对内核进行配置,这几个都是对内核进行配置的命令,只是它们运行的环境不一样,执行一下这几个命令中的任何一个即可对内核进行配置:

  make menuconfig是基于界面的内核配置方法,make xconfig应该是基于QT库的,还有make gcofig也是基于图形的配置方法,应该是需要GTK的环境,make oldcofig就是对内核树原有的.config文件进行配置一下即可。

  其实内核的配置部分,主要是保证内核启动模块可 动态 加载的配置,默认配置里面应该已经包含了这样的内容,因此,我用的是make oldconfig.

  在内核源码的目录下执行:

  # make

  # make bzImage

  其中,第一个make也可以不执行,直接make bzImage。这个过程可能要持续一个小时左右,因此是对整个内核重新编译了。执行结束后,可以看到在当前目录下生成了一个新的文件: vmlinux, 其属性为-rwxr-xr-x。

  然后执行:

  # make modules

  # make modules_install

  对内核的所有模块进行编译和安装。

  执行结束之后,会在/lib/modules下生成新的目录/lib/modules/2.6.20/。 在随后的编译模块文件时,要用到这个路径下的build目录。至此,内核编译完成。可以重启一下系统。

  第三步:编写模块文件及Makefile

  以LDD3上的hello.c为例:

//hello.c
#include <linux/init.h>
#include <linux/module.h>
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文件的内容为:

obj-m := hello.o
KERNELDIR := /lib/modules/2.6.20/build
PWD := $(shell pwd)

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

modules_install:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install

clean:
    rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions

  其中,hello.c和Makefile文件应该位于同一个目录下,可以放在/home下,我的两个文件都位于/home/david/.

  第四步:编译和装载模块

  在文件所处的目录下,执行:

  debian:/home/david # make

  然后查看该目录下有哪些文件生成:

debian:/home/david # ls -l
总计 28
drwxr-xr-x 2 david david 4096 2007-02-07 17:49 Desktop
-rw-r--r-- 1 david david  462 2007-07-20 13:42 hello.c
-rw-r--r-- 1 root  root  2432 2007-07-20 13:55 hello.ko
-rw-r--r-- 1 root  root   607 2007-07-20 13:55 hello.mod.c
-rw-r--r-- 1 root  root  1968 2007-07-20 13:55 hello.mod.o
-rw-r--r-- 1 root  root  1140 2007-07-20 13:55 hello.o
-rw-r--r-- 1 david david  267 2007-07-20 13:48 Makefile
-rw-r--r-- 1 root  root     0 2007-07-05 14:11 Module.symvers

 可见,已经生成 模块 文件hello.ko.

  然后,就可以加载该模块:

  debian:/home/david # insmod hello.ko

  查看模块是否加载进内核:

  debian:/home/david # lsmod

  Module Size Used by

  hello 1344 0

  nfs 219468 0

  nfsd 202224 17

  …… ……

  其中Module名为hello的即为我们所加载的模块.

  卸载模块:

  debian:/home/david # rmmod hello

  同样可以通过lsmod来查看该模块是否被卸载.

  这里有两个问题,其一就是printk()输出的问题.LDD3上也说,在加载和卸载模块的时候都会有信息输出在 屏幕 上,如果在Windows下通过终端仿真器(我们常用的虚拟机算是一种),则在屏幕上看不到任何输出.我同时在虚拟机和和物理机都运行了该模块,均未看到有"Hello, world"(加载模块时printk的输出)或"Goodby, cruel world"(卸载模块时printk的输出). 这个不知道是我操作系统发行版的原因还是系统配置的问题,请了解这个问题的朋友指点一下.

  其二,书上讲到如果屏幕上看不到信息,可能输出在某个日志 文件 里面了,并说可能在/var/log/messages文件中.并且看到网上很多网友也说是输出到这个文件里面.我不知道有没有发现输出在其他日志文件里的,不过我的这个信息输出在/var/log/syslog里面.在加载和卸载完该模块后, 执行命令:

  debian:/home/david # cat /var/log/syslog | grep world

  可以看到有两行 内容 .当然,也可以不用grep world, 应该会出现在最后两行.

  Jul 20 14:15:29 localhost kernel: Hello, world

  Jul 20 14:15:34 localhost kernel: Goodbye, cruel world

  这就是printk应该输出的信息.

  这里有另外一个方法,可以实现printk的信息输出在屏幕上,即更改printk输出的优先级.例子中的优先级为:KERN_ALERT,优先级为<1>,如果将优先级改为KERN_EMERG即<0>,则可以看到屏幕的输出信息.

  修改的方法只是修改一下hello.c中两句printk()的内容,修改后的hello.c如下:

     #include <linux/init.h>
 #include <linux/module.h> 
MODULE_LICENSE("Dual BSD/GPL");
 static int hello_init(void) 
{ printk(KERN_EMERG "Hello, world/n"); /*改动部分*/ 
return 0; } 
static void hello_exit(void) 
{ printk(KERN_EMERG"Goodbye, cruel world/n"); /*改动部分*/ 
} 
module_init(hello_init);
 module_exit(hello_exit);
  同样的方法编译生成模块,再次用insmod和rmmod,则在屏幕上看到的输出信息为:

     debian:/home/david# insmod hello.ko 
debian:/home/david# Message from syslogd@localhost at Fri Jul 20 14:27:32 2007 ... 
localhost kernel: Hello, world 
debian:/home/david# rmmod hello 
debian:/home/david# Message from syslogd@localhost at Fri Jul 20 14:27:42 2007 ... 
localhost kernel: Goodbye, cruel world 
debian:/home/david
  但是,是否能够将printk()的优先级改为KERN_EMERG值得商榷.因为在 Linux Kernel Development中,对该优先级的描述为: An emergency condition; the system is probably dead.

  以上就是整个2.6内核编译步骤以及模块 动态 加载的方法.理解和解释有误的地方,也请各位浏览本文的朋友指点,也希望能和对内核和驱动感兴趣的朋友交流。

Synopsys AXI VIP 从环境搭建到首个验证场景运行 本文详细介绍了Synopsys AXI VIP从环境搭建到首个验证场景运行的全过程,包括VIP安装、示例工程生成、验证环境解析、仿真调试技巧及进阶优化。特别针对AXI协议验证中的常见问题提供了实用解决方案,帮助工程师快速掌握这一SoC验证必备工具。 阅读详情

相关推荐

Unity3D实战:用EasyAR4.0稀疏空间地图打造AR导航应用(附完整代码)

本文详细介绍了如何使用Unity3D和EasyAR4.0的SparseSpatialMap功能构建AR导航应用。通过稀疏空间地图技术,开发者可以创建室内导航系统,解决传统GPS在室内环境中的局限性。文章包含完整代码示例,涵盖环境配置、地图构建、导航实现及性能优化等关键步骤,助力开发者快速掌握AR导航开发技巧。

t8u9v0的博客 1197

【Linux】linux 终端报Message from syslogd

最近有一台Linux服务器,用xshell连接上去之后 终端一直报Message from syslogd 敲个命令,都被打断了。 解决方式 编译配置文件 vim /etc/rsyslog.conf 注视掉蓝色部分 # Everybody gets emergency messages #*.emerg * 重启rsyslog服务 systemctl restart rsyslog 过几分钟,就再也没有看到烦人的输出了。 转载于:https://blog..

qq_37472274的博客 7590

SolidWorks+ADAMS双验证:你的机械臂力矩计算真的靠谱吗?

本文探讨了机械臂力矩计算中手工计算的局限性,并介绍了SolidWorks和ADAMS双验证方法的重要性。通过实际案例展示了动态工况下传统计算方法的误差,详细解析了SolidWorks精准质心捕捉和ADAMS动力学仿真的关键技术,帮助工程师构建计算-仿真-实测闭环验证流程,确保机械臂设计的可靠性和安全性。

grafana6viz的博客 230

Linux模块编译

内核模块是Linux内核向外部提供的一个插口,其全称为动态可加载内核模块(Loadable Kernel Module,LKM),我们简称为模块。模块具有以下特点:   1 模块本身不被编译入内核映像,从而控制了内核的大小   2 模块一旦被加载,它就和内核中的其他部分一样       一、 什么是模块       模块是具有独立功能的程序,它可以被单独编译,但不能独立运行。它在运行时被链接

宇宙的起源 1988

Python量化交易入门:天勤量化TqSdk保姆级教程(含避坑指南)

本文提供Python量化交易入门指南,重点介绍天勤量化TqSdk的使用方法,包括环境配置、核心API实战、策略开发技巧及实盘部署。教程涵盖中国期货市场,帮助个人投资者快速掌握量化交易技术,避开常见陷阱。

weixin_29065791的博客 836

解决Jupyter Notebook中Plotly图表显示问题

摘要:在Jupyter Notebook中使用Plotly绘图时遇到图表无法显示的问题。通过分析发现Python 3.12版本与Jupyter存在兼容性问题。解决方案是将Python降级到3.11版本,重新创建虚拟环境后图表正常显示。这表明版本兼容性对数据可视化工具至关重要,环境配置检查是解决问题的关键步骤。该案例为遇到类似问题的开发者提供了参考方案。

m0_74337424的博客 125

linux 终端报Message from syslogd

最近有一台Linux服务器,用xshell连接上去之后终端一直报Message from syslogd敲个命令,都被打断了,比较蛋疼。google了一下,终于找到了解决办法编译配置文件vim /etc/rsyslog.conf注视掉蓝色部分# Everybody gets emergency messages#*.emerg ...

weixin_33713707的博客 8702

深入解析:AndroidManifest.xml 与 Qt 6.7.0 的整合

本文探讨了在Qt 6.7.0和CMake构建Android应用时,AndroidManifest.xml未被正确识别的问题。通过分析CMake配置错误、文件路径问题等可能原因,提出了在CMakeLists.txt中明确指定路径、确保目录结构正确等解决方案,并给出了示例项目演示。文章强调正确配置AndroidManifest.xml对获取权限和应用功能的重要性,为Qt开发者提供了实用的调试建议。

2501_90323865的博客 110

Linux 2.6内核的编译步骤及模块的动态加载

本文是基于2.6的内核,也建议各位可以先看一下《Linux内核设计与实现(第二版)》作为一个基础知识的铺垫。当然,从实践角度来看,只要按着以下的步骤去做也应该可以实现成功编译内核及加载模块。  个人用的Linux版本为:Debian GNU/Linux,内核版本为:2.6.20-1-686.  第一步,下载Linux内核的源代码,即构建LDD3(Linux Device Dr

axlrosek的专栏 1232

kaggle学习笔记-餐厅数据挖掘

分析Zomato数据集的基本思想是为了公平地了解影响在班加罗尔不同地方建立不同类型餐厅的因素,每个餐厅的总评级,班加罗尔是这样一个城市,拥有超过12,000家餐厅,餐厅供应来自世界各地的菜肴。每天都有新的餐馆开业,这个行业还没有饱和,需求也在与日俱增。然而,尽管需求不断增加,新餐馆却很难与老牌餐馆竞争。大多数餐厅都供应同样的食物。班加罗尔是印度的IT之都。这里的大多数人主要依靠餐馆的食物,因为他们没有时间自己做饭。由于对餐馆的需求如此巨大,因此研究一个地方的人口统计学就变得很重要。

优快云XXCQ的博客 1862

1、世界级模拟电路设计指南

本文详细探讨了模拟电路设计的各个方面,从基础概念到实际应用,涵盖了元件选择、滤波器设计、反馈系统、噪声问题以及SPICE仿真的优缺点。文中还提供了设计实例和无计算机设计方法,旨在帮助工程师提升模拟电路设计的效率与可靠性。

s1t2u3的博客 97

模块静态编译到内核和编译成模块实例

【实验目的】 配置编译支持目标板的Linux-2.6.22.6的内核,熟悉Linux内核的配置选项和编译过程。 熟悉模块静态编译到内核和编译成模块,动态加载的方法和过程。 【实验环境】 1、主  机:Ubuntu 10.10 发行版 [首先得配置好开发环境] 2、目标机:FS2410开发板以及移植好的u-boot-2010.03、内核源码包:linux-2.6.22.6.tar.bz2(

Winston 1261

uniapp - web-view嵌套H5网页白屏问题,<web-view>页面跳转出现白屏情况,强力解决uniapp嵌套webview页面时出现无法加载并白屏(无论本地还是线上H5网页链接都能解决)

uniapp微信小程序,uniapp APP端,uni-app web-view嵌套H5项目白屏问题分析及解决,uniapp嵌套webview页面时,出现白屏,uniapp <web-view>页面跳转出现白屏解决方法,uniapp <web-view>页面跳转出现白屏解决方法,解决uniapp的web-view打开网页在老手机上出现白屏的问题,uni-app web-view白屏处理,引入本地网页白屏,WebView 加载不出网页,一片空白webview白屏加载不出来,使用webview加载链接后白屏,u

🏆 前端领域优质创作者 1万+

linux驱动模块的动态加载和静态加载

这里主要介绍动态加载: 一,编译,在指点内核树下编译,生成.o文件或.ko文件 二,将生成的.o或.ko文件拷到相应目录,一般是/lib/module/kernel下面 三,用insmod命令加载,用rmmod命令卸载    下面以举例的形式详细说明情况,需要注意的是,2.4内核与2.6内核不同,下面这个例子 真针对2.6内核,在2.4内核上我没试验成功,待研究: 1),源码:  #

L_yangliu的专栏 8130

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Linux动态加载内核模块

Linux属于单内核,为了弥补单内核扩展性与维护性差的缺点,Linux引入动态可加载内核模块,模块可以在系统运行期间加载到内核或从内核卸载。模块是具有独立功能的程序,它可以被单独编译,但不能独立运行。它在运行时被链接到内核作为内核的一部分在内核空间运行。模块通常由一组函数和数据结构组成,用来实现一种文件系统、一个驱动程序或其他内核上层的功能。下面是一个简单的例子: (1)模块hello.c文件#i

傻红就是不爱跑步的博客 2万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Linux 内核的编译步骤及模块动态加载

以LDD3上的hello.c为例: //hello.c #include #include MODULE_LICENSE("Dual BSD/GPL"); static int hello_init(void) { printk(KERN_ALERT "Hello, world\n"); return 0; } static void hello_ex

听风的雨滴 1225

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【Linux】内核的编译和加载

Linux内核是操作系统的核心,负责管理系统的硬件资源,并为用户空间的应用程序提供必要的服务。内核的编译和加载是操作系统开发和维护的重要环节。本文将详细介绍Linux内核的编译过程以及如何加载内核到系统中。

极客代码 1811
上一篇: Linux后门系列--由浅入深sk13完全分析
下一篇: 揭示恶意的Linux内核模块是如何工作
ender049
博客等级 码龄20年 7粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值