一.分析system_call中断处理过程

实验

下载最新menu,并在test.c中增加mkdir与mkdir-asm函数原型

rm menu -rf
git clone https://github.com/mengning/menu.git
cd menu
vim test.c

增加下面的代码:

int Mkdir(int argc,char *argv[]){if(mkdir(argv[1],S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) == 0)printf("New dir successfully!\n");elseprintf("New dir failed!\n");return 0;
}
int MkdirAsm(int argc,char *argv[]){int intr;mode_t mode = S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH;__asm__ __volatile__("int $0x80;\n\t": "=a" (intr): "a"(39),"b"(argv[1]),"c"(mode):"memory");if(intr == 0)printf("New dirasm successfully!\n");elseprintf("New dirasm failed!\n");return 0;
}

有两点需要强调,这也是我实验过程中出现过问题,才改进之后的代码!

  • 注意加头文件#include <sys/stat.h> #include <sys/types.h>
  • mkdir系统调用的结果是创建一个目录,而MenuOS并没有ls这个命令,所以为了验证我们添加mkdir和mkdir-asm命令成功,必须在函数中添加相应的判断与输出的语句,所以与上次实验代码相比,这里多了if与else语句和printf语句。否则我们无法验证在MenuOS中命令是否执行成功。


    上面这个图我是先用mkdir创建了一个testdir目录,显示创建成功;随后我又用mkdir-asm又创建testdir这个目录,因为这个目录刚才已经用mkdir创建过,所以必然失败,这也变相说明上一步mkdir创建成功;随后我又用mkdir-asm创建了testdir1,显示创建成功。
    下一步进行gdb调试:
cd ..
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S          //启动并“冰冻”
gdb linux-3.18.6/vmlinux
target remote:1234    //连接到刚启动的虚拟机


上图为b start_kernel之后的结果。
根据39号系统调用的内核函数sys_mkdir,执行b sys_mkdir

结果系统停在了启动的“半路上”。并不是像断sys_time那样。很显然,这说明在内核启动过程中,必然要调用sys_mkdir该系统调用(虽然我现在还不知道有哪些过程要调用它,但可以肯定的是一定有过程调用它!)。
还得出一条心得就是实验楼环境是真的不好用,每当我把当前界面换到启动的虚拟机,则必然造成死机。只有重新开始实验,这样造成的结果就是我还得重新下载menu,重新编写test.c。不仅如此,还无法实施对mkdi与mkdir-asm的跟踪,因为一切换到MenuOS就卡掉了,根本没法输入命令。

总结

system_call到iret之间的简化后伪代码:

ENTRY(system_call)SAVE_ALL
syscall_call:call *sys_call_table(,%eax,4)movl    %eax,PT_EAX(%eax)                //保存返回值
syscall_exit:testl    $_TIF_ALLWORK_MASK,%ecx  //current—>workjne      syscall_exit_work
restore_all:RESTORE_INT_REGS
irq_return:INTERRUPT_PETURN
ENDPROC(system_call)
syscall_exit_work:testl    $_TIF_WORK_SYSCALLEXIT,%ecxjz        work_pending
END(syscall_exit_work)
work_pending:testb    $_TIF_NEED_RESCHED,%c1jz         work_notifysig
work_resched:call    schedulejz       restore_all
work_notifysig:...
END(work_pending) 

流程图:

简化后的伪代码中只留下了一部分重要代码。比如对系统调用结束时要做的工作,这里只留下了两个判断,一个是是否有需要处理的信号,如果有,那就跳到相应的处理入口地址;第二个是是否需要进程调用,如果有那就转去处理进程调用,如果没有就结束。其实我们浏览没有简化的代码会发现,在这个过程中还有判断是否发生异常及异常处理等代码。

二.课本第九、十章内核同步

临界区的引出

共享资源之所以要防止并发访问,是因为如果多个执行线程同时访问和操作数据,就有可能发生各个线程之间相互覆盖共享数据的情况,造成被访问数据处于不一致状态。而访问和操作共享数据的代码段就被称为临界区。所以两个执行中的线程不可能处于同一个临界区中共同执行,一个临界区在执行完之前不可被打断。

同步和互斥

互斥指散布在不同进程之间的若干程序片断,当某个进程运行其中一个程序片段时,其它进程就不能运行它们之中的任一程序片段,只能等到该进程运行完这个程序片段后才可以运行。
同步是散布在不同进程之间的若干程序片断,它们的运行必须严格按照规定的某种先后次序来运行,这种先后次序依赖于要完成的特定的任务。

加锁

如果有一个线程对共享的数据加锁,则其他的线程就不能再访问该共享数据,必须等解锁之后才能去访问。简而言之,对同一共享数据,特定时间内只有一个线程可以进入与该共享数据对应的临界区。

死锁

  • 若系统中存在一组进程(两个或多个进程),它们中的每一个进程都占用了某种资源而又都在等待其中另一个进程所占用的资源,这种等待永远不能结束,则说系统出现了“死锁”。或说这组进程处于“死锁”状态。
  • 死锁产生的必要条件
    • 互斥使用资源
    • 占有并等待资源
    • 不可抢夺资源
    • 循环等待资源
  • 解决死锁的办法就是打破上述一个或多个必要条件。

    自旋锁

    自旋锁最多只能被一个可执行线程持有,如果一个执行线程试图获得一个被已经持有的自旋锁,那么该线程就会一直进行忙循环——旋转——等待锁重新可用。要是锁未被争用,请求锁的执行线程便能立刻得到它们继续执行。在任意时间,自旋锁都可以防止多于一个的执行线程同时进入临界区。同一个锁可以用在多个位置。

    信号量

  • 计数信号量,比如读者-写者问题中的读者的数量。
  • 二值信号量,比如读者-写者问题中对读者数量count的访问。

    BLK:大内核锁

    BLK是一个全局自旋锁,使用它主要是为了方便Linux最初的SMP过度到细粒度加锁机制。

  • 持有BLK的任务仍然可以睡眠。
  • BLK是一种递归锁。
  • BLK只可用在进程上下文中。
  • 新的用户不允许使用BLK。

转载于:https://www.cnblogs.com/genius-sen/p/7787058.html

2017-2018-1 20179209《Linux内核原理与分析》第六周作业相关推荐

  1. 2017-2018-1 20179215《Linux内核原理与分析》第二周作业

    20179215<Linux内核原理与分析>第二周作业 这一周主要了解了计算机是如何工作的,包括现在存储程序计算机的工作模型.X86汇编指令包括几种内存地址的寻址方式和push.pop.c ...

  2. 2022-2023-1 20222809《Linux内核原理与分析》第一周作业

    Linux内核原理与分析第一周作业 配置环境 1.参考Linux(Ubuntu)系统安装图文教程中第二种借助virtualbox成功配置Ubuntu环境 2.升级更新软件包 可以通过调节分辨率和虚拟机 ...

  3. 实验楼 linux内核原理与分析,《Linux内核原理与分析》第一周作业 20189210

    实验一 Linux系统简介 这一节主要学习了Linux的历史,Linux有关的重要人物以及学习Linux的方法,Linux和Windows的区别.其中学到了LInux中的应用程序大都为开源自由的软件, ...

  4. 《Linux内核原理与分析》第二周作业

    反汇编一个简单的C程序 1.实验要求 使用: gcc –S –o test.s test.c -m32 命令编译成汇编代码,对汇编代码进行分析总结.其中test.c的具体内容如下: int g(int ...

  5. 2018-2019-1 20189218《Linux内核原理与分析》第九周作业

    进程调度的时机 进程调度时机就是内核调用schedule函数的时机.当内核即将返回用户空间时,内核会检查need_resched标志是否设置.如果设置,则调用schedule函数,此时是从中断(或者异 ...

  6. 2021-2022-1 20212820《Linux内核原理与分析》第一周作业

    声明:本文是基于Linux 基础入门_Linux - 蓝桥云课 (lanqiao.cn)这门课学习所写的课程笔记. 实验1 Linux系统简介 Linux主要包括是系统调用和内核两部分 Linux与W ...

  7. 20189220 余超《Linux内核原理与分析》第一周作业

    实验一 Linux系统简介 通过实验一主要是学习到了Linux 的历史简介,linux与windows之间的区别,主要是免费和收费,软件和支持,安全性,使用习惯,可制定性,应用范畴等.linux具有稳 ...

  8. 2022-2023-1 20222816《Linux内核原理与分析》第一周作业

    目录 实验一     Linux系统简介 实验二     基础概念及操作 实验三     用户及文件权限管理 总结 第一周课后在实验楼学习了<Linux入门>(新版),以下是我本周的学习笔 ...

  9. 20179209《Linux内核原理与分析》第一周作业

    如何揭开Linux操作系统的最大面纱 个人认为,真正理解一个操作系统最根本的就是理解其文件系统结构. 自windows图形界面诞生,国内大多数用户都选择了windows操作系统,很多人觉得window ...

  10. 2018-2019-1 20189201 《LInux内核原理与分析》第九周作业

    那一天我二十一岁,在我一生的黄金时代.我有好多奢望.我想爱,想吃,还想在一瞬间变成天上半明半暗的云.那一年我二十一岁,在我一生的黄金时代.我有好多想法.我思索,想象,我不知该如何行动,我想知道一个城市 ...

最新文章

  1. 【学习笔记】智能制造问与答
  2. Codeforces 930 A. Peculiar apple-tree (dfs)
  3. 最简单的dockerfile使用教程 - 创建一个支持SSL的Nginx镜像
  4. 程序员谈谈我的职场观(三)
  5. 填词游戏java_第八届蓝桥杯国赛 Java B组 第五题 填字母游戏(博弈论)
  6. jsp oracle连接池,利用Oracle自带的连接池类的一例
  7. bzoj 3156: 防御准备
  8. LINUX find、ln 常用命令总结
  9. 怎样编写和执行Js文件
  10. python turtle画房子详细解释_简述python的turtle绘画命令及解释
  11. win10 桌面的的文件都不见了 提示不注销保存都文件都为临时_舒心,享受——win10美化...
  12. 基于人机环境系统工程的智慧企业建设思考(2)
  13. 浦发招聘笔试计算机部分考啥,2019浦发银行校园招聘考试题型及题量分布
  14. CSS_19种鼠标指针光标样式
  15. VUE前端删除和批量删除
  16. [真诚的思考](http://simplemind.info/blog/?p=423)
  17. 刷新率属于计算机的显示性能指标吗,显示器性能参数的含义
  18. mysql 走索引 很慢_技术分享 | MySQL优化:为什么SQL走索引还那么慢?
  19. 计算机开考科目,计算机等级考试明年开考科目确定
  20. Google AdWords Essential Training Google AdWords基本培训 Lynda课程中文字幕

热门文章

  1. VB将自定义资源中的文件释放出来
  2. 什么是缩量、放量、堆量
  3. 智能一代云平台(五):移动开发之环境搭建
  4. 计算机中那些事儿(三):我与Dos的不解情缘---初识篇
  5. 清华,就要成为地表最强研究机构了
  6. 机器学习和AI的区别是什么?| 今日吐槽
  7. NVIDIA英伟达:深度学习服务器搭建指南 | 交流会笔记
  8. display:table与本身的table的区别
  9. C# 简单日志文本输出
  10. 简单识别 RESTful 接口