编译生成的中间目标文件、可执行文件都是按照特定的目标文件格式进行组织。各个系统的目标文件格式不太一样,如Unix a.out格式、Windows可移植可执行程序(Portable Executable, PE)、MacOS-X使用Mach-O格式。现代Linux/Unix都是用可执行可链接格式(Eexcutable Linkable Format, ELF)。PE和ELF格式都是COFF(Common File Format)格式的变种。
kernel version: 5.18(4b0986a3613c)
本文中的大部分代码段都有代码删除
系统启动过程的最后一个阶段:挂载根文件系统、执行根文件系统中的init程序完成到用户空间的切换。然而根文件系统可能是在不同的硬件设备上,如SCSI硬盘、SATA硬盘、Flash设备等,后续会出现更多的硬件设备;根文件系统可以是xfs、ext4、NFS等不同的文件系统;为了成功挂载根文件系统,内核需要具备相应的设备驱动、文件系统驱动,如果为了兼容所有的根文件系统,将所有相关驱动编译进内核,会增大内核大小,并在实际环境中引入一些无用的驱动。
DEFLATE算法首先通过LZ77算法对数据流压缩,压缩数据流中仅包含literal
、length
、distance
三种类型的数据。
gzip是一种压缩格式也是类Unix上的文件压缩/解压缩软件,通常指GNU计划的实现,此处gzip代表GNU zip。gzip文件格式在RFC 1952 GZIP file format specification version 4.3中标准化,gzip基于DEFLATE算法实现数据压缩,DEFLATE算法在RFC 1951 DEFLATE Compressed Data Format Specification version 1.3中标准化。
无论是Linux还是其他操作系统,开机启动最开始的流程由BIOS完成。当电脑上电后,BIOS首先会初始化BIOS内部状态、外部接口、检测并setup硬件。这个最开始的阶段称为开机自检(POST, Power On Self Test)。随后BIOS进入启动阶段,会检查启动介质,找到bootloader,将其加载至内存并跳转至bootloader执行。
本文以SeaBIOS为例,介绍x86架构下BIOS在启动流程所做的工作。SeaBIOS是16bit x86 BIOS的开源实现,也是qemu和kvm默认的BIOS。
我使用Linux已有8年有余,经常会编写shell脚本进行自动化处理。然而,到目前为止,我依然不能像熟练使用C语言一样编写shell脚本。确实,我的主力编程语言是C语言,仅在做自动化脚本或者编写自动化测试用例的时候才会使用shell。另外一方面,shell脚本的语法的变种太多,例如,if语句在做字符串、数值、文件比较时的判断语句都相差很大;特殊符号多,$#
、$@
、$?
等等,如果你是第一次接触shell脚本,必然会手足无措,更坑爹的是,这些特殊符号使用的场景相差很大,记忆负担真的大!!还有,shell脚本会依赖太多小程序,正如unix哲学所言:一个工具肩负单一使命,这些程序的各自用途、各自选项差异很大,你根本没有办法一下子就记住所有用法!!!
给社区发送邮件讨论补丁时,选择一个趁手的客户端会极大提高沟通效率。曾经我通过”git send-email + thunderbird”的工具组合进行邮件的发送和读取,thunderbird如同outlook的clone版本,对于使用GUI客户端的用户极为友好。然而大多数内核开发者还是会选用mutt邮件客户端,其可配置性极佳,完全命令行的交互方式对于kernel hacker来说是极为友好的。
1 / 2