首页 > 系统相关 >Linux内核开发环境-代码编译

Linux内核开发环境-代码编译

时间:2024-09-14 13:48:54浏览次数:8  
标签:x86 make boot 编译 build Linux CONFIG 内核

建议点击这里查看个人主页上的最新原文

点击这里在哔哩哔哩bilibili在线观看配套的教学视频

点击这里在哔哩哔哩bilibili在线观看配套的加餐视频(就是一些补充)

点击跳转到内核课程所有目录

下面介绍Linux内核编译环境和测试环境的搭建过程,当然我也为各位朋友准备好了已经安装好的虚拟机镜像,只需下载运行即可。

点击这里从百度网盘下载对应平台的虚拟机镜像x86_64(也就是你平时用来安装windows系统的电脑,或者2020年前的苹果电脑)选择ubuntu-x64_64.ziparm64(2020年末之后的苹果电脑)选择ubuntu-aarch64.zip。虚拟机运行后,登录界面的密码是1

获取代码

用git下载内核代码,仓库链接可以点击内核网站上对应版本的[browse] -> summary查看,我们下载mainline版本的代码:

git clone https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux.git # 国内使用googlesource仓库链接比较快

也可以在/pub/linux/kernel/下载某个版本代码的压缩包。

编译步骤

建议新建一个build目录,把所有的编译输出存放在这个目录下,注意.config文件复制到build/.config.config配置文件至少要打开以下配置(建议通过make O=build menuconfig命令修改):

CONFIG_EXT4_FS
CONFIG_XFS_FS
CONFIG_VIRTIO_BLK
CONFIG_VIRTIO_NET
CONFIG_SCSI_VIRTIO
CONFIG_BLK_DEV_SD
CONFIG_BLK_DEV_NVME
CONFIG_BINFMT_MISC
rm build -rf && mkdir build
cp /home/sonvhi/chenxiaosong/code/tmp/configs/x86_64-config build/.config

编译和安装命令如下:

make O=build menuconfig # 交互式地配置内核的编译选项
make O=build olddefconfig -j`nproc`
make O=build bzImage -j`nproc` # x86_64
make O=build Image -j`nproc` # aarch64,比如2020年末之后的arm芯片的苹果电脑上vmware fusion安装的ubuntu
make O=build modules -j`nproc`
mkdir -p build/boot && make O=build install INSTALL_PATH=boot -j`nproc`
make O=build modules_install INSTALL_MOD_STRIP=1 INSTALL_MOD_PATH=mod -j`nproc`

x86_64下,如果是交叉编译其他架构,ARCH的值为arch/目录下相应的架构,编译命令是:

make ARCH=i386 O=build bzImage # x86 32bit
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-  O=build zImage # armel, arm eabi(embeded abi) little endian, 传参数用普通寄存器
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- O=build zImage # armhf, arm eabi(embeded abi) little endian hard float, 传参数用fpu的寄存器,浮点运算性能更高
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- O=build Image
make ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu- O=build Image

一些额外的补丁

如果你要更方便的使用一些调试的功能,就要加一些额外的补丁。

  • 降低编译优化等级,默认的内核编译优化等级太高,用GDB调试时不太方便,有些函数语句被优化了,无法打断点,这时就要降低编译优化等级。做好的虚拟机中已经打上了降低编译优化等级的补丁。比如x86_64架构下可以在x86_64目录下选择对应版本的补丁,更多详细的内容请查看GDB调试相关的章节。

  • dump_stack()输出的栈全是问号的解决办法。如果你使用dump_stack()输出的栈全是问号,可以 revert 补丁 f1d9a2abff66 x86/unwind/orc: Don't skip the first frame for inactive tasks。主线已经有补丁做了 revert: 230db82413c0 x86/unwind/orc: Fix unreliable stack dump with gcov

  • 肯定还有一些其他有用的补丁,后面再补充哈。

发行版替换内核

用发行版/boot/config-`uname -r` 配置文件,删除CONFIG_SYSTEM_TRUSTED_KEYSCONFIG_SYSTEM_REVOCATION_KEYS配置值,在编译环境上编译安装后,删除build/mod/lib/modules/xxx/buildbuild/mod/lib/modules/xxx/source链接文件,然后压缩(文件太多,不压缩复制会很慢)打包复制到待测环境上。

build/mod/lib/modules/xxx/复制到待测环境上的/lib/modules/路径,把build/boot/目录下的文件复制到待测环境上的/boot/路径下。

生成initrd.img,其中xxx为内核版本:

# centos
mkinitrd /boot/initrd.img-xxx xxx
# ubuntu
mkinitramfs -o /boot/initrd.img-xxx xxx

ubuntu下运行update-grubx86grub.cfg文件在/boot/grub/grub.cfgarm64grub.cfg文件在/boot/efi/boot/grub/grub.cfg。麒麟桌面系统要在把grub.cfg新生成的启动项里的security=kysec改成security= (注意后面有空格)。

标签:x86,make,boot,编译,build,Linux,CONFIG,内核
From: https://blog.csdn.net/chenxiaosongcsdn/article/details/142256539

相关文章

  • Linux基础入门 --10 DAY
    文本常见处理工具文件内容查看命令    cat    格式:cat[OPTION]...[FILE]...    常见选项:    -E:显示行结束符    -A:显示所有控制符    -n:对显示出的每一行进行编号    -b:对非空行进行编号    -s......
  • 交叉编译 MQTT 库
    一.编译openssl库1.原因因为MQTT客户端库依赖于openssl库,所以通常在移植MQTT客户端库的时候,需要先移植openssl、交叉编译openssl得到链接库文件以及头文件,然后再来编译MQTT客户端库。2.交叉编译openssl库流程2.1下载首先在官网上下载openssl源码,官网......
  • 必趣CB1核心板、H616主控linux验证IO模拟I2C驱动DS1307时钟芯片
    使用了#include<gpiod.h>内部库作为IO驱动`#ifndef __DS1307_Hdefine__DS1307_HdefineNUM_LEDS21//控制4个GPIO引脚defineCHIPNAME"gpiochip0"//GPIO芯片的名称defineWRITE_CMD 0x00defineREAD_CMD 0x01defineDEV_ADDR0xD0//......
  • Linux云计算 |【第三阶段】PROJECT1-DAY3
    主要内容:Keepalived高可用、部署Ceph分布式存储一、网站架构进阶项目案例案例1:Keepalived高可用延续PROJECT1-DAY2案例,部署两台代理服务器,实现如下效果:1)利用keepalived实现两台代理服务器的高可用(192.168.2.5/192.168.2.6)2)配置VIP为192.168.2.803)修改对应的域名解析......
  • Linux系统中重启服务器的方法!
    在Linux操作系统中,提供了多种方法用于重启服务器,那么Linux服务器如何重启?以下列举了常用的几种方法,希望对大家有所帮助,快来看看吧。重启Linux服务器有以下几种方法:1、使用命令行使用reboot命令reboot使用shutdown命令shutdown-rnow2、使用syste......
  • vsphere环境,扩容Linux标准磁盘及文件系统
    一、基础环境及目标概述1.查看基础环境[root@node3~]#df-ThFilesystemTypeSizeUsedAvailUse%Mountedondevtmpfsdevtmpfs3.8G03.8G0%/devtmpfstmpfs3.9G03.9G0%/dev/shmtmpfs......
  • Linux上文件的权限管理
    3.1文件/目录的权限3.1.1文件的权限每个文件都有其所有者(u:user)、所属组(g:group)和其他人(o:other)对它的操作权限,a:all则同时代表这3者。权限包括读(r:read)、写(w:write)、执行(x:execute)。在不同类型的文件上读、写、执行权限的体现有所不同,所以目录权限和普通文件权限......
  • C语言 ——— 学习并使用 #if …… #endif 条件编译指令
    目录何为条件编译指令常见的条件编译指令学习条件编译指令使用条件编译指令在程序预编译阶段,条件编译指令的代码转换多分支的条件编译指令何为条件编译指令在编译一个程序的时候,如果要将一条语句(一组语句)选择编译或者放弃时,就使用条件编译指令常见的条件编译指令#i......
  • C语言 ——— 条件编译指令实际用途
    目录前言头文件被包含的方式嵌套文件包含使用条件编译指令规避头文件多次包含 还有一个编译指令,同样能做到以上功能 前言条件编译指令多用于对头文件的定义和判断以及删除头文件被包含的方式本地文件包含(也就是自己创建的头文件):#include"stdio.h"本地文件包......
  • 一个linux下监听某个端口并拉起任务的shell脚本
    ​  创建监控脚本:#!/bin/bash#定义要监控的端口号PORT=8011whiletrue;do#使用netstat或ss命令检查端口是否存在if!ss-tuln|grep-q":$PORT";thenecho"$(date)端口$PORT不存在,正在尝试重启服务...">>./port_monitor.l......