20130718:Linux内核编译

2023-05-16

最近在学习《操作系统概念》一书,有些实验需要在系统内核中增加一些新的系统调用,由此便产生了修改内核源码并重新编译生成新内核的需求。我的思路是

首先搞定内核编译的流程,确保有个可用的实验环境,在此基础上再按照《操作系统概念》中的方法增加新的系统调用在内核中。

 

编译环境简单介绍下。

编译用的系统:Fedora core3,对应内核版本为2.6.9-1.677,gcc、make等都是fc3自带的,gcc是3.4.2,make是3.80,x86平台。

最开始下载了个2.6.36的内核源码,分别执行命令【make menuconfig】-【make bzImge】-【make modules】-【modules_install】-【make install】后,编译

生成的内核确实被部署在/boot/下,grub.conf中也增加了相应的启动项,但选中这一内核启动时便提示错误,目前没有搞明白到底是为什么,初步怀疑是新内核和

fc3系统的一些部分不兼容导致,因为目的是为了确保有个编译内核并可用的环境,便没有深究。

drivers/scsi/qla2xxx/qla_os.c: In function `qla2x00_queuecommand':
drivers/scsi/qla2xxx/qla_os.c:315: sorry, unimplemented: inlining failed in call to 'qla2x00_callback': function not considered for inlining
drivers/scsi/qla2xxx/qla_os.c:269: sorry, unimplemented: called from here
drivers/scsi/qla2xxx/qla_os.c:315: sorry, unimplemented: inlining failed in call to 'qla2x00_callback': function not considered for inlining
drivers/scsi/qla2xxx/qla_os.c:269: sorry, unimplemented: called from here
make[3]: *** [drivers/scsi/qla2xxx/qla_os.o] 错误 1
make[2]: *** [drivers/scsi/qla2xxx] 错误 2
make[1]: *** [drivers/scsi] 错误 2
make: *** [drivers] 错误 2


 

接下来下载了和fc3内核对应的2.6.9的源码,但在【make modules】时总是不成功,提示信息大概是与scsi相关的一些函数不是inline类型的,把【make bzImage】

生成的内核拷贝到/boot/下,并在grub.conf中增加相应启动项,结果启动菜单中选择新编译的内核启动时提示“unrecognized file format”,仔细检查发现把内核搞

错了,把源码目录linux-2.6.9下生成的vmlinux文件当做内核了,(虽然咨询过朋友说这个也是内核,但很明显文件格式都不一样),正确的应该用linux-2.6.9/arch/i386/

boot/目录下的bzImage,朋友们千万记住了哦。很遗憾的是即便用了正确的内核,发现启动过程中又提示无法加载/lib/modules等,总之依然报错,只是错误发生在启动

过程中了,同样,也没有时间去找原因。

 

最后,找了个Fedora Core14的系统,对应内核版本为2.6.35.6,gcc版本是4.5.1,make版本是3.82,依然是x86平台。下载与之对应的2.6.35.6的源码,解压至/usr/src下,

便生成了源码目录/usr/src/linux-2.6.35.6。编译内核的过程如下:

[root@fc14]#mv linux-2.6.35.6.tar.gz /usr/src

[root@fc14]#tar -xvzf linux-2.6.35.6.tar.gz

[root@fc14]#cd linux-2.6.35.6

[root@fc14]#make mrproper                           

[root@fc14]#make menuconfig                      # 配置内核

[root@fc14]#make dep                                     # 创建内核配置的依赖关系树

[root@fc14]#make clean                                  # 清楚旧版的*.o文件

[root@fc14]#make bzImage                            # 制作核心文件

[root@fc14]#make modules                           # 制作相关模块

[root@fc14]#make modules_name              # 安装模块到/lib/modules/`uname -r` 目录

[root@fc14]#make install                                # 安装内核文件到目录/boot

 

这时切换到/boot/下发现新的内核已经在了,grup.conf中也增加了相应的启动项,重启系统,选择编译后的新内核,成功启动。

下面对这个过程中自己所理解的一些东西进行描述,如有不当之处,欢迎各位指正。

 

make mrproper---这个命令用来确保源代码目录下没有不正确的目标.o文件以及文件的互相依赖,同时,还会删除源码目录下

的.config文件。.config文件中保存的是内核配置,新下载的源码包中是没有的,而且也不会存在不正确的.o文件等,因此这一步

对新下载的源码包可以省略。当你要对现有系统升级内核,而不修改内核的相关配置时,可以将当前系统的.config文件

(如果能找到的话O(∩_∩)O)拷贝到源码目录下使用。这一命令建议都执行一下,确保内核源码包中的内容是干净的。

 

有人说这一步后要确保/usr/include/目录下的asm、linux、scsi等连接是指向要升级的内核源码的,我没明白是为什么,也没有

做这一步。

 

make menuconfig---这是最常用来配合内核选项的命令,是基于文本选项的配置界面,字符终端下推荐使用。网上有人说要使用

这个命令必须安装ncurses-dev和tk4-dev库,因为我的机器上默认就能用,所以也没有验证这一点。当然还有基于文本的【make config】

和基于图形窗口的【make xconfig】(xwindows下推荐使用)。另外,【make oldconfig】据说是如果只想在原来内核配置的基础上

修改一些小地方可以使用,应该和上面说的“升级现有内核”但不修改配置等同,没有验证。

配置完成后保存退出,也会生成.config文件。

 

make dep---此命令用啦读取配置过程生成的.config配置文件,并创建对应于配置的依赖关系树,从而确定哪些需要编译,哪些不需要

编译。不过大家都说这条命令在2.6及以后的内核编译中都不再需要,如果执行就会出现“***Warning: make de is unnecessary now”

的提示。我编译2.6.9和2.6.35.6的内核时都执行过,确实是这个提示。

 

make bzImage----这个就是编译内核的命令了。此外还有【make zImage】,但zImage是用gzip压缩的,适合存储在软盘上。bzImage

是更大的超过软盘空间限制的压缩内核,我这里用的是bzImage。这个命令在目录/usr/src/linux-2.6.35.6/arch/i386/boot/下创建bzImage

文件,当然,这个文件是一个链接,指向../../x86/boot/bzImage,也就是真正的内核文件。

 

make modules---这个命令用来编译以生成相应的内核模块。

 

make modules_install---这个命令会在/lib/modules/目录下生成相应的2.6.35.6目录,该目录下即为编译过的内核模块。

/lib/modules/x.y.z是模块在系统中的标准目录。

 

make install---安装内核。这一命令会将生成的/usr/src/System.map、/usr/src/linux-2..35.6/arch/i386/boot/bzImage拷贝

到/boot/下,并修改grub.conf启动菜单配置,实际上就是将编译出的内核安装到当前系统中。

 

至此,编译内核过程完成,而且已经安装到当前系统,重启系统发现启动项中多了新内核的启动项,选择之,启动即可。

 

 

【make modules】 以及【make modules_install】命令有人说不必要,目前为止我还没搞清楚它和编译内核的关系,但

感觉其生成的内核模块(即*.ko)文件在内核运行过程中若需要加载时是需要的,所以建议还是一起做了。

 

补充:

额外模块的安装。----------------这是从网上摘抄的,没有试验过。

比如我现在给机器加了个Intel 3945的无线网卡,那么要使其能正常使用,就要安装其对应的驱动模块。

tar -xvzf ipw3945-1.2.2.gz

cd ipw3945-1.2.2

将编译出来的模块文件ipw3945.ko一道核心目录,并更新模块的依赖属性:

cp ipw3945.ko /lib/modules/`uname -r`/kernel/drivers/net

cd /lib/modules/`uname -r`

depmod -a

 

开机自动加载模块:

cd /etc/sysconfig/modules

echo "modprobe ipw3945" >> my.modules

chmod 755 my.modules

重启后查看模块是否加载:

lsmod |grep ipw3945

ps:每次更新kernel后需要重新编译一次额外添加的模块。

 

核心模块管理:

lsmod :列出所有模块

modinfo:查看模块信息

modprobe:-c      查看配置文件

                       -l       列出所有模块

                       -r      移除模块

insmod:插入模块

rmmod:删除模块

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

20130718:Linux内核编译 的相关文章

  • OpenWrt无线桥接同网段主路由的方法

    OpenWrt无线桥接同网段主路由的方法 注 xff1a 有些版本的openwrt需要将DNS转发关闭 xff0c 否则无法上网
  • mybatis-sql语句莫名其妙被加上limit分页条件或未执行查询条件

    1 背景 在优化代码 xff0c 查询sql执行情况时 xff0c 突然发现写的查询条件突然发现被加了limit参数 以为遇到了bug xff0c 查了半天 结果是同事在另一业务代码里查询时用了开启了分页 xff0c 但后面业务其实没用到
  • 2020-11-03

    ios工作层设备 一层 xff08 物理层 xff09 xff1a 网卡 集线器 中继器 二层 xff08 数据链路层 xff09 xff1a 网桥 交换机 xff08 暴露真实mac地址 xff09 三层 xff08 网络层 xff09
  • 2020-12-08

    代码简介 xff1a python读取excel数据 xff0c 并汇总结果 xff0c 统计厂商个数 xff0c 每个厂商的版本个数 xff0c 提测型号种类 xff0c 厂商总的测试通过率 import xlrd import open
  • vue echart入门柱状图

    不知道为啥script只能这样引入才显示图片 span style background color f3f4f5 color 000000 import as echarts from 39 echarts 39 span lt temp
  • Brup盲注,测sql注入

    第一步 xff0c 先拦截接口 xff0c 发送到intrude 第二步 xff1a 对需要注入的参数值添加 第三步 xff1a 加载脚本文件 第三步 xff1a 攻击后 xff0c 查看是否有注入成功的脚本 备注 xff1a sql注入脚
  • vue处理后端的数据

    方法一 xff1a 如果后端是已类的方式传递给前端数据 xff0c 直接res data读取参数 方法二 xff1a vue请求后端返回的数据res object object 使用JSON stringify xff08 xff09 和J
  • 调用带有签名的API接口,字符串转化成JSONObject 处理返回的结果

    一 调用带有签名的API接口 xff08 sign已加密 xff09 String Url 61 34 http xxx 2000 dcs xxxxx 34 43 34 param1 61 34 43 param1 43 34 amp no
  • SIPP压测环境安装部署,以及脚本编写

    1 首先去官网下载sipp的tar包 xff0c 然后把sipp 3 4 1 tar gz上传到liunx下自建的目录或者home目录 xff08 rz 上传sz 下载 xff09 2 将sipp 3 4 1 tar gz进行解压 xff0
  • vue父组件与子组件通信

    在父组件上弹出子组件 父组价代码 lt template gt lt div gt lt div class 61 39 container 39 gt lt el button type 61 39 primary 39 icon 61
  • cf1214C C. Bad Sequence

    C Bad Sequence time limit per test1 second memory limit per test512 megabytes inputstandard input outputstandard output
  • Windows10安装Golang环境

    Windows10安装Golang环境 下载 https go dev dl 一般选择zip压缩版 xff0c 例如 xff1a go1 20 2 windows amd64 zip 配置 编辑系统变量PATH xff0c 加入解压目录下的
  • 安全测试--crlf

    知其然要知其所以然 CRLF是 回车 43 换行 xff08 r n xff09 的意思 在HTTP协议中 xff0c HTTP Header与HTTP Body是用两个CRLF分隔的 xff0c 浏览器就是根据这两个CRLF来取出HTTP
  • vue 前端下载excel的n中方法

    1 直接下载html中的表格元素 lt table id 61 34 table 34 border 61 34 1 34 gt lt tr style 61 34 height 50px 34 gt lt th style 61 34 w
  • 自动化测试平台搭建之路

    自动化测试所涉及的软件及安装包 xff08 64位系统 xff09 python 2 7 测试需要的语言 xff08 python2 7以上自带pip 包管理工具 xff09 wxPython2 8 unicode Python语言的一套优
  • 接口测试

    目前正在做接口测试 xff0c 被人博客中看到的 xff0c 总结的不错 xff0c 复制粘贴来的 xff0c 选择性借鉴 一 什么是接口测试 接口测试 xff1a 测试系统组件间接口的一种测试 主要用于检测外部系统与系统之间以及系统内部各
  • 阿里笔试_ //如果有人n分钟内,连续发帖M次,将本人封杀掉

    如果有人n分钟内 xff0c 连续发帖M次 xff0c 将本人封杀掉 算法思想 xff1a Arrylist存储点击的记录 HashMap xff08 用户 xff0c 发帖时间 xff0c 次数 xff09 HashSet xff08 封
  • 基于RF的web自动化测试

    前提 xff1a 安装python 配置好自动化测试的框架RobotFrame框架 1 web的自动化测试基于库Selenium2Library 而此库又依赖这4个关联的库 xff1a decorator xff0c selenium ro
  • 接口和抽象类

    收藏的别人的 xff0c 总结的清晰易懂 一 抽象类 1 抽象类 包含一个抽象方法的类就是抽象类 2 抽象方法 声明而未被实现的方法 xff0c 抽象方法必须使用abstract关键词字声明 1 2 3 4 5 6 public abstr
  • jmeter请求ipv6

    ipv6改造 1 在nginx服务器上重新配置nginx conf文件 xff08 配置信息如下 xff09 2 nginx服务上 xff0c ping 查看 ipv6的地址 3 在nginx服务器上能 ping6 xxxx xxx 0 x

随机推荐

  • jmeter 数据库压测

    第一步 xff1a 第二步 xff1a 下图若选择永远 xff0c 1分钟内达到最大并发量40 xff0c 立即循环执行 xff0c 持续执行5min 第三步 xff1a 第四步 xff1a 这里的Mysql需要和下图中的一致 测试结果 x
  • 压测服务器的搭建及测试执行

    一个项目可能存在多个环境 开发的调试环境 xff0c 测试人员的测试环境 xff0c 专门压测的压测环境 一般测试环境和压测环境由测试人员维护 xff0c 因为考虑压力测试设计到高并发 xff0c 高性能 xff0c 在不知代码质量的情况下
  • c语言学生宿舍管理系统( 文件(二进制文本存储),链表版)

    实现简单的学生宿舍基本信息管理 xff0c 宿舍的基本信息包括楼号 房间号 面积 所容纳人数 已入住人数等 xff0c 系统以文本菜单形式工作 登录时 xff1a 用户名为asd 密码任意 include lt stdio h gt inc
  • mock工程的编写和应用

    mock方法体的编写 xff1a 首先明确自己要mock的方法 xff0c 需要传入的参数和需要返回的参数 xff0c 然后明确路径 xff0c 一 xff1a 如下图解 xff0c 我们需要mock一个 传入json对象和传出json对象
  • Linux使用hdparm检测硬盘信息

    一 安装hdparm centos sudo yum install hdparm ubuntu 银河麒麟 sudo apt get install hdparm 二 使用 查看硬盘的读取速度及缓存速度速度 hdparm tT dev sd
  • linux系统导入CA证书

    英文版出处 xff1a http majic rs blog system wide installation of certificates 因为众所周知的原因 xff0c 同步android源码成了非常痛苦的事情 迫不得已采用了goag
  • C语言中无符号数和有符号数的左移和右移

    在单片机开发中 xff0c 通常会使用左移和右移操作做快速的乘法和除法运算 例如 xff0c 将0x0001左移1位 xff0c 相当于乘以2 1左移2位相当于乘以2 2 xff0c 以此类推 xff0c 左移n位 xff0c 相当于乘以2
  • UIButton-UIControlEvents(事件)

    UIControlEvents UIControlEventTouchDown span class token comment 单点触摸按下事件 xff1a 用户点触屏幕 xff0c 或者又有新手指落下的时候 span UIControl
  • Debian普通用户获取root权限|sudo的安装与配置

    Debian系统的普通用户需要安装软件时 xff0c 往往会收到 Permission denied 的提示 xff0c 这时候需要root权限 那么如何在不登陆超级管理员账户的前提下拥有root权限呢 xff1f 对于大多数Linux系统
  • 电脑桌面文件不见了怎么恢复?

    众所周知 xff0c 我们都会在电脑桌面上放置各种文件 文件夹等 xff0c 这样很容易造成文件堆积过多 xff0c 桌面杂乱无章 xff0c 影响查找文件速度 这不可避免的要对电脑桌面进行整理 xff0c 但有时候我们会出现重要文件突然就
  • CCF之“毫无头绪”

    1 CCF之任务调度 xff1a 试题编号 xff1a 201403 5 试题名称 xff1a 任务调度 时间限制 xff1a 1 0s 内存限制 xff1a 256 0MB 问题描述 xff1a 问题描述 有若干个任务需要在一台机器上运行
  • Matika版OpenStack伪生产环境部署-keystone

    身份服务概述 OpenStack认证管理服务提供一个单点集成身份验证 授权和服务目录服务 其他OpenStack服务使用认证服务作为一个通用统一的API 此外 服务提供用户的信息 但不包括在OpenStack 如LDAP服务 可以集成到一个
  • 异步套接字基础:select函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET使用说明

    select函数 xff1a 系统提供select函数来实现多路复用输入 输出模型 原型 xff1a include lt sys time h gt include lt unistd h gt select函数 xff1a 系统提供se
  • 7-53 两个有序序列的中位数 (25 分)

    已知有两个等长的非降序序列S1 S2 设计函数求S1与S2并集的中位数 有序序列A 0 A 1 AN 1的中位数A N 1 2的值 即第 N 43 1 2 个数 xff08 A 0为第1个数 xff09 输入格式 输入分三行 第一行给出序列
  • PROC系列之---/proc/stat/

    包含了所有CPU活动的信息 xff0c 该文件中的所有值都是从系统启动开始累计到当前时刻 work 64 builder cat proc stat cpu 432661 13295 86656 422145968 171474 233 5
  • PROC系列之---/proc/pid/stat

    proc stat 包含了所有CPU活跃的信息 xff0c 该文件中的所有值都是从系统启动开始累计到当前时刻 root 64 localhost cat proc 6873 stat 6873 a out R 6723 6873 6723
  • PROC系列之---/proc/pid/statm

    proc statm 包含了所有CPU活跃的信息 xff0c 该文件中的所有值都是从系统启动开始累计到当前时刻 root 64 localhost cat proc self statm 654 57 44 0 0 334 0 输出解释 C
  • Linux下使用socket传输文件的C语言简单实现

    简单的C语言实现 xff0c 客户端通过TCP协议向服务器端请求传输的文件 xff0c 服务器端收到请求后向客户端发送文件 服务器程序和客户端程序应当分别运行在两台计算机上 在运行服务器端的计算机终端执行 xff1a file server
  • 设置linux进程优先级和CPU亲和性(转载)

    进程cpu资源分配就是指进程的优先权 xff08 priority xff09 优先权高的进程有优先执行权利 配置进程优先权对多任务环境的linux很有用 xff0c 可以改善系统性能 还可以把进程运行到指定的CPU上 xff0c 这样一来
  • 20130718:Linux内核编译

    最近在学习 操作系统概念 一书 xff0c 有些实验需要在系统内核中增加一些新的系统调用 xff0c 由此便产生了修改内核源码并重新编译生成新内核的需求 我的思路是 首先搞定内核编译的流程 xff0c 确保有个可用的实验环境 xff0c 在