先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前在阿里
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上运维知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
此时有一个寄存器的值和前面的不一样,
**那就是eax,此时是1,它从****task[64]**中
得到的。之后执行copy_process,跳到
调整进程1的管理结构 定义处kernel/fork.c中,设置进程1的
管理结构。假如此时发生时钟中断,系统
会响应并执行kernel/system_call.s函数
中的timer_interrupt定义处,先压栈后
设置进程1的线性地址空间及物理页面 进入****kernel/sched.c
的do_timer函数,别忘了此时仍在进程
0****执行,然后便发现时间片还没完,所以
跳出,并返回到ret_from_sys_call。这是
继续调整进程1的管理结构 在kernel/system_call.s中定义的,
接着直接将刚才的压栈数据出栈,继续完成
刚才创建进程1的任务,即在fork.c中继续
调整进程1的管理结构,同时设置进程
进程0准备切换到进程1 1****的线性地址空间及物理页面,直到
**执行到这条语句“**p->state=TASK_
RUNNING**;return last_pid;”,标志着**
系统切换到进程1执行 进程1创建完成。后跳出****copy_process.c
函数,返回到system_call.s,将压栈的
进程1开始执行 的寄存器值出栈,此时eax是1。后中断返回
,进程由从内核态变为用户态,即到了unisted.h的“if(_res>=0)”这条指令中,
_res的值就是eax****的值,一判断成立,就返
进程1开始以数据块的形式操作硬盘 回该值。最后回到了****main.c
的“if(!fork())”中,一判断不成立,跳出执****行下一条指令“for(;;)pause();”,同理
Pause函数也和fork****函数一样,这里就不
将找到的缓冲块与请求项挂接 讲了,进入****sys_pause()后将进程0
置为可中断等待状态,并调用在****kernel
**/sched.c定义的schedule()**函数切换进程。
进程切换中断返回后执行了第一条语句
将请求项与硬盘处理函数挂接 是“if(_res>=0)”,一判断,
刚存的eax值为0,返回到“if(!fork())”
判断为真,执行init()函数,这在****main.c
定义。进入init.c后其程序执行流程见附录,
进行硬盘读盘前的工作准备 各个程序执行目的正如左边写的一
样。
给硬盘下达读盘命令
进程1由于等待读盘操作挂起
系统切换到进程0执行
进程0执行过程中发生硬盘中断
硬盘中断服务程序响应后,进程0继续执行
再次响应硬盘中断,并唤醒进程1
读盘操作完成后进程1继续执行
进程1继续设置硬盘管理结构
进程1获取软盘超级块,为加载根文件系统做准备
进程1备份超级块数据
进程1将根文件系统从软盘拷贝到虚拟盘
进程1开始加载根文件系统
进程1准备加载根文件系统超级块
进程1继续加载根文件系统
进程1准备获取根目录节点
进程1加载根目录节点
进程1结束加载根文件系统的过程
进程1与内核文件表挂接,为打开文件做准备
确定打开操作的起点
获取枝梢i节点—dev目录文件的i节点
确定dev的目录文件i节点为枝梢节点
继续返回枝梢i节点
查找tty0文件的i节点
将tty0设备文件的i节点,返回给sys_open系统调用
分析tty0文件i节点
设置文件管理结构并返回给用户进程
进程复制tty0文件句柄
进程1继续复制tty0文件句柄
第三步:以进程1为母本创建进程2,使进程2在全面具备进程1所拥有的能力和环境的基础上,进一步具备支持”人机交互“的能力,最终实现准备阶段完成。流程如下:
进程1准备创建进程2 与进程0创建进程1一样,创建进程2,复
制进程1的管理结构,复制页表、页目录
项等,创建进程2后即执行到init/main.c中
复制进程2的管理结构并进行调整 **176行与186****行,分别是:**if(!(pid
=fork())中子进程即进程2****执行,而父进程(
进程1)执行186行的if(pid>0),父进程
调整进程2管理结构中与文件有关的内容 进入wait函数,等待!
进入wait函数后还做了一些动作:首先
查找自己的子进程,确定是进程2后,判断
进程1执行过程中发生时钟中断 进程2是否处于终止状态或是
僵死状态,一判断不是,就将进程1设置为
**可中断等待状态,继而调用****schedule()**函数
进程1从时钟中断返回 准备切换到进程2执行切换到进程2**。**
进入进程2后开始加载shell程序。首先执
行init/main.c中180行的“close(0);”,就是
进程1查找它自己的子进程 **解除****filp[20]与file_table[64]**的第一项
关系,这是从进程1继承过来的。然后
是“if(open(“etc/rc”,O_RDONLY,0))”,
对进程2的状态进行处理 其中是将进程2的管理结构指针表****filp
**[20]的第一项与file_table[64]**的第一项建立
一个关于资源配置的文件,而后再执行
切换到进程2执行 execve函数,并映射到sys_execve****系统调用。
再调用do_execve函数,目的便是将参数
与环境变量加载到主内存的页面中去,中断
为打开/etc/rc文件做准备 返回,但此时在该函数里已经将EIP的
值指向了shell程序的入口地址,所以返回后
执行的是shell的第一条指令,但这时却发现
进程2打开”/etc/rc“配置文件 内存中没有这一条指令的映射,
所以发生“缺页中断”,然后调用****page_fault
函数中的do_no_page。
通过压栈为加载shell文件做准备
为参数和环境变量设置做准备
得到shell文件i节点
为加载参数和环境变量做准备
根据i节点,为shell文件进行检测
检测shell文件头
备份文件头并进行分析
对shell文件进行进一步分析
拷贝参数与环境变量
调整进程2的管理结构
继续调整进程2的管理结构
释放进程2继承的页面
检测协处理器
调整shell程序所在的线性地址空间
为shell程序准备参数与环境变量
继续调整进程2的管理结构
调整EIP,使其指向shell程序的入口地址
Shell程序执行发生缺页中断
缺页中断中shell程序加载前检测
为即将载入的内容申请页面
为shell载入新获得的页面
根据shell进程的情况,调整页面内容
将线性地址空间与程序所在的物理页面相对应
Shell程序开始执行,执行的内容是/etc/
rc里面的命令,其中便有创建update****进
Shell进程准备创建update进程 程,该进程是为同步缓冲区与硬盘而
设的进程,它会时不时的进入睡眠状
态,经过一定的时间再被唤醒然后更新
进程2开始执行/etc/rc文件 缓冲区与硬盘的数据。之后创建完成后
Shell****进程退出,退出操作当然得释放它占
用的资源或者是清除掉,或者是将使用次数
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
rc里面的命令,其中便有创建update****进
Shell进程准备创建update进程 程,该进程是为同步缓冲区与硬盘而
设的进程,它会时不时的进入睡眠状
态,经过一定的时间再被唤醒然后更新
进程2开始执行/etc/rc文件 缓冲区与硬盘的数据。之后创建完成后
Shell****进程退出,退出操作当然得释放它占
用的资源或者是清除掉,或者是将使用次数
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!