Linux学习第三周 Linux内核启动过程
来源:互联网 发布:ios11蜂窝数据打不开 编辑:程序博客网 时间:2024/05/09 05:46
一.知识点回顾
1.计算机的“三个法宝”:存储程序计算机,中断,函数调用堆栈;
2.操作系统的“两把宝剑”:中断上下文的切换(保存现场和恢复现场),进程上下文的切换。
二.实验内容
1.启动menuos
执行命令 cd LinuxKernel/
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img
menuos启动成功。
2.利用gdb跟踪调试内核
- qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S # 关于-s和-S选项的说明:
- # -S freeze CPU at startup (use ’c’ to start execution)
- # -s shorthand for -gdb tcp::1234 若不想使用1234端口,则可以使用-gdb tcp:xxxx来取代-s选项
- gdb
- (gdb)file linux-3.18.6/vmlinux # 在gdb界面中targe remote之前加载符号表
- (gdb)target remote:1234 # 建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行
- (gdb)break start_kernel # 断点的设置可以在target remote之前,也可以在之后
设置断点rest_init()
三.总结
1.start_kernel函数
start_kernel函数完成linux内核的初始化。几乎每个内核部件都是由这个函数进行初始化的。
调用sched_init函数初始化调度程序;
电泳trap_init函数和init_IRQ函数来完成IDT初始化;
调用time_init()函数来初始化系统日期和时间;
调用kernel_thread()函数为进程1创建内核线程,这个内核线程又会创建其他的内核线程并执行。
2init_task进程和idle进程
init_task进程在Linux中属于一个比较特殊的进程,它是内核开发者人为制造出来的,而不是其他进程通过do_fork来完成。Linux在无进程概念的情况下将一直从初始化部分的代码执行到start_kernel,然后再到其最后一个函数调用rest_init。从rest_init开始,Linux开始产生进程,因为init_task是静态制造出来的,pid=0,它试图将从最早的汇编代码一直到start_kernel的执行都纳入到init_task进程上下文中。在rest_init函数中,内核将通过下面的代码产生第一个真正的进程(pid=1):
- static noinline void __init_refok rest_init(void)
- {
- ...
- kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);
- ...
- cpu_idle();
- }
而此时init_task的任务基本上已经完全结束了,它将沦落为一个idle task,事实上在更早前的sched_init()函数中,通过init_idle(current, smp_processor_id())函数的调用就已经把init_task初始化成了一个idle task,init_idle函数的第一个参数current就是&init_task,在init_idle中将会把init_task加入到cpu的运行队列中,这样当运行队列中没有别的就绪进程时,init_task(也就是idle task)将会被调用,它的核心是一个while(1)循环,在循环中它将会调用schedule函数以便在运行队列中有新进程加入时切换到该新进程上。
- Linux学习第三周 Linux内核启动过程
- Linux内核启动过程学习
- 跟踪分析Linux内核的启动过程|Linux内核分析 第三周作业 - 网易云课堂
- [转]linux内核启动过程学习总结
- linux内核启动过程学习总结
- linux内核启动过程学习总结
- LINUX内核启动过程
- linux内核启动过程
- Linux内核启动过程
- Linux内核启动过程
- Linux内核启动过程
- linux内核启动过程
- LINUX内核启动过程
- linux内核启动过程
- Linux内核启动过程
- Linux内核启动过程
- linux内核启动过程
- Linux 内核启动过程
- ajax重定向问题
- LeetCode 217 Contains Duplicate
- C语言详解 - 枚举类型
- 用VMware克隆CentOS 6.4后网卡不能使用处理方法
- 不用加减乘除做加法
- Linux学习第三周 Linux内核启动过程
- ContentResolver的四个常用方法:delete().query(),update(),insert()
- 克隆系统后LINUX如何设置网卡
- java添加架包
- 蓝桥杯 移动距离 (打表)
- 【零基础入门学习Python笔记013】元祖:戴上了枷锁的列表
- 博客开通的目的和想法
- 安装php
- javascript