Ubuntu下的Linux内核的编译及安装

推荐群:C/C++大学技术协会:145655849
Linux中的模块(Modules)
Linux的module其实可以看作是内核的插件。
在Linux系统中,可以通过文件

cat /proc/modules
xxxxxxxxxx1 1cat /proc/modules

查看相关的驱动模块。
也可以通过命令

lsmod
xxxxxxxxxx1 1lsmod

查看,lsmod只是将/proc/modules中的内容做了格式化排版。

设备驱动是模块的一种,它用于为系统上层提供针对硬件的操作。除硬件设备的驱动外,内核模块也是内核扩展功能的一种方式,即有些模块并没有对应的硬件,而是纯软件的运行在0环的代码,如内核级的防火墙(网络模块)。

使用命令

insmod
xxxxxxxxxx1 1insmod

或者

modprobe
xxxxxxxxxx1 1modprobe

可以在内核中插入模块。两者的区别在于,modprobe的功能更强,并且会自动解决依赖问题。

编译及启用Linux内核
随系统发行的Linux内核的头文件(在/usr/src下),不一定与当前系统的内核二进制文件一致,甚至有可能不全。
所以在做内核开发前,最好些自己重编译、安装一份内核。
参考 https://wiki.ubuntu.com/Kernel/BuildYourOwnKernel

获取源码
通过以下命令下载源码

apt-get source linux-image-(uname−r)xxxxxxxxxx11apt−getsourcelinux−image−(uname -r) xxxxxxxxxx1 1apt-get source linux-image-(unamer)xxxxxxxxxx11aptgetsourcelinuximage(uname -r)

设置编译依赖
通过以下命令,将build的依赖环境,配置(下载)为与将要编译的内核一致:

sudo apt-get build-dep linux-image-(uname−r)xxxxxxxxxx11sudoapt−getbuild−deplinux−image−(uname -r) xxxxxxxxxx1 1sudo apt-get build-dep linux-image-(unamer)xxxxxxxxxx11sudoaptgetbuilddeplinuximage(uname -r)

编译内核
进入源码根目录下,执行

fakeroot debian/rules clean

quicker build:

fakeroot debian/rules binary-headers binary-generic binary-perarch

if you need linux-tools or lowlatency kernel, run instead:

fakeroot debian/rules binary
xxxxxxxxxx5 1fakeroot debian/rules clean2# quicker build:3fakeroot debian/rules binary-headers binary-generic binary-perarch4# if you need linux-tools or lowlatency kernel, run instead:5fakeroot debian/rules binary

将在上层目录下,得到几个deb文件:

cd …
ls *.deb
linux-headers-4.8.0-17_4.8.0-17.19_all.deb
linux-headers-4.8.0-17-generic_4.8.0-17.19_amd64.deb
linux-image-4.8.0-17-generic_4.8.0-17.19_amd64.deb
xxxxxxxxxx5 1cd …2ls *.deb3 linux-headers-4.8.0-17_4.8.0-17.19_all.deb4 linux-headers-4.8.0-17-generic_4.8.0-17.19_amd64.deb5 linux-image-4.8.0-17-generic_4.8.0-17.19_amd64.deb

安装测试新内核
sudo dpkg -i linux4.8.0-17.19.deb
sudo reboot
xxxxxxxxxx2 1sudo dpkg -i linux4.8.0-17.19.deb2sudo reboot

设置编译时产生调试符号信息
sudo apt-get install pkg-config-dbgsym
fakeroot debian/rules clean
fakeroot debian/rules binary-headers binary-generic binary-perarch skipdbg=false
xxxxxxxxxx3 1sudo apt-get install pkg-config-dbgsym2fakeroot debian/rules clean3fakeroot debian/rules binary-headers binary-generic binary-perarch skipdbg=false

使用Make系统手工编译内核及加入模块
以上的方法是Ubuntu的apt-get系统提供的,可以方便地获取源码、编译及安装。
但是对于理解内核编译过程,自己加入驱动模块的用处不大。

将自己的驱动模块加入源码目录中
将自己的源码文件(hello.c)放入到内核源码的./drivers/char目录下,我的测试文件的内容为:

/*

  • $Id: hello.c,v 1.5 2004/10/26 03:32:21 corbet Exp $
    */
    #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);
​x 1/* 2 * $Id: hello.c,v 1.5 2004/10/26 03:32:21 corbet Exp $ 3 */ 4#include <linux/init.h>5#include <linux/module.h>6MODULE_LICENSE(“Dual BSD/GPL”);7​8static int hello_init(void)9{10 printk(KERN_ALERT “Hello, world\n”);11 return 0;12}13​14static void hello_exit(void)15{16 printk(KERN_ALERT “Goodbye, cruel world\n”);17}18​19module_init(hello_init);20module_exit(hello_exit);

编辑Kconfig文件以及Makefile文件
因为我们要使用可视化的

make menuconfig
xxxxxxxxxx1 1make menuconfig

工具来定义内核的编译选项,这需要用到开源的命令行图行库libcurses,可以先安装:

sudo apt-get install libncurses5-dev libncursesw5-dev
xxxxxxxxxx1 1sudo apt-get install libncurses5-dev libncursesw5-dev

接着,通过编辑Kconfig文件,来设置菜单内容(curses通过读取Kconfig来展示菜单)
打开./driver/char目录下的Kcofnig文件(Kconfig的语法可以参考内核源码目录下的Documentation/kbuild/kconfig-language.txt)。
找到类似以下内容:

config BFIN_OTP
tristate “Blackfin On-Chip OTP Memory Support”

help
If you say Y here, you will get support for a character device

If unsure, it is safe to say Y.
xxxxxxxxxx7 1config BFIN_OTP2 tristate "Blackfin On-Chip OTP Memory Support"3…4 help5 If you say Y here, you will get support for a character device6 …7 If unsure, it is safe to say Y.

依照它的格式,在其后加入:

config MYMODULE
tristate “A new module just for test!”
default n
help
nothing for usage, left blank
xxxxxxxxxx5 1config MYMODULE2 tristate "A new module just for test!"3 default n4 help5 nothing for usage, left blank

接着,再编辑./driver/char目录下的Makefile文件,在依照该文件中的其它项,在最后加入内容:

obj-(CONFIGMYMODULE)+=hello.oxxxxxxxxxx11obj−(CONFIG_MYMODULE) += hello.o xxxxxxxxxx1 1obj-(CONFIGMYMODULE)+=hello.oxxxxxxxxxx11obj(CONFIG_MYMODULE) += hello.o

其中CONFIG_之后的MYMODULE对应了在Kconfig中的目录设置,其中的hello.o对应了源码的文件名(hello.c)。

编译
此时,回到源码的根目录,运行命令

make menuconfig
xxxxxxxxxx1 1make menuconfig

在device drviers -> character drivers下,找到我们新添的MYMODULE项,并通过空格,设置为M状态,表示以模块的方式编译。
在这里插入图片描述
在源码根目录下运行

make modules
xxxxxxxxxx1 1make modules

若一切顺利,在./drivers/char/目录下,会得到hello.ko,即内核模块文件。

安装
使用insmod安装模块,使用lsmod查看模块,使用rmmod删除模块,使用dmesg查看内核模块的输出信息。

insmod hello.ko
1insmod hello.ko

参考资料,推荐群:C/C++大学技术协会:145655849
The Linux Kernel Module Programming Guide
Linux内核源码中的:Documentation/kbuild/的几个txt文档

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

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

相关文章

执行公式_一学就会,一吃就瘦,超简单又好执行的减肥食谱公式!

对于很多人来说&#xff0c;没有精确计算食物重量的条件&#xff0c;无法每天花费大量的时间精力去自己准备健康的食物&#xff0c;给大家一个不需要食物称&#xff0c;只要在日常饮食基础上看看自己的手掌就能通过类比来选择好食物的种类和合适比例的方法&#xff01;碳水化合…

apollo源码分析 感知_Kitty中的动态线程池支持Nacos,Apollo多配置中心了

目录回顾昨日nacos 集成Spring Cloud Alibaba 方式Nacos Spring Boot 方式Apollo 集成自研配置中心对接无配置中心对接实现源码分析兼容 Apollo 和 Nacos NoClassDefFoundErrorApollo 自动刷新问题回顾昨日上篇文章 《一时技痒&#xff0c;撸了个动态线程池&#xff0c;源码放 …

c语言 把字符串转换为变量名_如何将抓取下来的unicode字符串转换为中文

如果抓取的数据是json数据&#xff0c;那么直接将抓取的数据用json格式输出出来就行了。如下:response requests.get(url, headersself.headers).json()如果是unicode字符串&#xff0c;那么请继续往下看大家有没有遇见抓取下来的数据是unicode字符串的&#xff1f;如下图所示…

c++ 读取访问权限冲突_Linux系统利用可执行文件的Capabilities实现权限提升

一、操作目的和应用场景Capabilities机制是在Linux内核2.2之后引入的&#xff0c;原理很简单&#xff0c;就是将之前与超级用户root(UID0)关联的特权细分为不同的功能组&#xff0c;Capabilites作为线程(Linux并不真正区分进程和线程)的属性存在&#xff0c;每个功能组都可以独…

Python 数据分析 Matplotlib篇 时间序列数据绘制折线图(第4讲)

Python 数据分析 Matplotlib篇 时间序列数据绘制折线图(第4讲)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹…

家装强电弱电布线图_家装水电施工标准(图文版),装修小白一眼也能看懂。...

如果把家比喻成一个人&#xff0c;房子是骨骼&#xff0c;那么水电路则相当于人体的血管和动脉&#xff0c;正因为他们的存在&#xff0c;才赋予家鲜活的生命。由此&#xff0c;水电施工自然也成为家装工程的重中之重。水电走线原则※ 水电弹线放样施工&#xff0c;使用切割机开…

0基础必看:如何轻松成为C语言高手

诞生于上世纪70年代的C语言是一门古老的语言了, 但作为一门底层语言,时至今日它仍然非常强大。学习C语言能够为学习其他更复杂的语言打下良好的基础&#xff0c;因为你在C语言中学习到的知识对几乎所有的编程语言都适用。下面就来看看如何开始用C语言编程吧。   工具   Mic…

python列表元素之和_python实现计算列表元素之和

目标&#xff1a;定义一个数字列表&#xff0c;并计算列表元素之和。 例如&#xff1a; 输入 : [12, 15, 3, 10] 输出 : 40 方法一&#xff1a;total 0 list1 [11, 5, 17, 18, 23] for ele in range(0, len(list1)): total total list1[ele] print("列表元素之和为: &…

双水泵轮换工作原理图_一用一备式冷凝水泵应急电源的设计与实现

为保障山西通州集团兴益化工有限公司10万吨甲醇工程一用一备式冷凝水泵的安全运行&#xff0c;专门设计动力负载应急电源。作者阐述了动力负载应急电源基本原理及其控制系统设计&#xff0c;经现场调试运行&#xff0c;动力负载应急电源很好满足生产现场要求。山西通州集团兴益…

基础学习——C语言递归解决分鱼问题

如有小伙伴想学习C语言基础&#xff0c;可以进群731871503进行交流学习&#xff0c;提升编程&#xff0c;共同进步 问题描述 A、B、C、D、E这5个人合伙夜间捕鱼&#xff0c;凌晨时都已经疲惫不堪&#xff0c;于是各自在河边的树丛中找地方睡着了。第二天日上三竿时&#xff0…

memkind版本查看_不同价位值得买轻薄本推荐~2020国庆篇

说起轻薄本&#xff0c;你理想中的一台优秀机型是什么样的&#xff1f;轻薄便携、质感上乘、高颜值、逼格、手感佳、续航持久、屏幕素质高、独立小键盘、性能激进……和游戏本的鲜明对比&#xff0c;注定了是两种不同的“菜”。2020年&#xff0c;随着AMD的崛起&#xff0c;部分…

main方法 如何去掉http debug日志_在MyBatis中如何使用collection标签实现嵌套查询?...

# 需求升级在上篇博客《一对多的关系&#xff0c;在MyBatis中如何映射&#xff1f;》中&#xff0c;我们实现了需求&#xff1a;根据用户id查询用户信息的同时获取用户拥有的角色。因为角色可以拥有多个权限&#xff0c;所以本篇博客我们升级需求为&#xff1a;根据用户id查询用…

movielens推荐系统_案例|推荐系统的评估指标

推荐系统能够为用户提供个性化体验&#xff0c;现在基本上各大电商平台、资讯平台都会用推荐系统为自家评价下的用户提供千人千面的服务。平均精度均值&#xff08;Mean Average Precision&#xff0c;MAP&#xff09;便是评估推荐系统性能的度量标准之一。但是&#xff0c;使用…

mysql群集配置_CentOS7 - 建立一个MySQL集群

Standing up a MySQL cluster此配方将指导您完成设置MySQL群集的过程。 通过跨多个系统划分数据并维护副本以避免单点故障&#xff0c;群集数据库可以应对可伸缩性和高可用性的挑战。集群的成员称为节点。 MySQL集群中有三种节点类型&#xff1a;数据节点&#xff0c;API节点和…

叮!您收到一份超值Java基础入门资料!

Java语言有什么特点&#xff1f;如何最大效率的学习&#xff1f;深浅拷贝到底有何区别&#xff1f;阿里巴巴高级开发工程师为大家带来Java系统解读&#xff0c;带你掌握Java技术要领&#xff0c;突破重点难点&#xff0c;入门面向对象编程&#xff0c;以详细示例带领大家Java基…

jop怎么读音英语怎么说_“春晚”英语怎么说?

大家都说近年来的春节年味越来越淡&#xff0c;每年陪老人一起看春晚、上网吐槽春晚&#xff0c;应该算是最有年味的一件事了吧&#xff01;你期待今年的春晚吗&#xff1f;在春晚即将开播之际&#xff0c;先和我一起了解一些有关“春晚”的英语知识吧&#xff01;01、“春晚”…

2019 年软件开发人员必学的编程语言 Top 3

这篇文章将探讨编程语言世界的现在和未来&#xff0c;这些语言让新一代软件开发者成为这个数字世界的关键参与者&#xff0c;他们让这个世界变得更健壮、连接更加紧密和更有意义。开发者要想在 2019 年脱颖而出&#xff0c;这三门语言一定要关注。 作为软件开发者&#xff0c;…

小数据量计算最大lyapunov代码_Software | 计算Lyapunov指数的GUI工具箱及函数包汇总...

二十年前读书时用过的Lyapunov Exponents Toolbox&#xff0c;推荐给做非线性动力学入门的同学们。那个时候不会编写程序&#xff0c;做分支图、算连续或者离散系统的Lyapunov指数&#xff0c;极其困难&#xff0c;还好有这个工具箱&#xff0c;慢慢看源程序学会写一点改进的程…

git 小乌龟 更新分支_git常用操作

Git 是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或小或大的项目。Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。Git 与常用的版本控制工具 CVS, Subversion 等不同&#xff0c;它采用了分布式版本库的方式&a…

web 服务器 内存 影响_C/C++服务器开发常用的7大开源库,让你在同行中脱颖而出...

C/C服务器开发7大常用开源库&#xff0c;在这里简单介绍一下。1、OpenSSLOpenSSL是一个开放源代码的安全套接字层密码软件库&#xff0c;囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议&#xff0c;应用程序可以使用这个包来进行安全通信&#xff0c;避免窃听&…