Starguard
开发笔记
Toggle navigation
Starguard
全部笔记
Unity
大话存储笔记
C语言
MongoDB
About Me
归档
标签
(二)内核初始化打印信息分析
2020-01-20 08:44:54
96
0
0
admin
# 目录 [TOC] # 启动过程 系统引导和启动过程略,见其他笔记。 ## 内核初始化流程 * 内核初始化的第一步是执行实模式下的汇编代码,之后执行保护模式下的init/main.c文件中的start_kernel()函数。 * start_kernel()函数首先初始化CPU子系统,之后让内存和进程管理系统就位,接下来启动外部总线和I/O设备,最后激活init进程,init进程执行启动必要的内核服务的用户空间程序,最终派生用户登录提示。 ## 内核解析BIOS提供的系统内存映射 ``` BIOS-provided physical RAM map: BIOS-e820: 0000000000000000 - 000000000009f000 (usable) ... BIOS-e820: 00000000ff800000 - 0000000100000000 (reserved) ``` * 上面是一个内核初始化过程打印信息的例子,实模式下的初始化代码通过使用BIOS的int 0x15服务并执行0xe820号函数来获得系统的内存映射信息,包含预留和可用的内存,内核将随后使用这些信息创建其可用的内存池。 ![title](/api/file/getImage?fileId=5e24715c56fec84575000020) * x86中896MB以内的常规的可被寻址的内存区域被称为低端内存,kmalloc()函数就是从该区域分配内存的。高于896MB的内存区域被称为高端内存,只有采用特殊方式进行映射后才能被访问。 ## 内核接受bootloader传递的命令行 * 可以通过CONFIG_CMDLINE这个内核配置选项或bootloader配置向内核传递一个命令行,也就是内核引导选项。 ![title](/api/file/getImage?fileId=5e24719d56fec84575000021) ## 校准CPU的处理速度 * 内核在启动过程会计算在一个jiffy时间内运行一个内部的延迟循环的次数。jiffy时间的含义是系统定时器在2个连续的节拍之间的间隔,用于校准CPU的处理速度,校准的结果被存储在称为`loops_per_jiffy`的内核变量中。 * 定义于init/calibrate.c文件中的`calibrate_delay()`函数用于得到`loops_per_jiffy`变量值。 ![title](/api/file/getImage?fileId=5e24725856fec84575000023) ![title](/api/file/getImage?fileId=5e24722656fec84575000022) * BogoMIPS可以用作衡量处理器运行速度的相对尺度: $$BogoMIPS = loops\_per\_jiffy * 1秒内的jiffy数 * 延迟循环消耗的指令数(以百万为单位)$$ * 可以通过lpj=选项预设lpj,无需再计算,优化Linux内核启动时间。 ## NET: Registered protocol family 2 * Linux套接字(socket)层是用户空间应用程序访问各种网络协议的统一接口,每个协议通过include/linux/socket.h文件中定义的分配给它的独一无二的系列号注册。 ![title](/api/file/getImage?fileId=5e24749f56fec84575000024) ![title](/api/file/getImage?fileId=5e2474ca56fec84575000025) * 上述打印信息中的Family 2代表互联网协议IP。 * AF_UNIX(Family 1)常被用于在同一个系统中进程间通信(IPC)。 ## 释放initrd占用的内存 * initrd是由bootloader加载的常驻内存的虚拟磁盘映像,在内核启动后,会将其挂载作为初始根文件系统。 * 由于内核可运行于各种各样的存储控制器硬件平台上,把所有可能的磁盘驱动程序都直接放到基本的内核映像中并不可行,所以把所使用的系统的存储设备的驱动程序打包放进initrd中,在内核启动后、实际的根文件系统加载之前,这些驱动程序才被加载。 * 在将压缩包中的内容解压为根文件系统后,内核将释放该压缩包所占据的内存,打印下面的信息: ![title](/api/file/getImage?fileId=5e24759956fec84575000026) * 怎么制作initrd:使用mkinitrd命令或使用cpio命令自己打包。 * 怎么使用initrd:通过initrd=内核引导选项;在bootloader的配置文件中使用initrd命令;在内核配置过程中通过INITRAMFS_SOURCE直接编进内核。 ### initrd和initramfs的不同 * initrd模拟了一个磁盘,因而被称为initramdisk或initrd,会带来Linux块I/O子系统的开销(如缓冲);initramfs基本上如同一个被挂载的文件系统,由自身获取缓冲。 * 基于页缓冲建立的initramfs如同页缓冲一样会动态地变大或缩小,从而减少了其内存消耗。 * initrd要求内核必须包含initrd使用的文件系统的驱动,initramfs不需要额外的文件系统驱动。 * 由于initramfs只是页缓冲之上的一小层,因此它的代码量很小。 * 制作initramfs可以使用mkinitramfs命令。 * 制作initrd/initramfs参考链接:https://blog.csdn.net/htttw/article/details/7217706 ## 注册I/O调度器 * I/O调度器的主要目标是通过减少磁盘的定位次数来增加系统的吞吐率。磁盘定位过程中,磁头需要从当前的位置移动到感兴趣的目标位置,这会带来一定的延迟。这里选择deadline作为默认的I/O调度器。 ![title](/api/file/getImage?fileId=5e24793256fec84575000027) ## 初始化I/O总线和外围控制器 * 内核会通过遍历PCI总线来探测PCI硬件,接下来再初始化其他的I/O子系统。如SCSI子系统、USB控制器、视频芯片、串行端口、键盘和鼠标、软驱、loopback设备、IDE控制器、以太网控制器等。 ## 挂载文件系统 * EXTn是Linux事实上的文件系统,EXT3在EXT2文件系统基础上增添了日志层,该层可用于崩溃后文件系统的快速恢复,它会启动一个kjournald的内核辅助线程来完成日志功能。EXT4向后兼容EXT3、EXT2。 * 以下打印信息说明用的是XFS文件系统,也是一种高性能的日志文件系统: ![title](/api/file/getImage?fileId=5e247cea56fec84575000028) ## 执行内核启动后执行的第一个程序init * 在linux kernel 5.2.11中,start_kernel之后会调用arch_call_rest_init -> rest_init -> kernel_thread(kernel_init,...) -> run_init_process -> do_execve(getname_kernel(init_filename), (const char __user *const __user *)argv_init, (const char __user *const __user *)envp_init)调用init程序。 ![title](/api/file/getImage?fileId=5e24811856fec8457500002c) * 可以通过init=内核启动选项指定这个init程序,可以是bash、systemd等的路径。 ![title](/api/file/getImage?fileId=5e247ea256fec84575000029) ![title](/api/file/getImage?fileId=5e247ecb56fec8457500002b) * 现在systemd已经取代了sysvinit,不过为了兼容,还是存在/etc/rc.d/rcX.d/目录,用于执行原来的runlevel X的脚本,保留了init、runlevel等命令,并且将systemd可执行程序软链接到了/usr/sbin/init。 ![title](/api/file/getImage?fileId=5e2481eb56fec8457500002d)
上一篇:
(一)GRUB简介
下一篇:
musicrace:问题解决
0
赞
96 人读过
新浪微博
微信
腾讯微博
QQ空间
人人网
文档导航