linux 内核 第二周 操作系统是如何工作的
姬梦馨
原创博客
《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
一:计算机的三个法宝
存储程序计算机工作模型,计算机系统最最基础性的逻辑结构;
函数调用堆栈,高级语言得以运行的基础,只有机器语言和汇编语言的时候堆栈机制对于计算机来说并不那么重要,但有了高级语言及函数,堆栈成为了计算机的基础功能;
enter
pushl %ebp
movl %esp,%ebp
leave
movl %ebp,%esp
popl %ebp
函数参数传递机制和局部变量存储
中断,多道程序操作系统的基点,没有中断机制程序只能从头一直运行结束才有可能开始运行其他程序。
二:深入理解函数调用堆栈
三:参数传递和局部变量
四:mykernel 实验背后的思想和计算机环境
1:搭建一个虚拟的平台
2:配置系统
3:执行程序
五:在其基础上简单地操作系统实验
2:两个百分号 转移字符
实验过程及步骤
使用实验楼的虚拟机打开shell
然后cd mykernel 您可以看到qemu窗口输出的内容的代码mymain.c和myinterrupt.c
实验代码myinterrupt
及其分析
/*
* linux/mykernel/myinterrupt.c
* Kernel internal my_timer_handler
* Copyright (C) 2013 Mengning
*/
#include <linux/types.h>
#include <linux/string.h> #include <linux/ctype.h> #include <linux/tty.h> #include <linux/vmalloc.h> #include "mypcb.h" extern tPCB task[MAX_TASK_NUM]; extern tPCB * my_current_task; extern volatile int my_need_sched; volatile int time_count = 0; /* * Called by timer interrupt. * it runs in the name of current running process, * so it use kernel stack of current running process */ void my_timer_handler(void)//用于设置时间片的大小,时间片用完时设置调度标志。 { #if 1 if(time_count%1000 == 0 && my_need_sched != 1) { printk(KERN_NOTICE ">>>my_timer_handler here<<<\n"); my_need_sched = 1; } time_count ++ ; #endif return; } void my_schedule(void) { tPCB * next; tPCB * prev; if(my_current_task == NULL //task为空,即发生错误时返回 || my_current_task->next == NULL) { return; } printk(KERN_NOTICE ">>>my_schedule<<<\n"); /* schedule */ next = my_current_task->next;//把当前进程的下一个进程赋给next prev = my_current_task;//当前进程为prev if(next->state == 0)/* -1 unrunnable, 0 runnable, >0 stopped */ { /* switch to next process */ /*如果下一个进程的状态是正在执行的话,就运用if语句中的代码表示的方法来切换进程*/ asm volatile( "pushl %%ebp\n\t" /* save ebp 保存当前进程的ebp*/ "movl %%esp,%0\n\t" /* save esp 把当前进程的esp赋给%0(指的是thread.sp),即保存当前进程的esp*/ "movl %2,%%esp\n\t" /* restore esp 把%2(指下一个进程的sp)放入esp中*/ "movl $1f,%1\n\t" /* save eip $1f是接下来的标号“1:”的位置,把eip保存下来*/ "pushl %3\n\t" /*把下一个进程eip压栈*/ "ret\n\t" /* restore eip 下一个进程开始执行*/ "1:\t" /* next process start here */ "popl %%ebp\n\t" : "=m" (prev->thread.sp),"=m" (prev->thread.ip) : "m" (next->thread.sp),"m" (next->thread.ip) ); my_current_task = next; printk(KERN_NOTICE ">>>switch %d to %d<<<\n",prev->pid,next->pid); } else//用于下一个进程为未执行过的新进程时。首先将这个进程置为运行时状态,将这个进程作为当前正在执行的进程。 { next->state = 0; my_current_task = next; printk(KERN_NOTICE ">>>switch %d to %d<<<\n",prev->pid,next->pid); /* switch to new process */ asm volatile( "pushl %%ebp\n\t" /* save ebp */ "movl %%esp,%0\n\t" /* save esp */ "movl %2,%%esp\n\t" /* restore esp */ "movl %2,%%ebp\n\t" /* restore ebp */ "movl $1f,%1\n\t" /* save eip */ "pushl %3\n\t" /*把当前进程的入口保存起来*/ "ret\n\t" /* restore eip */ : "=m" (prev->thread.sp),"=m" (prev->thread.ip) : "m" (next->thread.sp),"m" (next->thread.ip) ); } return; }
2、mymain.c
内核初始化和0号进程启动
实验体会:
实验步骤虽然很简单,但过程是很复杂的,需要自己慢慢的理解,体会。理解代码的过程是很复杂的,需要耐心和认真。
希望自己以后分析代码的时候能够更加的细心,认真。
转载于:https://www.cnblogs.com/ShadowStealer/p/5246444.html
linux 内核 第二周 操作系统是如何工作的相关推荐
- linux如何分析系统的堆栈,Linux内核分析:操作系统是如何工作的?
函数调用堆栈 堆栈是C语言程序运行时必须的一个记录调用路径和参数的空间 堆栈的几个重要功能 函数调用框架 传递参数 保存返回地址 提供局部变量空间 等等 C语言编译器对堆栈的使用有一套的规则 了解堆栈 ...
- 《Linux内核分析》 第二节 操作系统是如何工作的
Linux内核分析 第二周 操作系统是如何工作的 张嘉琪 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/UST ...
- Linux内核第二节
作者:武西垚 深入理解函数调用堆栈 堆栈是C语言程序运行时必须的一个记录调用路径和参数的空间 堆栈的作用 函数调用框架 传递参数 保存返回地址 提供局部变量空间 堆栈相关的寄存器 esp,堆栈指针,指 ...
- 如何进行linux内核开发,2. 开发流程如何工作 — The Linux Kernel documentation
2.1.总览¶ 内核开发人员使用一个松散的基于时间的发布过程,每两到三个月发布一次新的主要 内核版本.最近的发布历史记录如下: 4.11 四月 30, 2017 4.12 七月 2, 2017 4.1 ...
- linux内核打开prntk,操作系统实验一向Linux内核增加一个系统调用.docx
操作系统实验一: 向Linux内核增加一个系统调用 xx 711103xx 2012年3月18日 一.实验目的 通过实验,熟悉Linux操作系统的使用,掌握构建与启动Linux内核的方法:掌握用 户程 ...
- linux 内核rt,实时操作系统kernel rt
https://blog.csdn.net/baidu_34045013/article/details/78886617 实时应用程序在某些触发事件和应用程序对该事件的响应之间有操作截止日期.为了满 ...
- linux 内核定时器精度_高精度时钟工作机制简介
1. 为什么会有高精度时钟 既然提到高精度,那么其对应的就是低精度,所以高精度时钟是为了解决低精度时钟计时精度不足的问题.举个例子帮助理解,日出而作,日落而息,古人以天为单位,安排劳作和休息.随着生产 ...
- 深度linux内核升级,深度操作系统 2020.11.11 更新发布:内核升级
原标题:深度操作系统 2020.11.11 更新发布:内核升级 IT之家11月11日消息 今日,深度操作系统宣布2020.11.11 更新现已发布.本次更新包括升级内核.Debian 10.6 仓库以 ...
- 查看linux ko内核版本,查看linux内核版本及操作系统版本的命令
一.查看内核版本命令: (1)[[email protected] ~]#cat/proc/version Linux version 2.6.18-238.el5 ([email protected ...
最新文章
- 基于.net平台remoting、DB2技术的大型分布式HIS系统架构及开发(项目架构师方向)...
- 计算机网络实验报告4icmp,实验04-ip、icmp协议分析
- AQS.doReleaseShared
- Comet OJ(Contest #8)-D菜菜种菜【树状数组,指针】
- 【Gym - 101915D】Largest Group(二分图最大团,状压dp)
- 目标检测算法图解:一文看懂RCNN系列算法
- 信息学奥赛一本通(1216:红与黑)
- MySql 5.7 json数据格式 增删改查 操作 (不定时更新)
- SpringBoot默认日志配置输出级别
- 用计算机算cos1,cos计算器(数学三角函数计算器)
- Dreamweaver网页设计与制作100例:用DIV+CSS技术设计的书法主题网站(web前端网页制作课作业)...
- 《现代通信原理学习》(二)随机信号分析
- 2023考研高数思维导图
- 假AI?如何辨识 AI 界的snake oil
- SpringCloud-Gateway Feign
- 8月App Store交友软件下载量TOP10,陌陌、觅伊、soul上榜
- 算法题解01——对分搜索求立方根
- 高等数学:第五章 定积分(3) 微积分基本公式
- 02) android studio 创建安卓虚拟机,使用虚拟机调试
- #云栖大会# 移动安全专场——APP渠道推广作弊攻防那些事儿(演讲速记)