Linux

您所在的位置:网站首页 linux文件系统编译 Linux

Linux

2023-08-27 03:18| 来源: 网络整理| 查看: 265

1. 概述

linux启动代码的编译包括bootloader的编译、linux内核编译、文件系统的制作。

linux内核概述 linux内核保存在vmlinux中 编译进内核( build-in )和作为模块( module )的区别

在menuconfig时,会遇到驱动程序被设为y或者m或者nothing的情况,此时若设成y则被编译进内核,设成m则被编译成模块,若什么都不设,则linux编译是将对该模块不做处理。

build-in:将功能内建在内核里可以确保此功能永远都开启。但缺点就是增加你内核的“体积”从而拖慢了你开启引导的时间, 并且这个“变大”的内核需要更多的内存。

module:将功能编成模块可以让此功能在需要的时候加载在内存里而不需要的时候可以卸载,这样, 你的内核可以保持一个比较小的“体积”。 如果你是经常将硬件“交换”(swap in and out)进出的话, 这个方式是很有用的。你可以将很多支持的硬件编成模块形式比如你的声卡, 这样理论上系统会将此驱动正常的在硬件安装的时候挂载上去。

2. bootloader 1 uboot的制作 3. linux内核相关配置 1 体系架构相关配置 2 文件系统相关配置 采用initramfs、ramdisk文件系统的linux内核 若采用initramfs,直接配置如下选项: General setup-->选择 Initial RAM filesystem and RAM disk...... 项若采用ramdisk,除上述选项外,还需配置 Device Drivers-->Block devices-->RAM block device support 项另外initramfs技术和ramdisk技术的另一个重要的区别就是initramfs并不是在内存中模拟出一个磁盘,所以也就不在需要ramdisk中所需的ext2驱动支持。因此可以取消以下选项: File systems --> Second extended fs support 4. 根文件系统

根文件系统为用户提供一个shell和操作系统交互的平台,通过根文件系统,shell才能与操作系统内核交互。

1 文件系统必要的要素 /dev/console linux kernel提供,内核需要挂载该节点进行输入输出init_main() 即linuxrc程序,busybox提供/etc/init.d/rcS 开机启动的配置文件,配置文件系统运行shell命令的支持函数busybox标准运行库glibc busybox的响应函数运行必须要标准库函数的支持 2 制作busybox busybox源码执行过程 : init_main()signal信号解析解析inittab,配置每一项action及相关的shell命令根据解析后的每一项进行参数利用等待系统稳定开始进入while死循环,运行shell命令 默认inittab设置

 制作步骤

 制作busybox参考链接:使用BusyBox制作嵌入式Linux根文件系统 - Charles-Zhang - 博客园

基于busybox制作initramfs参考链接:

BusyBox制作Initramfs嵌入式Linux根文件系统_大树的专栏-CSDN博客_busybox initramfs

嵌入式Linux根文件系统制作 (BusyBox+Initramfs)_Imagine Miracle_wxn的博客-CSDN博客

3 文件系统

几种根文件系统参考:Bootargs参数详解_zhangjikuan的专栏-CSDN博客_bootargs

(1)NFS

基于网络传输的文件系统;一般用在调试阶段,通过nfs服务将文件系统挂载到内核中

启动参数 bootargs root=/dev/nfs nfsroot=192.168.3.101:/home/nfs ip=192.168.3.21 init=/linuxrc console=ttyS0,115200

(2) Ramdisk

基于内存的文件系统;文件系统直接在内存中运行;一般存放格式为gz格式,挂载时会自解压

制作步骤启动参数: bootargs root=/dev/ram initrd=0x81000000,8M init=/linuxrc console=ttyS0,115200 root=/dev/raminitrd=0x21000000,8M 存放起始地址和大小init=/linuxrc 根目录下事先做好的启动引导程序console=ttyS0 指定控制台

(3)initramfs

制作步骤 #基于buildroot $ cd $ touch initramfs $ vim initramfs #添加以下代码 #dir /dev 755 0 0 #nod /dev/console 644 0 0 c 5 1 #nod /dev/loop0 644 0 0 b 7 0 #dir /bin 755 1000 1000 #slink /bin/sh busybox 777 0 0 #file /bin/busybox initramfs/busybox 755 0 0 #dir /proc 755 0 0 #dir /sys 755 0 0 #dir /mnt 755 0 0 #file /init initramfs/init.sh 755 0 0 $ ./usr/gen_init_cpio initramfs > initramfs.cpio $ gzip initramfs.cpio #生成gz文件 $ vim .config #CONFIG_INITRAMFS_SOURCE="" #CONFIG_INITRAMFS_COMPRESSION=".gz" $ make vmlinux 重新挂载 $ cpio -idvc < initramfs.cpio

启动是还会加载内核模块打包文件initramfs linux为保持kernel的精简将一些不常用的驱动、功能编译成模块,在需要的时候动态加载,而这些模块被打爆保存为一个initramfs文件 早期版本Linux使用initrd文件,initramfs是initrd的替代优化版本,比initrd更加节省空间、更加灵活 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3