大壮嘎嘎壮 发表于 2025-1-19 17:26

《Linux内核深度解析》初见 - 第一章 内核引导和初始化

<div class='showpostmsg'> 本帖最后由 大壮嘎嘎壮 于 2025-1-19 17:26 编辑

<p><strong>.globl&nbsp; &nbsp;_start</strong></p>

<p><strong>_start:</strong></p>

<p>&nbsp; &nbsp; 岁聿云暮,一元复始,最近终于得空抽出时间来阅读这本《Linux内核深度解析》。</p>

<p>&nbsp; &nbsp; <strong>一、Boot阶段</strong></p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;在嵌入式系统中,BOOT(引导加载程序)扮演着至关重要的角色,它负责初始化硬件、加载操作系统内核或其他应用程序,并为系统的正常运行做好准备。</p>

<p>&nbsp; &nbsp; 本文介绍的是嵌入式设备常用的U-Boot引导程序,U-Boot分为SPL和正常的U-Boot程序两部分。SPL(Secondary Program Loader)意为第二段程序加载器,明明作为引导程序首先出场的角色为什么要叫第二段呢,这个第二段是相对于固化在芯片内部的bootrom来说的。处理器启动时首先执行的是芯片内部固化的程序,固化程序加载SPL,SPL加载正常的U-Boot程序。由于芯片内部寸土寸金,片上内存比较小,所以才采用这种方式进行初始化内存和储存设备及一些外设,为内核的加载或者固件的更新下载做准备。Uboot最后调用boot_Jump_linux函数,跳转到linux内核。至此,uboot使命结束,CPU控制权交给内核。</p>

<p>&nbsp;&nbsp;</p>

<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</p>

<p>&nbsp; &nbsp; <strong>二、Kernel阶段</strong></p>

<p><strong>&nbsp; &nbsp; 1.初始化</strong></p>

<p>&nbsp; &nbsp; 内核初始化分为汇编语言和C语言部分。</p>

<p>&nbsp; &nbsp; 汇编语言中主要执行了以下几个函数进行了一些基本的初始化流程:</p>

<p>&nbsp; &nbsp; &nbsp; &nbsp; (1)el2-setup:配置执行内核的异常级别。</p>

<p>&nbsp; &nbsp; &nbsp; &nbsp; (2)__create_page_tables:页表映射</p>

<p>&nbsp; &nbsp; &nbsp; &nbsp; (3)__primary_switch:开MMU</p>

<p>&nbsp; &nbsp; &nbsp; &nbsp; (4)__primary_switched:栈、异常向量表。数据段等初始化,调用start_kernel函数</p>

<p>&nbsp; &nbsp; 内核初始化的C语言的入口函数是start_kernel函数,start_kernel函数的主要职责如下:</p>

<p>&nbsp; &nbsp; &nbsp; &nbsp; (1)设置页表和内存管理:<br />
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;初始化页表,确保内核能够正确地管理内存。设置内存管理单元(MMU)的配置。<br />
&nbsp; &nbsp; &nbsp; &nbsp; (2)初始化硬件:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;初始化处理器和硬件架构相关的设置。设置中断和异常处理。<br />
&nbsp; &nbsp; &nbsp; &nbsp; (3)内核数据结构初始化:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;初始化各种内核数据结构,如调度器、进程控制块(task_struct)、内存管理等。<br />
&nbsp; &nbsp; &nbsp; &nbsp; (4)设备驱动初始化:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;初始化设备驱动框架,为内核支持的设备做好准备。<br />
&nbsp; &nbsp; &nbsp; &nbsp; (5)文件系统初始化:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;初始化虚拟文件系统(VFS)和根文件系统。<br />
&nbsp; &nbsp; &nbsp; &nbsp; (6)启动内核线程:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;启动内核守护进程和必要的内核线程,如 kswapd(内存回收守护进程)、kworker(工作线程)等。<br />
&nbsp; &nbsp; &nbsp; &nbsp; (7)用户空间启动:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;挂载根文件系统。启动第一个用户空间进程(通常是 init 进程)。</p>

<p>&nbsp; &nbsp;<strong> 2.init进程</strong></p>

<p>&nbsp; &nbsp; init进程是用户空间的第一个进程,主要有以下作用:</p>

<p>&nbsp; &nbsp; (1)启动系统服务:</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;init进程负责启动各种系统服务,如网络服务、打印服务等。这些服务通常通过运行级别(run levels)来管理,不同的运行级别对应不同的系统状态和服务组合。<br />
&nbsp; &nbsp; (2)管理用户登录:</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;init进程还负责启动getty进程,用于用户登录。在系统完全启动后,init会为每个用户已退出的终端重启getty,以便下一个用户可以登录。<br />
&nbsp; &nbsp; (3)处理孤儿进程:</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当一个进程启动了一个子进程并且在子进程之前终止时,这个子进程会成为孤儿进程。init进程会接管这些孤儿进程,确保它们不会成为僵尸进程(zombie process)。<br />
&nbsp; &nbsp; (4)系统初始化:</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;init进程还承担挂载文件系统、初始化属性系统和Klog、selinux的初始化等重要任务。它通过解析init.rc脚本来初始化系统daemon服务进程。</p>
</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

Jacktang 发表于 2025-1-20 07:30

<p>流程图画的不错</p>
页: [1]
查看完整版本: 《Linux内核深度解析》初见 - 第一章 内核引导和初始化