2023-2024-1 20232831《Linux内核原理与分析》第九周作业



一、理解进程调度时机跟踪分析进程调度与进程切换的过程

1、理解 Linux 系统中进程调度的时机,可以在内核代码中搜索 schedule()函数,看都是哪里调用了 schedule()
2、使用 gdb 跟踪分析一个 schedule()函数 ,验证您对 Linux 系统进程调度与进程切换过程的理解
3、特别关注并仔细分析 switch_to 中的汇编代码,理解进程上下文的切换机制,以及与中断上下文切换的关系

二、实验过程

1.理解 Linux 系统中进程调度的时机

理解 Linux 系统中进程调度的时机,可以在内核代码中搜索 schedule()函数,看都是哪里调用了 schedule()。
因此在ChatGpt中询问如何搜索schedule()函数,有如下操作:

1、使用 grep 命令:

grep -r "schedule(" /path/to/kernel/source

//这里的/path/to/kernel/source是你的内核文件路径

这将在指定的内核源代码路径中递归搜索包含 “schedule(” 字符串的文件。

2、使用 find 和 grep 命令:

find /path/to/kernel/source -name "*.c" -exec grep -H "schedule(" {} \;

这将在指定的内核源代码路径中递归搜索所有 .c 文件,并查找包含 “schedule(” 的行。

3、使用 ctags 和 grep 命令:

ctags -R /path/to/kernel/source
grep -n "schedule(" tags

ctags 工具可以生成一个标签文件,然后可以使用 grep 在该文件中搜索 schedule(。

4、使用 ack 或 ag 工具:
如果系统上安装了 ack(又名 ag,The Silver Searcher),可以使用以下命令:

ack "schedule\("
或者
ag "schedule\("

这里只使用grep进行查找,发现有很多地方都使用到了schedule()函数:
在这里插入图片描述
分析并结合云班课内容,得知进程调度的时机如下:

1、中断处理过程(包括时钟中断、I/O中断、系统调用和异常)中,直接调用schedule(),或者返回用户态时根据need_resched标记调用schedule()。

2、内核线程可以直接调用schedule()进行进程切换,也可以在中断处理过程中进行调度,也就是说内核线程作为一类的特殊的进程可以主动

3、用户态进程无法实现主动调度,仅能通过陷入内核态后的某个时机点进行调度,即在中断处理过程中进行调度。

进程切换如下:

为了控制进程的执行,内核必须有能力挂起正在CPU上执行的进程,并恢复以前挂起的某个进程的执行,这叫做进程切换、任务切换、上下文切换,即进程上下文切换。挂起正在CPU上执行的进程,与中断时保存现场是不同的,中断前后是在同一个进程上下文中,只是由用户态转向内核态执行。进程上下文包含了进程执行需要的所有信息。

其中,linux系统执行过程中的几个特殊情况如下:

1、通过中断处理过程中的调度时机,用户态进程与内核线程之间互相切换和内核线程之间互相切换,与最一般的情况非常类似,只是内核线程运行过程中发生中断没有进程用户态和内核态的转换;
2、用户态进程不能主动调度schedule(),但内核线程可以主动调用schedule(),只有进程上下文的切换,没有发生中断上下文的切换,与最一般的情况略简略 ;
3、创建子进程的系统调用在子进程中的执行起点及返回用户态,那么不从标号1开始执行,从用户态开始执行,next ip=ret from work,如fork ;
4、加载一个新的可执行程序后返回到用户态的情况,如execve。

再结合ChatGPT深入理解了进程调度时机和进程切换过程:
在这里插入图片描述

2.使用 gdb 跟踪分析一个 schedule()函数

与以往的操作一致,使用gdb来进行分析,只是换成了分析schedule()函数
①基础搭建部分
先完成以下代码,实现test.c文件的更换,即换成test_exec.c

cd LinuxeKernel
rm menu -rf
git clone https://github.com/mengning/menu.git
cd menu
mv test_exec.c test.c
make rootfs

在这里插入图片描述
打开一个冻结内核,再打开一个shell进行gdb分析调试,操作与前几次实验一致

cd LinuxKernel   
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S  //冻结内核的启动

新打开一个空shell,进入gdb调试,并建立连接:

cd LinuxKernel 
gdb
(gdb)file linux-3.18.6/vmlinux
(gdb)target remote:1234

在这里插入图片描述
基础部分搭建完成,下面开始gdb分析schedule()函数。
②gdb调试部分
分别在schedule(进程调度的主体函数)context_switch(实现进程切换的函数)pick_next_task(负责根据调度策略和调度算法选择下一个进程)三处设置断点,而switch_to为宏定义,不能设置断点,需到context_switch函数中单步执行查看调用。

b schedule
b context_switch
b pick_next_task

在这里插入图片描述
下面进行分析:
在这里插入图片描述
由于switch_to不能设置断点,因此需要进行汇编级代码的分析。见下文。

3.分析 switch_to 中的汇编代码,理解进程上下文的切换机制,以及与中断上下文切换的关系

汇编代码及分析如下:

asm volatile(
             "pushfl\n\t"  //保存当前进程flags
             "pushl %%ebp\n\t"  //当前进程堆栈基址压栈
             "movl %%esp,%[prev_sp]\n\t"  //保存ESP,将当前堆栈栈顶保存起来
             "movl %[next_sp],%%esp\n\t"  //更新ESP,将下一栈顶保存到ESP中
                     // 完成内核堆栈的切换
             "movl $1f,%[prev_ip]\n\t"    //保存当前进程的EIP
             "pushl %[next_ip]\n\t"       //将next进程起点压入堆栈,即next进程的栈顶为起点
             __switch_canary              //next_ip一般为$1f,对于新创建的子进程是ret_from_fork      
             "jmp __switch_to\n"    //prve进程中,设置next进程堆栈,jmp与call不同,是通过寄存器传递参数(call通过堆栈),所以ret时弹出的是之前压入栈顶的next进程起点
             //完成EIP的切换
             "1:\t"            //next进程开始执行       
             "popl %%ebp\n\t"  //restore EBP
             "popfl\n"         //restore flags

             //输出量
             : [prev_sp] "=m" (prev->thread.sp),   //保存当前进程的esp
               [prev_ip] "=m" (prev->thread.ip),     //保存当前进仓的eip
               "=a" (last),

               //要破坏的寄存器
               "=b" (ebx), "=c" (ecx), "=d" (edx),
               "=S" (esi), "=D" (edi)

               __switch_canary_oparam

              //输入量
             : [next_sp]  "m" (next->thread.sp),   //next进程的内核堆栈栈顶地址,即esp
               [next_ip]  "m" (next->thread.ip),     //next进程的eip

               // regparm parameters for __switch_to(): 
               [prev]     "a" (prev),
               [next]     "d" (next)

               __switch_canary_iparam

             : //重新加载段寄存器
            "memory");

整个过程中,涉及了堆栈的切换、指令指针的切换,以及寄存器的保存和加载。这是进程上下文切换的核心机制,确保了从一个进程切换到另一个进程时的正确执行。与中断上下文切换的关系在于这两者都需要保存和加载寄存器,以确保上下文的无缝切换。


三、Chatgpt帮助

在这里插入图片描述

输入了switch_to 的汇编代码,让其帮忙分析:
在这里插入图片描述

总结

在本次实验中,我深入理解了进程调度时机,且跟踪分析了进程调度与进程切换的过程,加深了我对 Linux 内核调度机制的理解。

20232831袁思承
关注 关注
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
2023-2024-1 20232828《Linux内核原理分析》第五作业
yy__yy123的博客
10-19 84
getpid用于获取当前进程的进程号。pid_t zlrx;return 0;首先vim输入以下代码,然后进行编译编译成功后运行pid_t zlrx;return 0;完成本次实验,查找了部分资料,学习到了Linux 系统调用是用户程序与操作系统内核之间进行交互的接口,它允许用户程序请求操作系统提供的服务和功能。用户程序发起系统调用:当用户程序需要执行某些特权操作或者使用操作系统提供的功能时,它会通过特定的语法形式(通常是函数调用)发起系统调用请求。
边干边学Linux__第二版_doc格式
03-18
第9章 编译Linux内核 9.1 Linux内核 9.2 查找并且下载一份内核源代码 9.3 部署内核源代码 9.4 配置内核 9.5 编译内核和模块 9.6 了解Linux内核的启动 9.7 应用grub配置启动文件 9.8 编写制作Linux启动盘的shell脚本...
2023-2024-1 20232825《Linux内核原理分析第九作业
a674871089的博客
11-15 49
Linux系统中的进程调度是由调度器(scheduler)负责的,它的任务是按照一定的策略选择下一个要运行的进程。进程调度通常是由系统时钟中断触发的。Linux内核会使用时钟中断来维护系统时间,并在每次时钟中断时考虑是否进行进程切换。时钟中断的频率通常是固定的,比如每10毫秒触发一次。如果一个进程执行了系统调用或者发起了一个阻塞的操作,它会主动让出CPU,这时调度器有机会选择下一个要运行的进程。当一个进程执行完成或者由于某些原因(如等待I/O操作完成)而阻塞时,调度器会选择新的进程来执行。
2023-2024-1 20232819《Linux内核原理分析第九作业
qq_67687879的博客
11-19 34
三、输入以下指令:qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -S -s,打开qemu界面进入暂停状态。五、在schedule、context_switch、switch_to、pick_next_task处分别设置四个断点。四、配置gdb远程调试和设置断点并跟踪分析schedule()函数。一、打开实验楼,进入到LinuxKernel的menu目录。六、设置好断点之后continue。
2023-2024-1 20232817《Linux内核原理分析》第七作业
Elonli678的博客
11-15 119
是接下来四次实验的平台。但是由于MenuOS原本设计是为x86架构所服务的,如果需要在RISC-V架构上的机器上运行,就必须对关键部分的汇编代码进行修改。首先使用以下命令克隆另外一个需要修改的文件是Makefile,这个文件的修改非常重要,将决定产生的什么架构的执行文件。需要注意的是,本次实验需要使用和, 请完成第三次实验后,再来做此次实验。
2023-2024-1 20232817《Linux内核原理分析》第一作业
Elonli678的博客
09-17 320
Linus在其老师编写的Minix内核的基础上得到了自己的内核并且使用了GNU的部件组成了GNU/Linux,他给自己的内核取名Linux,意味着Linux is not Unix,并与1991 年 9 月 17 日将Linux的代码发布到一个名叫comp.os.minix的新闻组。GNU工程起先于Linus,GNU有自己的内核叫作Hurd,采用先进的微内核的技术构建,但是由于微内核的原因导致调试变得极其复杂,以至于Hurd内核始终无法作为一个成熟的内核作为操作系统的一部分。
2023-2024-1 20232828《Linux内核原理分析第九作业
yy__yy123的博客
11-15 52
第九阅读学习教材「庖丁解牛Linux 分析 」第9章,有问题优先使用chatgpt等AI工具。或者到蓝墨云班课中提问,24小时内回复,鼓励解答别人问题,提问前请阅读「如何提问」。教材深入学习关注豆列「Linux内核及安全」。学习蓝墨云班课中第九视频「Linux系统架构和执行过程概览」,并完成实验楼上配套实验八。,注意从下往上看。基于树莓派或其他平台完成ARM相关内容。
2023-2024-1 20232824《Linux内核原理分析第九作业
qq_56933926的博客
11-18 38
Linux进程调度基于分时和优先级,包括用户态和内核态的进程。内核线程是只有内核态的特殊进程,代表中断处理和其他内核任务。整体执行过程可描述为从运行的用户态进程X切换到用户态进程Y。内核线程可以主动调度而无需中断上下文切换,通过schedule()函数和宏实现上下文切换,其中switch_to用于关键上下文切换。这一结构允许灵活而高效的进程管理和调度。
2023-2024-1 20232806《Linux内核原理分析第九作业
m0_52063060的博客
11-19 26
对“Linux系统一般执行过程”的理解:Linux 系统的执行过程涉及启动引导、内核加载、初始化过程、用户空间初始化等多个步骤。1)正在运行的用户态进程X2)发生中断int 0x803)SAVE_ALL //保存现场4)中断处理过程中或中断返回前调用了schedule(),其中的switch_to做了关键的进程上下文切换5)标号1之后开始运行用户态进程Y(这里Y曾经通过以上步骤被切换出去过因此可以从标号1继续执行)6)restore_all //恢复现场7)iret。
2023-2024-1 20232813《Linux内核原理分析第九作业
m0_51629430的博客
11-19 26
中断处理过程直接调用schedule(),或者返回用户态时根据need_resched标记调用schedule()。内核线程是一个特殊的进程,只有内核态没有用户态,可以直接调用schedule()进行进程切换,也可以在中断处理过程中进行调度(内核线程可以直接访问内核函数,所以不会发生系统调用)。内核线程作为一类的特殊的进程可以主动调度,也可以被动调度。用户态进程无法实现主动调度,仅能在中断处理过程中进行调度(schedule是一个内核函数,不是一个系统调用)。
入门学习Linux常用必会60个命令实例详解doc/txt
06-09
hda1中的“1”代表hda的第一个硬盘分区 (partition),hda2代表hda的第二主分区,第一个逻辑分区从hda5开始,依此类推。此外,可以直接检查 /var/log/messages文件,在该文件中可以找到计算机开机后系统已辨认出来的...
LINUX系统管理白皮书
09-18
第9章 网络信息系统 88 9.1 NIS概述 89 9.2 NIS与NIS+之比较 90 9.3 NIS的客户端 90 9.4 NIS服务器的运行 91 9.5 用NYS设置一个NIS客户机 91 9.6 挑选合适的映射 93 9.7 使用passwd和group映射 94 9.8 NIS与...
Linux - 磁盘管理1
weixin_45735487的博客
05-27 644
逻辑分区只能在拓展分区上划分,编号5-15。拓展分区编号1-4,拓展分区不能格式化。rescue 恢复分区,对于误删的分区进行恢复,语法: rescue 起始 结束。rm 删除分区,后接要删除的分区编号。(L) 在主分区和拓展分区划分完之后,默认提示划分逻辑分区。n 进行磁盘分区,这里会默认MBR标签。(p) msdos下,会默认选择先划分主分区。
Linux chmod 命令
2301_78660211的博客
05-29 387
chmod命令是 Linux 系统中非常重要的命令,它可以用于修改文件和目录的访问权限,以及控制用户对系统资源的访问。在这篇博客中,我们深入探讨了chmod命令的使用方法,以及如何使用它来管理文件和目录的访问权限。希望这篇博客能够帮助读者更好地理解和使用 Linux 系统。
Linux echo命令(在终端输出文本)
Dontla的博客
05-22 702
echo是Linux和Unix系统中常用的一个命令行工具,主要用于在终端输出文本。该命令非常简单,但是它在脚本编程和日常系统管理中扮演着重要的角色。
Linux Centos内网环境中安装mysql5.7详细安装过程
最新发布
猿小白的博客
05-29 437
Linux Centos内网环境中安装mysql5.7详细安装过程
Linux 用户与用户组
2301_78660211的博客
05-29 344
用户和用户组是 Linux 系统中非常重要的概念,它们可以用于管理文件和目录的访问权限,以及控制用户对系统资源的访问。在这篇博客中,我们深入探讨了用户和用户组的概念、作用以及如何管理它们。希望这篇博客能够帮助读者更好地理解和使用 Linux 系统。
linux-headers-5.15.0-72-generic 这个版本的linux内核头文件应该用什么
05-27
如果你正在运行的是 Linux 内核版本为 5.15.0-72-generic 的系统,那么你需要安装对应版本的 Linux 内核头文件才能编译内核模块或驱动程序。你可以使用以下命令来安装适用于该版本内核的头文件: ``` sudo apt-get ...

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 内核编译与系统调用 1322
  • 使用 exec*库函数、编程练习动态链接库的两种使用方式 1230
  • visual studio下静态链接库的制作、动态链接库的制作 1221
  • 20232831 2023-2024-2 《网络攻防实践》第4次作业 1109
  • Vim or VSCode、gcc测试、gdb测试、静态库的测试、共享库的测试 1107

最新评论

  • 20232831 袁思承 2023-2024-2 《网络攻防实践》第7次作业

    普通网友: 写的很好,细节很到位!【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】

  • 20232831 袁思承 2023-2024-2 《网络攻防实践》第7次作业

    普通网友: 文章内容通俗易懂,适合不同层次的读者。【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】

  • 20232831袁思承2023-2024-2 《网络攻防实践》第6次作业

    普通网友: 干货满满,细节很到位!【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】

  • visual studio下静态链接库的制作、动态链接库的制作

    全栈小5: 表情包欢迎学习交流

  • visual studio下静态链接库的制作、动态链接库的制作

    20232831袁思承: 表情包

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • 20232831 袁思承 2023-2024-2 《网络攻防实践》第10次作业
  • 20232831 袁思承 2023-2024-2 《网络攻防实践》第9次作业
  • 20232831 袁思承2023-2024-2 《网络攻防实践》第8次作业
2024年9篇
2023年23篇

目录

目录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

深圳SEO优化公司吉林网站建设设计报价沙井高端网站设计公司黔南SEO按效果付费推荐长葛网站推广方案推荐大同网站开发哪家好玉溪网站优化按天收费价格九江外贸网站设计公司通化SEO按天计费价格大理seo排名公司平顶山网站优化推广公司坪山网络营销价格淮南百姓网标王推荐永州至尊标王公司南宁网络广告推广价格宝安网站优化推荐秦皇岛网站搭建公司昭通企业网站建设报价红河营销网站太原网站推广方案哪家好河池模板制作多少钱三明网站推广系统公司阳江关键词按天计费报价醴陵建站报价昭通网站优化排名推荐马鞍山外贸网站设计推荐孝感网站建设设计报价临沂百度标王报价眉山网站定制价格来宾关键词按天扣费公司坪地百度竞价包年推广哪家好歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化