Linux 0.00 的编译、运行、源码下载:
http://blog.csdn.net/longintchar/article/details/78757065
Linux 0.00 Makefile 解读:
http://blog.csdn.net/longintchar/article/details/78857966
Linux 0.00 代码解析(一):
http://blog.csdn.net/longintchar/article/details/78766916
Linux 0.00 代码解析(二):
http://blog.csdn.net/longintchar/article/details/79113612
Linux 0.00 代码解析(三):
http://blog.csdn.net/longintchar/article/details/79114486

在阅读源码后,很多时候我们有修改源码的冲动。比如说加一些自己的想法,看看修改前后运行结果的变化。这不失为一种好的学习方法。

一、让任务切换频率降低

假设N为初始计数值。任务切换的频率=1193180/N,所以,N增大则切换的频率变低(任务切换变慢),N减小则切换的频率变高(任务切换变快)。

原来的代码中, movl $11930, %eax 表示把N设置为11930,1193180/11930约等于100, 所以方波的频率是100Hz,周期是10ms,即10ms产生一次中断。

我的理解是因为N是16位的,所以N的最大值是0xFFFF(=65535),此时任务切换达到最小频率。
f = 1193180/65535=18.2(Hz)1/18.2(Hz)= 55ms,即55ms左右切换一次。

关于定时器的设置可以参考我的博文:
http://blog.csdn.net/longintchar/article/details/78885556

二、write_char过程的修改

首先,我发现此过程没有指定数据段,也就是说想调用这个过程,就要先设置好DS的值。我认为DS的值应该是内核数据段的选择子,因为scr_loc这个变量属于内核数据段。为何不在此过程中指定好数据段呢?窃以为,可以先压栈DS,然后令DS=0x10.

其次,AL作为参数,表示字符的ASCII码。我认为,可以顺便用AH传递属性。

所以,修改前后的代码对比如下(左边是修改后的)。

三、关于ignore_int

赵炯说当产生一个其他中断(不是时钟中断也不是系统调用中断)时,就会在屏幕上显示一个字符“C”。可是我根本看不到字符“C”,一气之下写了一个死循环,还是看不到程序跑进来。为什么呢?如果你知道答案,非常欢迎你留言告诉我。

四、关于system_interrupt

由于write_char过程不再需要指定DS,所以代码变得很简单。

五、Task0和Task1

六、实验结果对比

修改前:

修改后:

可以看到,除了颜色不一样之外,任务的切换速度变慢。修改前每次连续打印约10个A,修改后每次连续打印约55个A。这和上文的分析是一致的。

【本系列完】

Linux-0.00 代码解析(四)相关推荐

  1. Linux 0.00 代码解析(一)

    <Linux内核完全剖析>这本书在第4章给出了一个简单多任务内核示例程序,作者称之为Linux 0.00系统. 源码的下载地址和实验方法可以参考我的博文 http://blog.csdn. ...

  2. Linux0.00 代码解析(二)

    Linux 0.00 的编译.运行.源码下载: http://blog.csdn.net/longintchar/article/details/78757065 Linux 0.00 Makefil ...

  3. Linux 0.00 的编译和运行

    <Linux内核完全剖析>这本书在第4章给出了一个简单多任务内核示例程序,我们称之为Linux 0.00系统.本文介绍了一种把它跑起来的方法. 一.实验环境 Win7(64位)+Vmwar ...

  4. Linux 0.00简单多任务内核head.s超详注释

    # head.s包含32位保护模式初始化设置代码.时钟中断代码.系统调用中断代码和两个任务的代码. # 在初始化完成之后程序移动到任务0开始执行,并在时钟中断控制下进行任务0和1之间的切换操作. LA ...

  5. Linux-0.00 代码解析(三)

    6. 安装中断门和陷阱门 # setup timer & system call interrupt descriptors.movl $0x00080000, %eax movw $time ...

  6. Linux 0.11 内核解析:中断相关(1)asm.s文件中断处理分析

    0 源代码 有两个版本的,一个是带中文注释,Intel格式的:一个是不带注释是AT&T格式的. Linux 0.11 中文注释版 Linux 0.11 源码,基于<Linux内核完全注释 ...

  7. Linux 0.11 代码解读(一)bootsect.s

    最近在研究赵炯老师的<Linux 内核 0.11 详细注释>,将自己的粗浅理解做个简单的注记,以供有相同兴趣爱好的朋友查阅. 文章目录 一.程序功能 二.代码注记 一.程序功能 当 PC ...

  8. Linux 0.00 Makefile 说明

    关于Linux-0.00 的编译和运行可以参考我的博文:http://blog.csdn.net/longintchar/article/details/78757065 为了能在64位的Ubuntu ...

  9. Linux 0.00简单多任务内核boot.s超详注释

    ;标题:简单内核引导启动程序 ;作者:黄旭冬 ;程序描述: ; 该程序首先跳到0x07c00处,这是BIOS开始时将本程序加载到的位置, ; 然后本程序将内核代码(head.s代码)加载到0x1000 ...

最新文章

  1. 触摸屏与计算机通讯视频在线,MCGS触摸屏与电脑调试软件modbus通讯
  2. [转]Outlook HTML渲染
  3. 【进展】温度监测报警器(系统)作品项目快发布了!
  4. 神策数据受邀参加“两区”建设签约仪式
  5. apue 2013-03-16
  6. 计算机要学打字吗,有了电脑打字,还需要练字吗?
  7. 怎么查看父子级目录linux,如何查找linux中特定父目录的所有文件?
  8. Java编译器优化与运行期优化技术浅析
  9. 微软产品内部协议大公开
  10. 在Openjdk 8 中如何合理使用容器 memory 资源
  11. Layui模板-laytpl
  12. cve_2019_0708复现踩坑
  13. 关于旅游景点主题的HTML网页设计——北京景点 7页(带订单购物车)
  14. 《JavaScript实现页面图片滚动播放》
  15. PS文件的打开与关闭
  16. 解决Echarts的toolbox只显示英文的问题
  17. acer台式电脑怎么重装系统_手把手教你宏碁台式机如何重装系统
  18. 追剧达人观看电影源码
  19. cesium和前端gis开发招聘
  20. thymeleaf th:block 使用

热门文章

  1. NYOJ 题目528 找球号(三)
  2. scikit-learn的主要模块和基本使用
  3. 我是一只IT小小鸟读书笔记3
  4. 【29.70%】【codeforces 723D】Lakes in Berland
  5. (转)Docker volume plugin - enabled create local volume on docker host
  6. APIO2010 特别行动队 斜率优化DP算法笔记
  7. 8080处理器计算机启动
  8. Gloomy对Windows内核的分析
  9. CUDA函数库调用问题解决
  10. X Window、GNOME和KDE之间的关系