要学习linux内核,先要能够编译内核,还需要了解内核如何启动根文件系统。这样你才能在修改linux内核代码之后,完成验证的过程。

本文教你完成下列过程:

1.下载linux并编译linux内核源码

2.编译busybox

3.制作一个最小的根文件系统

4.qemu启动你编译好的内核和根文件系统

linux源码下载地址:

mirrors.edge.kernel。org/pub/linux/kernel/

我选择的版本是:4.9.229

cdn.kernel。org/pub/linux/kernel/v4.x/linux-4.9.229.tar.xz

下载到本地,解压,然后进入linux-4.9.229目录:

1.指定硬件体系架构。

为了减少安装编译器的过程,我在本例中使用的是x86,因为我的开发环境就是x86。如果你要编译arm的内核,则指定ARCH=arm且需要安装交叉编译器。

# export ARCH=x86

2.配置board config,此处配置为 x86_64_defconfig。好了,我们点好菜了,菜单就是x86_64_defconfig

# make  x86_64_defconfig

3.配置内核

这一步其实是对第2步的菜单进行微调,我们需要内核支持ramdisk驱动,所以需要选中如下配置:

General setup  --->----> [*] Initial RAM filesystem and RAM disk (initramfs/initrd) supportDevice Drivers  --->[*] Block devices  ---><*>   RAM block device support(65536) Default RAM disk size (kbytes)

4.编译内核

# make

编译成功后的内核位于:arch/x86_64/boot/bzImage

下载buysbox源码,下载地址:

busybox。net/downloads/

我使用的版本是busybox-1.30.0

1.解压buysbox源码

# tar xvf busybox-1.30.0.tar.bz2

2.配置buysbox源码

在这里我们把busybox配置为静态编译,这样busybox在运行的时候就不需要额外的动态链接库了。

# make menuconfig
Busybox Settings  --->Build Options  --->[*] Build BusyBox as a static binary (no shared libs)

3.编译和安装

#make && make install

4.编译完成后的busybox就安装在源码根目录下的_install目录了,我们进入_install目录,补充一些必要的文件或目录,相关的shell命令原文链接如下:

# mkdir etc dev mnt
# mkdir -p etc/init.d/
# vim etc/fstab
proc  /proc proc  defaults 0 0
temps /tmp  rpoc  defaults 0 0
none  /tmp  ramfs defaults 0 0
sysfs /sys  sysfs defaults 0 0
mdev  /dev  ramfs defaults 0 0
# vim etc/init.d/rcS
mkdir -p /proc
mkdir -p /tmp
mkdir -p /sys
mkdir -p /mnt
/bin/mount -a
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
# chmod 755 etc/init.d/rcS
# vim etc/inittab
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
::askfirst:-/bin/sh
::cttlaltdel:/bin/umount -a -r
# chmod 755 etc/inittab
# cd dev
# mknod console c 5 1
# mknod null c 1 3
# mknod tty1 c 4 1 

这样一个最小的、完整的可以被内核启动的文件系统就齐活啦。

制作根文件系统镜像文件。

思路:

1.先制作一个空的镜像文件;

2.然后把此镜像文件格式化为ext3格式;

3.然后把此镜像文件挂载,并把根文件系统复制到挂载目录;

4.卸载该镜像文件。

5.打成gzip包。

#!/bin/bash
rm -rf rootfs.ext3
rm -rf fs
dd if=/dev/zero of=./rootfs.ext3 bs=1M count=32
mkfs.ext3 rootfs.ext3
mkdir fs
mount -o loop rootfs.ext3 ./fs
cp -rf ./_install/* ./fs
umount ./fs
gzip --best -c rootfs.ext3 > rootfs.img.gz 

最终生成的文件系统镜像名字为:rootfs.img.gz

准备好了内核和文件系统镜像,幸福的一刻马上来临了:

通过qemu模拟器启动我们自己编译的内核和文件系统:

# qemu-system-x86_64 \-kernel ./linux-4.9.229/arch/x86_64/boot/bzImage  \-initrd ./busybox-1.30.0/rootfs.img.gz   \-append "root=/dev/ram init=/linuxrc"  \-serial file:output.txt

这样一个完整的最小linux系统就起来啦:

好了,经过以上的步骤,你可以自己编译一个内核和文件系统。有了这样的基础,你在之后就可以自由的修改linux内核代码并run起来进行验证啦。

带你阅读linux内核源码:下载源码、编译内核并运行一个最小系统相关推荐

  1. 最小的linux内核代码,带你阅读linux内核源码:下载源码、编译内核并运行一个最小系统...

    要学习linux内核,先要能够编译内核,还需要了解内核如何启动根文件系统.这样你才能在修改linux内核代码之后,完成验证的过程. 本文教你完成下列过程: 1.下载linux并编译linux内核源码 ...

  2. 使用USB转TTL下载器将固件烧写到STM32F103C8T6最小系统板中

    使用USB转TTL下载器将固件烧写到STM32F103C8T6最小系统板中 1.设置keil5,生成hex文件 2.下载安装CH340驱动 3.下载安装mcuisp或Flymcu 4.接线并下载程序 ...

  3. linux busybox源码下载,源码编译 busybox

    源码编译 busybox 一.下载源码包 [root@centos7 ~]# wget https://busybox.net/downloads/busybox-1.30.1.tar.bz2 --2 ...

  4. Android源码下载(可编译)

    文章目录 1 源码下载 2 源码编译.导入Studio 3 遇到的问题 1 mac 默认是不区分大小写的,所以需要分区去下载源码. 2 解决 repo sync error: Exited sync ...

  5. Android13源码下载及全编译流程

    一.源码下载 1.1.配置要求 官方推荐配置请参考:https://source.android.google.cn/docs/setup/start/requirements?hl=zh-cn,重点 ...

  6. OpenWrt源码下载及固件编译

    2018年,OpenWrt和LEDE宣布合并了,从此我们下载OpenWrt源码的方法发生了重大的改变.目前稳定的OpenWrt版本是由LEDE 17.01源代码构建的,并以LEDE项目命名.OpenW ...

  7. 新增linux驱动并重新编译内核,【转】配置并编译内核[更新到linux-2.6.29.2]

    有关内核精简的内容,看3楼. 一.下载源代码和编译软件准备下载内核源代码:http://www.kernel.org/ 注意,点击2.6.29内核的F版,即完整版. 如果你懒得去网站点联接,运行下列命 ...

  8. linux下的线程编译,Linux下的多线程下载工具Axel编译安装

    Linux系统下,下载文件一般使用wget直接下载,但是wget是不支持多线程,导致下载速度提不上来,尤其是下载大文件的时候特别明显 axel不仅支持多线程下载,并且还支持断点续传.记录一下CentO ...

  9. IDEA项目中配置Maven镜像源(下载源)

    目录 前言 一.IDEA中Maven的位置 二.修改Maven的配置文件 2.1 配置文件 2.2 修改镜像源 三.在IDEA中使配置文件生效 四.配置文件和本地仓库迁移 前言 在使用IDEA搭建项目 ...

  10. Linux账户标识R=400是什么意思_带你阅读linux内核源码:通俗讲解编译器、交叉编译器和大小端...

    欢迎关注"技术简说",持续分享linux内核和驱动开发干货. 本文内容包括: 编译器和交叉编译器的介绍 交叉编译器的命名规则 如何交叉编译C代码 大端.小端的通俗讲解 如何判断你的 ...

最新文章

  1. VC6生成和调用lib
  2. WPF 放大镜(Magnifying Glass)
  3. 在Linux中查看ftp状态,linux中ftp常见操作启动ftp状态,终止ftp会话
  4. linux系统优化篇之---top
  5. IoC反转控制初步认识
  6. Swift @escaping @noescape
  7. 力扣202.计数质数
  8. 无插件,跨平台,基于WebGL的三维地球来了!!!
  9. 将json转为map的两种方式及前后端开发json Api设计规范总结
  10. Android 调试技巧之快速重启生效
  11. java token身份认证_java – 基于Spring Security Token的身份验证
  12. 纯c语言----学生成绩管理系统
  13. 什么是DAO,DAO是什么?DAO全面解析
  14. 独家深挖!F1赛车协会“刹车表现”是如何进行数据分析的?
  15. 输入10个互不相同的数字并分成5对,问有多少种分法。
  16. Unity 脚本中的几种等待方法
  17. 数值计算笔记之非线性方程的求解(二)迭代法
  18. FFT(傅里叶快速变换,详细讲解+推导) 每日一遍,算法再见!
  19. 回溯模板+leetcode——78. 子集 + 90. 子集 II
  20. 太空人esp32/8266天气时钟学习经验

热门文章

  1. Android逆向分析实例(三)-解密微信EnMicroMsg.db数据库
  2. 计算机控制系统的典型结构形式框图,计算机控制技术课后习题
  3. CSS/HTML静态购物网站项目源码解析(品优购)——该项目包含主页、注册页、列表页三个网页
  4. 清理autodesk产品注册表_如何清理卸载Inventor产品
  5. 新闻:西部数据拟200亿美元收购原东芝存储 《创新者的窘境》硬盘发展史
  6. Android 9.0的One UI系统,三星S9/S9+更新One UI 安卓9.0已正式推送
  7. 最大流(Max Flow)
  8. vim插件介绍(一)之Tabular
  9. CNNVD发布微软多个安全漏洞,涉高危及以上等级漏洞56个
  10. IDEA 当前项目jdk版本查看