最小的linux内核代码,带你阅读linux内核源码:下载源码、编译内核并运行一个最小系统...
要学习linux内核,先要能够编译内核,还需要了解内核如何启动根文件系统。这样你才能在修改linux内核代码之后,完成验证的过程。
本文教你完成下列过程:
1.下载linux并编译linux内核源码
2.编译busybox
3.制作一个最小的根文件系统
4.qemu启动你编译好的内核和根文件系统
linux源码下载地址:
https://mirrors.edge.kernel.org/pub/linux/kernel/
我选择的版本是:4.9.229
https://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) support
Device Drivers --->
[*] Block devices --->
RAM block device support
(65536) Default RAM disk size (kbytes)
4.编译内核
# make
编译成功后的内核位于:arch/x86_64/boot/bzImage
下载buysbox源码,下载地址:
https://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内核知识,让你一步一步成为linux内核高手。
最小的linux内核代码,带你阅读linux内核源码:下载源码、编译内核并运行一个最小系统...相关推荐
- 打开查看linux内核代码,source insight 查看linux内核代码树【转载】
[工程建立好之后,在工程选项下点击"同步",默认选项,同步文件后,既可以进行各种跳转查看了] Source Insight实质上是一个支持多种开发语言(java,c ,c 等等)的 ...
- linux c代码出现段错误,Linux下段错误(C语言)
问题描述:在Linux下编程有时会出现段错误的提醒,出现这种错误有可能是因为以下几种原因 1.数组越界:如果在初始化或者接收输入时内容超过了定义好的数组元素个数时会出现段错误,Linux的数组越界检查 ...
- Linux账户标识R=400是什么意思_带你阅读linux内核源码:通俗讲解编译器、交叉编译器和大小端...
欢迎关注"技术简说",持续分享linux内核和驱动开发干货. 本文内容包括: 编译器和交叉编译器的介绍 交叉编译器的命名规则 如何交叉编译C代码 大端.小端的通俗讲解 如何判断你的 ...
- linux禁止修 5在线阅读,linux – 如何在不重新编译内核的情况下禁用CentOS 5.3中的nf_conntrack内核模块...
我正在运行CentOS 5.3,并希望禁用nf_conntrack模块以提高haproxy的网络性能.我正在使用一些简单的规则运行iptables.我真的不需要连接跟踪. 我在Rackspace云服务 ...
- linux内核代码研读与实战,Linux内核源码研读与实战演练
Linux内核源码研读与实战演练 网盘下载链接: http://pan.baidu.com/s/1fIYf0 密码: 341f 要是网盘失效了,请加我QQ: 3113533060 课程内容: 第1部分 ...
- linux 索引代码的函数定义,Linux网络接口操作之if_nameindex
系统信息 操作系统: # lsb_release -ir Distributor ID: CentOS Release: 6.7 内核版本: # uname -r 2.6.32-573.26.1.el ...
- php项目源码发布linux,php代码上传到linux服务器无法正常显示
近期接手了一个PHP开发的项目,一直想搞个LVS管理的工具,却一直没动力去做,这次就当是学习和为了以后工作的方便吧.开发过程中遇到这么一个问题,情况如下: 情况:在windows下写好的代码,上传在L ...
- linux邮件可以带文件格式,在Linux命令行下发送html格式的邮件
在Linux利用formail+sendmail来发送带图片的邮件 自测: (echo " 业务预估统计.";echo " ";) | formai ...
- linux ssh命令 带密码,[命令] Linux 命令 sshpass(密码非交互式 ssh)(转载)
sshpass的安装使用 1:sshpass下载与安装 yum安装: yum install sshpass 若yum安装不上,则用下面方法 https://sourceforge.net/proje ...
最新文章
- 云游戏、VR、AI,云计算给元宇宙提供了哪些想象力?
- Win7下安装配置PHP+Apache+Mysql+PHPMyAdmin环境教程(非集成)
- 使用xshell远程连接Linux
- flask+sqlite3+echarts3+ajax 异步数据加载
- H3C交换机典型访问控制列表(ACL)配置实例
- 大白话5分钟带你走进人工智能-第二十节逻辑回归和Softmax多分类问题(5)
- python parser count_8个超实用的Python脚本,收藏备用
- BugkuCTF-MISC题旋转跳跃
- python找出矩阵中的最大值_Python / Scipy:找到矩阵的“有界”最小值/最大值
- app推广广告词热点
- python如何打开npy文件_操作python实现npy格式文件转换为txt文件
- 如何在终端编辑文件并保存
- 文献阅读软件_推荐一款阅读英文文献的神器,效率高不少,理解深不少!
- shedlock 重启系统报错问题_闲谈ShedLock解决分布式定时任务重复执行问题
- 26个数据分析案例——第三站:基于python的药店销售数据分析
- 科技文献检索(九)——检索步骤和策略
- JeecgBoot 3.4.3-GA 版本发布,开源免费的企业级低代码平台
- Leaflet地图框架使用手册
- 如何用手机快速图片转文字呢?2个进阶教程,详细教程教你完成
- linux网卡驱动rtl8188cu,linux下编译基于rtl8188cu控制芯片的USB无线网卡驱动 -电脑资料...
热门文章
- JAVA Swing GUI设计 WindowBuilder Pro Container使用大全5——JToorBar使用
- Linux之父新年首次“炮轰”:英特尔在扼杀整个ECC行业
- 谈了千百遍的缓存数据一致性问题
- 老师,你确定注释不会被执行吗?
- 拼多多公布新iPhone SE补贴后价格:2899元起;BOSS直聘回应“App崩了”;Chrome 新测试版发布|极客头条...
- 不再惧怕!二叉树结构相关算法总结 | 原力计划
- 绝了!RNN 还会写藏头诗!
- 腾讯发力研发文化升级,宣布加入Linux基金会TODO 工作组
- 周鸿祎,会是下一个“贾跃亭”吗?
- 2019 开源安全报告:开发者安全技能短板明显,热门项目成漏洞重灾区!