linux源码 进程调度初始化,start_kernel到init进程的启动过程

1.下载linux-3.18.6的内核源码,并且编译

cd ~/LinuxKernel/  wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.18.6.tar.xzxz -d linux-3.18.6.tar.xztar -xvf linux-3.18.6.tarcd linux-3.18.6make i386_defconfig  make# 一般要编译很长时间,少则20分钟多则数小时

2.制作根文件系统

cd ~/LinuxKernel/

mkdir rootfs

git clone  https://github.com/mengning/menu.git

cd menu

gcc -o init linktable.c menu.c test.c -m32 -static –lpthread

cd ../rootfs  cp ../menu/init ./

find . | cpio -o -Hnewc |gzip -9 > ../rootfs.img

3.启动MenuOS

cd ~/LinuxKernel/

qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img

qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img-s-S

(gdb)file linux-3.18.6/vmlinux# 在gdb界面中targe remote之前加载符号表

(gdb)target remote:1234# 建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行

(gdb)breakstart_kernel# 断点的设置可以在target remote之前,也可以在之后

调试运行之后做出一下分析:

asmlinkage __visiblevoid__init start_kernel(void) {

set_task_stack_end_magic(&init_task);/*init_task即手工创建的PCB,0号进程就是最终的idle进程*/

trap_init();/*初始化中断向量*/

mm_init();/*内存管理模块初始化*/

sched_init();/*调度模块初始化*/

rest_init()/* 是0号进程,并且创建了1号进程,并创建了一些其他的服务进程,会一直驻留内存*/}

其中最重要的功能如上面代码所示,分别创建0号进程,初始化中断向量,初始化内存管理模块,初始化调度模块。

0号进程常驻内存,创建一号进程和其他服务进程,而其他的模块初始化为以后的程序运行打下基础。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值