1.三个法宝
①存储程序计算机工作模型,计算机系统最最基础性的逻辑结构;

②函数调用堆栈,堆栈完成了计算机的基本功能:函数的参数传递机制和局部变量存取 ;

③中断,多道程序操作系统的基点,没有中断机制程序只能从头一直运行结束才有可能开始运行其他程序。

2.堆栈的基本功能:
(1)函数调用框架、传递参数(32位)、保存返回地址(如eax保存返回值/内存地址)、提供局部变量空间

(2)与堆栈相关的寄存器:esp和ebp
与堆栈相关的操作:push(入栈时esp指针会减4)、pop(出栈时esp指针会加4)

(3)CS:eip总是指向下一条指令的地址
C代码中嵌入汇编代码

一、实验要求
完成一个简单的时间片轮转多道程序内核代码,代码见视频中或从mykernel找。
详细分析该精简内核的源代码并给出实验截图,撰写一篇署名博客,并在博客文章中注明“真实姓名(与最后申请证书的姓名务必一致) + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ”,博客内容的具体要求如下:
题目自拟,内容围绕操作系统是如何工作的进行;
博客中需要使用实验截图
博客内容中需要仔细分析进程的启动和进程的切换机制
总结部分需要阐明自己对“操作系统是如何工作的”理解。
二、实验过程
首先通过cd LinuxKernel/Linux-3.9.4,“cd”表示进入目录Linux-3.9.4,用rm -rf mykernel命令强力删除mykernel。使用命令patch -pl< ../mykernel_for_linux3.9.4sc.patch,patch命令用于为特定软件包打补丁,该命令使用diff命令对源文件进行操作。格式:patch [选项] [原始文件 [补丁文件]

在Linux系统中,专门提供了一个make命令来自动维护目标文件,与手工编译和连接相比,make命令的优点在于他只更新修改过的文件(在Linux中,一个文件被创建或更新后有一个最后修改时间,make命令就是通过这个最后修改时间来判断此文件是否被修改),(make还是不太懂)使用命令qemu -kernel arch/x86/boot/bzImage搭建目标环境



通过cd mykernel ,打开mykernel目录,用ls命令看到目录内容中包括 mymain.c ,myinterrupt.c,使用命令vi mymain.c以及vi myinterrupt.c可以看到代码

可以看到每当i增加100000会执行(printf函数输出my_ start_ kernel _ here …)时会触发一次时钟中断,在由时钟中断处理函数输出(>..>>my_timer_handler<<…<)
二 操作系统内核源代码分析
首先是mypcb.h
+#define MAX_TASK_NUM 10 // max num of task in system //进程参与内核时间片转,这个系统最多有10个进程
+#define KERNEL_STACK_SIZE 1024*8 //每个进程栈的大小
+#define PRIORITY_MAX 30 //priority range from 0 to 30

  • +/* CPU-specific state of this task */
    +struct Thread {
  • unsigned long ip;//point to cpu run address //用于eip的保存
  • unsigned long sp;//point to the thread stack's top address //用于esp的保存
  • //todo add other attrubte of system thread
    +};
    +//PCB Struct
    +typedef struct PCB{ //用于表示一个进程,定义了进程管理相关的数据结构
  • int pid; // pcb id //进程编号
  • volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */
  • char stack[KERNEL_STACK_SIZE];// each pcb stack size is 1024*8
  • /* CPU-specific state of this task */
  • struct Thread thread;
  • unsigned long task_entry;//the task execute entry memory address 进程第一次执行开始的地方
  • struct PCB *next;//pcb is a circular linked list //用于构造进程链表
  • unsigned long priority;// task priority
  • //todo add other attrubte of process control block
    +}tPCB;
  • +//void my_schedule(int pid);
    +void my_schedule(void); //调用了my_schedule
    接下来是mymain.c
    +tPCB task[MAX_TASK_NUM];
    +tPCB * my_current_task = NULL;
    +volatile int my_need_sched = 0; //定义一个标志,用来判断是否需要调度
  • +void my_process(void);
    +unsigned long get_rand(int );
  • +void sand_priority(void)
    +{
  • int i;
  • for(i=0;i<MAX_TASK_NUM;i++)
  •   task[i].priority=get_rand(PRIORITY_MAX);

    +}
    +void __init my_start_kernel(void)
    +{

  • int pid = 0; 初始化一个进程0
  • /* Initialize process 0*/
  • task[pid].pid = pid;
  • task[pid].state = 0;/* -1 unrunnable, 0 runnable, >0 stopped */
  • // set task 0 execute entry address to my_process
  • task[pid].task_entry = task[pid].thread.ip = (unsigned long)my_process;
  • task[pid].thread.sp = (unsigned long)&task[pid].stack[KERNEL_STACK_SIZE-1];
  • task[pid].next = &task[pid];
  • /fork more process /
  • for(pid=1;pid<MAX_TASK_NUM;pid++)
  • {
  •    memcpy(&task[pid],&task[0],sizeof(tPCB));
  •    task[pid].pid = pid;
  •    task[pid].state = -1;
  •    task[pid].thread.sp = (unsigned long)&task[pid].stack[KERNEL_STACK_SIZE-1];
  • task[pid].priority=get_rand(PRIORITY_MAX);//each time all tasks get a random priority //每个进程都有自己的堆栈,把创建好的新进程放到进程列表的尾部
  • }
  • task[MAX_TASK_NUM-1].next=&task[0];
  • printk(KERN_NOTICE "\n\n\n\n\n\n system begin :>>>process 0 running!!!<<<\n\n");
  • /* start process 0 by task[0] */
  • pid = 0;
  • my_current_task = &task[pid];
    +asm volatile(
  • "movl %1,%%esp\n\t" /* set task[pid].thread.sp to esp */
  • "pushl %1\n\t" /* push ebp */
  • "pushl %0\n\t" /* push task[pid].thread.ip */
  • "ret\n\t" /* pop task[pid].thread.ip to eip */
  • "popl %%ebp\n\t"
  • :
  • : "c" (task[pid].thread.ip),"d" (task[pid].thread.sp) /* input c or d mean %ecx/%edx*/

    +);
    +}
    +void my_process(void) //定义所有进程的工作,if语句表示循环1000万次才有机会判断是否需要调度。
    +{

  • int i = 0;
  • while(1)
  • {
  •    i++;
  •    if(i%10000000 == 0)
  •    {
  •        if(my_need_sched == 1)
  •        {
  •            my_need_sched = 0;
  •   sand_priority();
  •   my_schedule();  
  •  }
  •    }
  • }
    +}//end of my_process
  • +//produce a random priority to a task
    +unsigned long get_rand(max)
    +{
  • unsigned long a;
  • unsigned long umax;
  • umax=(unsigned long)max;
  • get_random_bytes(&a, sizeof(unsigned long ));
  • a=(a+umax)%umax;
  • return a;
    +}

转载于:https://www.cnblogs.com/2017yaya/p/7675254.html

Linux第三周作业相关推荐

  1. 2017-2018-1 JAVA实验站 第三周作业

    2017-2018-1 JAVA实验站 第三周作业 团队展示 队名 JAVA实验站 拟作的团队项目描述 (2048)增加其他模式,使得2048更加丰富多彩 团队的首次合照 团队的特色描述 团队内部很团 ...

  2. 厚基础Linux——第七周作业

    文章目录 厚基础Linux--第七周作业 1.自建yum仓库,分别为网络源和本地源 环境规划 技术要求 需求分析 server端 client端 操作步骤 系统安装 server操作步骤 clinet ...

  3. 20189221 2018-2019-2 《密码与安全新技术专题》第三周作业

    20189221 2018-2019-2 <密码与安全新技术专题>第三周作业 课程:<密码与安全新技术专题> 班级: 201892 姓名: 郭开世 学号:20189221 上课 ...

  4. 【中文】【吴恩达课后编程作业】Course 5 - 序列模型 - 第三周作业 - 机器翻译与触发词检测

    [中文][吴恩达课后编程作业]Course 5 - 序列模型 - 第三周作业 - 机器翻译与触发词检测 上一篇:[课程5 - 第三周测验]※※※※※ [回到目录]※※※※※下一篇:无 致谢: 感谢@e ...

  5. 20189200余超 2018-2019-2 移动平台应用开发实践第三周作业

    2018-2019-2 移动平台应用开发实践第三周作业 核心类 基本类型的封装类 封装类: java语言认为一切皆对象.8个基本数据类型野应该具备对应的对象.通过封装类可以把8个基本类型的值封装对象进 ...

  6. 【中文】【吴恩达课后编程作业】Course 2 - 改善深层神经网络 - 第三周作业

    [中文][吴恩达课后编程作业]Course 2 - 改善深层神经网络 - 第三周作业 - TensorFlow入门 上一篇: [课程2 - 第三周测验]※※※※※ [回到目录]※※※※※下一篇: [课 ...

  7. 吴恩达深度学习-Course4第三周作业 yolo.h5文件读取错误解决方法

    这个yolo.h5文件走了不少弯路呐,不过最后终于搞好了,现在把最详细的脱坑过程记录下来,希望小伙伴们少走些弯路. 最初的代码是从下面这个大佬博主的百度网盘下载的,但是h5文件无法读取.(22条消息) ...

  8. 《密码与安全新技术专题》第三周作业

    学号 2018-2019-2 <密码与安全新技术专题>第三周作业 课程:<密码与安全新技术专题> 班级: 92班 姓名:张宇翔 学号:20189211 上课教师:谢四江 上课日 ...

  9. 学号20189220 2018-2019-2 《密码与安全新技术专题》第三周作业

    学号20189220 2018-2019-2 <密码与安全新技术专题>第三周作业 课程:<密码与安全新技术专题> 班级: 1892 姓名: 余超 学号:20189220 上课教 ...

最新文章

  1. 打印速度快点的打印机_佳能和爱普生打印机哪个好 高性价比打印机介绍【详解】...
  2. 今天且明白父母为什么生死度外的让孩子们读书
  3. php获得注册信息,PHP网络编程:获取用户的注册信息[2]
  4. iOS开发-开发总结(七)
  5. 个人做的一些小工具分享
  6. 深度学习图像融合_基于深度学习的图像超分辨率最新进展与趋势【附PDF】
  7. LeeCode-------Letter Combinations of a Phone Number 解法
  8. android webserver mysql,Android手机变身Web服务器,BitWebServer简单评测
  9. java限制一个接口的执行时间_Java 并发编程:任务执行器 Executor 接口
  10. 应用虚拟化之规划篇二 项目流程规划
  11. Hbase教程(一) Hbase入门教程
  12. win10 Linux双系统教程,win10+ubuntu双系统超详细教程(亲测可用)
  13. 一些常用意大利语 1000个单词
  14. PMP第11章:项目风险管理易错习题和知识点汇总
  15. 个人博客系统实践总结
  16. docker exec -it进入及退出容器
  17. 如何设置外部链接优化
  18. 计算机网络——物理层和信道复用(频分、时分、码分)技术
  19. 食品科学与工程与计算机,《计算机在食品科学与工程中的应用》课程教学改革与探索...
  20. 深入了解OpenOffice.org(三)-- OpenOffice.org中的XML应用

热门文章

  1. mysql yintint类型_MySQL服务器2 被嫌弃的胖子
  2. 哈密尔顿算法matlab,复杂制造过程最优哈密尔顿圈算法的MATLAB仿真与分析.doc
  3. spring 事务隔离级别和传播行为_Spring事务传播性与隔离性实战
  4. java vector_Java Vector elements()方法与示例
  5. php开源问答_PHP基础知识能力问答
  6. getlong_Java即时类| 带示例的getLong()方法
  7. duration java_Java Duration类| minusMinutes()方法与示例
  8. Java ClassLoader findSystemClass()方法与示例
  9. (只需挨个复制粘贴命令即可部署)在Centos7下搭建文件服务器(VSFTPD)
  10. 汇编语言-004(LABEL 、间接寻址、变址操作数、指针使用、TypeDef、LOOP、DWORD变量交换高位低位字)