3.分析Linux内核的启动过程

本文详细解析了Linux内核的启动过程,从实验步骤开始,利用QEMU和GDB逐步跟踪内核启动的关键函数start_kernel。介绍了start_kernel如何初始化核心组件如中断、内存管理和进程调度,并创建第一个内核进程和线程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

请注意:>原作者:张澍> 原创作品转载请注明出处> 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

1.实验步骤

cd LinuxKernel/
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选项

另开一个shell窗口

gdb
(gdb)file linux-3.18.6/vmlinux # 在gdb界面中targe remote之前加载符号表
(gdb)target remote:1234 # 建立gdb和gdbserver之间的连接
(gdb)break start_kernel # 断点的设置可以在target remote之前,也可以在之后
(gdb)c #按c 让qemu上的Linux继续运行
(gdb)list # 查看此处代码

2.实验分析

内核启动函数:

asmlinkage __visible void __init start_kernel(void)
set_task_stack_end_magic(&init_task);//init_task及手工创建的PCB ,0号进程及最终的idle进程
trap_init();//中断初始模块
mm_init();//内存初始模块
sched_init();//调度进程模块
。。。。。。
rest_init();// -> kernel_thread() -> kernel_init    ->  kernel_init //创建内核一号进程
                                                    ->  kthreadd //创建内核服务线程
                                                    ->  cpu_startup_entry -> cpu_idle_loop//进入循环状态

rest_init()//创建进程模块:
这里写图片描述

3.总结

通过start_kernel内核先生成1号进程再生成1号线程,由此产生之后的用户态的其他进程,线程。

正所谓:道生一(start_kernel….cpu_idle),一生二(kernel_init和kthreadd),二生三(即前面0、1和2三个进程),三生万物(1号进程是所有用户态进程的祖先,2号进程是所有内核线程的祖先),新内核的核心代码已经优化的相当干净,都符合中国传统文化精神了1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值