Linux内核编译(版本6.0以及版本v0.01)并用qemu驱动

系统环境:
ubuntu-22.04.1-desktop-amd64
目标平台:
x86 i386
内核版本:
linux-6.0.1
linux-0.0.1

环境配置

修改root密码
sudo passwd
修改软件源(非必要)
vmtools安装(实现win-linux软件互传)
安装一些必须的软件

  • sudo apt install build-essential openssh-server vim net-tools gcc-arm-linux-gnueabi qemu-system-x86 libssl-dev ncurses-dev genext2fs pigz lrzsz unzip

(build-essential”,它包含了 GNU 编辑器集合,GNU 调试器,和其他编译软件所必需的开发库和工具)
(qemu-system-x86 安装qemu)

rootfs 构建

1. cd /path/to/workspace

  • 进入到指定的工作目录,即工作空间的根目录。

2. wget https://buildroot.org/downloads/buildroot-2021.08.tar.gz

  • 使用wget命令从指定URL下载buildroot-2021.08.tar.gz文件。
  • wget是一个用于在命令行中下载文件的工具。

3. tar -xvzf buildroot-2021.08.tar.gz

  • 对buildroot-2021.08.tar.gz文件进行解压缩。
  • tar命令用于解压缩和归档文件,选项x表示提取,v表示显示详细信息,z表示使用gzip进行压缩。

** 4.cd buildroot-2021.08**

  • 进入解压后的buildroot-2021.08目录。

** 5. make menuconfig**

  • 使用make命令运行buildroot的配置菜单。
  • 这个命令打开一个文本界面,允许用户选择构建配置选项。

6.在配置菜单中进行以下选择:

  • Target options -> Target Architecture 选择 i386
    ■ 设置目标架构为i386,表示将构建适用于i386架构的系统。
  • Toolchain -> Enable C++ support 打开
    ■ 启用C++支持,表示构建时将包括对C++的支持。

7.make

  • 使用make命令开始构建buildroot环境。
  • make命令会根据之前的配置选项编译构建root文件系统和交叉编译工具链。

8. export PATH=pwd/output/host/bin:$PATH

  • 将构建生成的交叉编译工具链路径添加到当前的环境变量中。
  • export命令用于设置环境变量,这里将路径添加到PATH变量中,使其可执行文件可在命令行中直接使用。

9. cd …

  • 返回到上一级目录。

10.mkdir rootfs

  • 在当前目录下创建一个名为rootfs的文件夹。

11. cd rootfs

  • 进入rootfs文件夹。

12. tar vxf …/buildroot-2021.08/output/images/rootfs.tar

  • 解压缩之前构建生成的root文件系统(rootfs)。
  • v表示显示详细信息,x表示提取,f表示指定要提取的文件。

13. find . | cpio -o -H newc | pigz -5 > pwd/rootfs.img

  • 使用find命令找到当前目录中的所有文件,并将其通过管道传递给cpio命令。
  • cpio命令将文件打包为newc格式的cpio归档文件。
  • "|"符号将前一个命令的输出作为后一个命令的输入。
  • pigz命令将输入的数据进行压缩,并将结果写入到rootfs.img文件中。
  • -5表示使用较高的压缩级别,值越大压缩率越高。
  • pwd表示当前工作目录的路径,将rootfs.img文件写入到rootfs文件夹中。
    ** 总结如下代码**
wget https://buildroot.org/downloads/buildroot-2021.08.tar.gz
tar -xvzf buildroot-2021.08.tar.gz
cd buildroot-2021.08
make menuconfig
#Target options -> Target Architecture 选择 i386Toolchain -> Enable C++ support 打开
make
export PATH=`pwd`/output/host/bin:$PATH
cd ..
mkdir rootfs
cd rootfs
tar vxf ../buildroot-2021.08/output/images/rootfs.tar
find . | cpio -o -H newc | pigz -5 > `pwd`/rootfs.img

编译linux kernel

1.$cd /path/to/workspace
进入到指定的工作目录,即工作空间的根目录。

2.$wget https://mirror.tuna.tsinghua.edu.cn/kernel/v6.x/linux-6.0.1.tar.gz

使用wget命令从指定URL下载Linux内核源代码的压缩包。
这里下载的是Linux 6.0.1版本的源代码。

3.$ tar -xzvf linux-6.0.1.tar.gz

对Linux内核源代码压缩包进行解压缩。
tar命令用于解压缩和归档文件,选项x表示提取,z表示使用gzip进行压缩,v表示显示详细信息。

4.$ cd linux-6.0.1

进入解压后的Linux内核源代码目录。

5.$ make ARCH=i386 defconfig
使用make命令为i386架构配置内核的默认配置选项。
ARCH=i386表示编译针对i386架构的内核。
defconfig表示使用默认的配置选项文件进行配置。

6.$ make ARCH=i386 bzImage
使用make命令编译内核并生成bzImage文件。
ARCH=i386表示编译针对i386架构的内核。
bzImage是一个压缩的内核镜像文件,是Linux内核的一种常见格式。
这些代码的目的是下载Linux内核源代码,并在指定架构下进行配置和编译,最终生成一个bzImage文件,该文件可以作为启动Linux系统的内核镜像
cd /path/to/workspace
wget https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/snapshot/linux-5.14.tar.gz
tar -xzvf linux-5.14.tar.gz
cd linux-5.14

make ARCH=i386 defconfig
make ARCH=i386 bzImage

执行完应该是这样子:
file

qemu驱动

在linux-6.0.1目录

qemu-system-i386 -m 2048M -kernel arch/i386/boot/bzImage --append "root=/dev/ram0 rdinit=/linuxrc console=ttyS0 " smp 1 -nographic -serial mon:stdio -initrd …/rootfs/rootfs.img

  • qemu-system-i386: 这是运行 qemu-system 系统的命令。
  • -m 2048M: 指定系统的内存大小为 2048MB。
  • -kernel arch/i386/boot/bzImage: 指定内核镜像的路径为 arch/i386/boot/bzImage,这是 mu-system 内核的路径。
    *-append "root=/dev/ram0 rdinit=/linuxrc console=ttyS0 ": 这是内核启动参数,用于传递给内核的命令行参数。其中包含以下参数:
  • root=/dev/ram0: 将 /dev/ram0 设置为根文件系统,这表示使用内存中的一个 RAM 磁盘作为根文件系统。
  • rdinit=/linuxrc: 指定初始化进程的路径为 /linuxrc。
  • console=ttyS0: 将串口设备 ttyS0 设置为系统的控制台输出。
  • smp 1: 启用对称多处理 (SMP) 模式,并指定处理器数量为 1。
  • -nographic: 禁用图形界面显示,只使用命令行界面。
  • -serial mon:stdio: 将串口设备连接到标准输入/输出,从而可以通过标准输入输出进行交互。
  • -initrd …/rootfs/rootfs.img: 指定初始 RAM 磁盘映像的路径为 …/rootfs/rootfs.img,这是包含根文件系统的映像文件。
    file

file
-----------------------------------------------------分界线(不相干的另外一个part)补丁-------------------------------------------

Linux0.0.1编译运行

环境:

  • Ubuntu22.04.1
  • gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
  • qemu

Step1.克隆源码
path/to/work
git clone https://github.com/mahadevvinay/Linux_0.01

file

step2.打上补丁,使源代码与最新的 gcc 版本兼容,并进行编译
work/Linux_0.01
cd Linux_0.01
patch -p1 < linux_0.01_Compilations_changes.patch

file
step3.编译源码
make
file
step4.驱动(在用户状态执行)
sudo qemu-system-i386 -drive format=raw,file=Image,index=0,if=floppy -boot a -hdb Images/linux-0.11.img -m 8 -machine pc-i440fx-2.5
成功如下:
在这里插入图片描述

tips

由于linux0.01年代久远,要打上不少补丁:
不要少:

sudo apt install bin86 gcc-multilib build-essential qemu-system-x86 libssl-dev

make失败
所有Makefile文件加上-std = gnu89
file
file
sudo apt install gcc-multilib
file

file

增加选项 -nographic

一些文件补丁:
/home/work2/Linux_0.01/tools/build.c
file
/home/work2/Linux_0.01/fs/bitmap.c
file
/home/work2/Linux_0.01/fs/namei.c
file
/home/work2/Linux_0.01/include/asm/segment.h
file
/home/work2/Linux_0.01/kernel/fork.c
file
/home/work2/Linux_0.01/kernel/console.c
file

/home/work2/Linux_0.01/kernel/hd.c
file

探索路上小小记录…

主页链接:http://www.xiaocr.fun/

本文由博客一文多发平台 OpenWrite 发布!

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

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

相关文章

DevOps本地搭建笔记(个人开发适用)

需求和背景 win11 wsl2 armbian(玩客云矿渣&#xff09;&#xff0c;构建个人cicd流水线&#xff0c;提高迭代效率。 具体步骤 基础设施准备 硬件准备&#xff1a;一台笔记本&#xff0c;用于开发和构建部署&#xff0c;一台服务器&#xff0c;用于日常服务运行。 笔记本…

Celery知识

celery介绍 # celery 的概念&#xff1a; * 翻译过来是芹菜 * 官网&#xff1a;https://docs.celeryq.dev/en/stable/ # 是分布式的异步任务框架&#xff1a; 分布式&#xff1a;一个任务&#xff0c;拆成多个任务在不同机器上做 异步任务&#xff1a;后台执行…

【Greenhills】MULTIIDE集成第三方的编辑器进行源文件编辑工作

【更多软件使用问题请点击亿道电子官方网站查询】 1、 文档目标 在使用GHS进行工作的时候&#xff0c;可以集成第三方的编辑器进行源文件编辑工作 2、 问题场景 用于解决在GHS中进行项目开发时&#xff0c;对于GHS的编辑器使用不习惯&#xff0c;想要切换到其他第三方的编辑…

漏洞发现-漏扫项目篇武装BURP浏览器插件信息收集分析辅助

知识点 1、插件类-武装BurpSuite-漏洞检测&分析辅助 2、插件类-武装谷歌浏览器-信息收集&情报辅助 章节点&#xff1a; 漏洞发现-Web&框架组件&中间件&APP&小程序&系统 扫描项目-综合漏扫&特征漏扫&被动漏扫&联动漏扫 Poc开发-Ymal语…

Qt QDateTime类使用

一.Qt datetime 介绍 Qt中的QDateTime类是用于处理日期和时间的组合的类&#xff0c;它提供了丰富的功能来操作和格式化日期时间数据。以下是其主要特点和用法&#xff1a; 构造函数&#xff1a;QDateTime可以通过组合QDate&#xff08;日期&#xff09;和QTime&#xff08;时…

TypeScript编译选项

编译单个文件&#xff1a;终端 tsc 文件名 自动编译单个文件&#xff1a;终端 tsc 文件名 -w 编译整个项目&#xff1a;tsc 前提是得有ts的配置文件tsconfig.json 自动编译整个项目&#xff1a;tsc --w tsconfig.json默认文件内容&#xff1a; tsconfig.json是ts编译器的配…

阿里云服务器Ngnix配置SSL证书开启HTTPS访问

文章目录 前言一、SSL证书是什么&#xff1f;二、如何获取免费SSL证书三、Ngnix配置SSL证书总结 前言 很多童鞋的网站默认访问都是通过80端口的Http服务进行访问&#xff0c;往往都会提示不安全&#xff0c;很多人以为Https有多么高大上&#xff0c;实际不然&#xff0c;他只是…

C库函数-getopt函数总结学习

1、简介 getopt函数是命令行参数解析函数 1、1命令行组成 Command name 程序文件名 operands 操作对象 option 选项 option argument 选项参数 getopt()函数将传递给mian()函数的argc,argv作为参数&#xff0c;同时接受字符串参数optstring – optstring是由选项Option字母组…

前端Vue列表组件 list组件:实现高效数据展示与交互

前端Vue列表组件 list组件&#xff1a;实现高效数据展示与交互 摘要&#xff1a;在前端开发中&#xff0c;列表组件是展示数据的重要手段。本文将介绍如何使用Vue.js构建一个高效、可复用的列表组件&#xff0c;并探讨其在实际项目中的应用。 效果图如下&#xff1a; 一、引言…

【前端】HTML常用标签

因为想当个全栈&#xff0c;所以巩固了一下HTML与CSS和JS基础&#xff0c;这一篇博客是HTML部分 文章目录 HTML 基础标签 1HTML 基础框架HTML 基础标签语义标签文本格式化标签div 与 span 标签图像标签超链接特殊字符 基础标签 2 | 表格表格的使用表格标签表格属性表格的头部与…

利用tree命令自动保存文件层级结构

tree命令的使用 为了将上图左侧的文件目录&#xff0c;生成上图右侧中的文件夹结构列表&#xff0c;保存在txt中&#xff0c;使用了如下cmd命令&#xff1a; C:\armadillo-12.8.0>tree .>list.txt以上tree命令分为3部分&#xff1a; tree 命令. 在当前目录>list.tx…

JavaEE:网络编程

网络编程&#xff1a;通过代码完成基于网络的跨主机通信 跨主机通信方式&#xff1a; 1.TCP/IP网络 2.蓝牙通信 3.近场通信NFC 4.毫米波通信&#xff1a;功率高&#xff0c;带宽高&#xff0c;抗干扰能力差 其中TCP/IP网络是日常编程中最常涉及到的&#xff0c;最通用的跨主机通…

docker私有仓库-harbor的搭建

docker 官方提供的私有仓库 registry&#xff0c;用起来虽然简单 &#xff0c;但在管理的功能上存在不足。 Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器&#xff0c;harbor使用的是官方的docker registry(v2命名是distribution)服务去完成。harbor在docker di…

Java项目:基于springboot实现的OA协同办公系统(源码+数据库+毕业论文)

一、项目简介 本项目是一套基于Springbootvue实现的付费自习室系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、…

Processing基本形状内容和实例

一、Processing的基本形状内容和实例 1.Processing有一组专门绘制基本图形得图案。像线条这样的基本图形可以被连接起来创建更为复杂得形状&#xff0c;例如一片叶子或者一张脸。 2.为了绘制一条直线&#xff0c;我们需要四个参数&#xff0c;两个用于确定初始位置&#xff0c;…

Xterminal:未来的终端体验

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 开发环境篇 ✨特色专栏&#xff1a; M…

【vue.js】文档解读【day 4】 | 事件处理

如果阅读有疑问的话&#xff0c;欢迎评论或私信&#xff01;&#xff01; 文章目录 事件处理前言监听事件内联事件处理器方法事件处理器方法与内联事件判断在内联处理器中调用方法在内联事件处理器中访问事件参数修饰符事件修饰符按键修饰符常规按键别名系统按键别名组合按键ex…

(C语言)strcpy与strcpy详解,与模拟实现

目录 1. strcpy strcpy模拟实现&#xff1a; 实现方法1&#xff1a; 实现方法2&#xff1a; 2. strcat strcat模拟实现&#xff1a; 1. strcpy 作用&#xff1a;完成字符串的复制。 头文件&#xff1a;<string.h> destination是字符串要复制到的地点&#xff0c;s…

【轮式平衡机器人】——TMS320F28069片内外设之eCAP

引入 TMS320F28069的eCAP&#xff08;增强型捕获模块&#xff09;是一个强大的外设&#xff0c;用于精确测量和捕获输入信号的事件和时间戳。 在电机控制、传感器数据采集和信号处理等应用中&#xff0c;eCAP模块可以用于测量霍尔传感器、编码器或其他数字输入信号的周期、频…

开源爬虫技术在金融行业市场分析中的应用与实战解析

一、项目介绍 在当今信息技术飞速发展的时代&#xff0c;数据已成为企业最宝贵的资产之一。特别是在${industry}领域&#xff0c;海量数据的获取和分析对于企业洞察市场趋势、优化产品和服务至关重要。在这样的背景下&#xff0c;爬虫技术应运而生&#xff0c;它能够高效地从互…