以下测试也就系统运行起来跑了一会,大概几分钟,没有长时间等着看结果。
linux-5.9.10内核
指定smp=1,qemu启动,启动参数如下,主要是指定了smp=1
#!/bin/sh
para=""
if [ -n "$1" ]; then
para="-S -gdb tcp::$1"
fi
/ImageStore/ruguang/src/qemu-5.1.0/build/x86_64-softmmu/qemu-system-x86_64 \
-kernel /ImageStore/ruguang/project/qemu-linux/obj/linux/arch/x86_64/boot/bzImage \
-initrd /ImageStore/ruguang/project/qemu-linux/obj/initramfs.igz \
-smp 1 -nographic -append "nokaslr earylyprintk=serial,ttyS0 console=ttyS0" $para
总结:
问题描述:
在smp=1的情况下,
在enqueue_task_fair函数中,加打印,似乎好像只要会用到终端显示,如果一直按回车,系统就会卡死;但是回车要是按得巧,系统也可以没问题运行;
而在__schedule函数中,怎么打印都没问题;
原因解释:还在分析寻找
还在分析,一开始我以为就是简单的抢终端使用的问题,以为在smp=1下,只要打印,就会占着终端就会出现问题。但事实上在不同的函数中打印效果是不同的(比如enqueue_task_fair函数和__schedule函数)。是否根关闭了中断或者关闭了抢占有关系?
CFS调度器
enqueue_task_fair函数中
只加一句打印语句,其他都不动
1. printk, KERN_DEBUG:
结果:正常运行
2. printk, KERN_INFO:
结果:不按回车系统正常,按回车系统卡死
3. printk_ratelimited, KERN_DEBUG:
结果:系统卡死
一开始还能用dmesg看看信息的,过了一小会,回车就没反应了
再等久一点时间,qemu也无反应,ctrl+a+x也关不掉,只能kill掉进程
不按回车,或者按回车的时候不在要打印的时候,似乎系统是没问题的
4. printk_ratelimited, KERN_INFO:
结果:系统卡死
不按回车,或者按回车的时候不在要打印的时候,似乎系统是没问题的
__schedule函数中
只加一句打印,其他什么都不动
1. printk, KERN_DEBUG
结果:正常运行
2. printk, KERN_INFO
结果:正常运行
系统能跑起来,就是打印很多,按回车是有正常反应的
3. printk_ratelimited, KERN_DEBUG
结果:正常运行
4. printk_ratelimited, KERN_INFO
结果:正常运行
自定义fifo调度器
enqueue_task_fifo函数中
和cfs效果一样的,只有第一种情况没问题
1. printk, KERN_DEBUG
结果:正常运行
2. printk, KERN_INFO
结果:不按回车系统正常,按回车系统卡死
(1)不按回车键,不干扰系统,系统一直往下打印,似乎没卡死
(2)一旦按下回车,系统就卡死
3. printk_ratelimited, KERN_DEBUG
结果:系统卡死
按下回车,准备输入,系统直接就卡死了
4. printk_ratelimited, KERN_INFO
结果:系统卡死
依旧是按下回车,准备输入,系统直接就卡死了
似乎是只要按回车的时候不和打印冲突,可能就没事,要是一直快速按回车,就会卡死,大概就是在要打印的时候卡死了,难道和占着终端有关系?