微思考源码weisico.com|分享互联网优质资源,免费织梦模板,WP主题下载

基于mykernel简单的时间片轮转多道程序内核代码分析

朱明涛 原创作品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

mykernel实验指导(操作系统是如何工作的)

运行并分析一个精简的操作系统内核,理解操作系统是如何工作的

使用实验楼的虚拟机打开shell

cd LinuxKernel/linux-3.9.4
qemu -kernel arch/x86/boot/bzImage

然后cd mykernel 您可以看到qemu窗口输出的内容的代码mymain.c和myinterrupt.c

试验过程

试验环境使用的是实验楼由孟老师搭建的基于kernel的linux内核环境平台

登录试验环境后,打开shell,输入以下命令

  1. cd LinuxKernel/linux-3.9.4

  2. qemu -kernel arch/x86/boot/bzImage


2015031501.png

运行一个精简的linux操作系统内核

如图所示:

2015031502.png

在试验中我们可以看到,qemu窗口不断循环输出my_start_kernel here和my_timer_handler here代码。

关闭qemu窗口,输入cd mykernel 可以看到qemu窗口输出的内容的代码mymain.c和myinterrupt.c

输入vi mymain.c,我们先来查看该代码,主要代码如图所示:

2015031503.png

可以在函数 void __init my_start_kernel(void)中找到qemu窗口输出的一个内容:my_start_kernel here

输入vi myinterrupt.c 可以找到qemu窗口输出的另一个内容:my_timer_handler here,如图所示

2015031504.png

分析:

通过这个实验我们可以知道,mykernel系统启动后,调用my_start_kernel函数和my_timer_handler函数,完成系统进程的初始化和进程的轮转调度。

我们所要做的是修改这两个函数,就可以定制一个我们自己的简单的基于kernel的linux操作系统内核了。

总结:

通过该实验操作,成功实现了一个简单的时间片轮转多道程序,通过一个精简的操作系统内核,完成了一个简单的操作系统功能。知道计算机工作的三个法宝是存储程序计算机,函数调用堆栈,中段机制。操作系统通过进程调度和中断机制,实现任务切换。

附mymain.c 和myinterrupt.c详细代码

1.mymain.c
/* 
*  linux/mykernel/mymain.c 
* 
*  Kernel internal my_start_kernel 
* 
*  Copyright (C) 2013  Mengning 
* */
#include <linux/types.h>
#include <linux/module.h>
#include <linux/proc_fs.h>
#include <linux/kernel.h>
#include <linux/syscalls.h>
#include <linux/stackprotector.h>
#include <linux/string.h>
#include <linux/ctype.h>
#include <linux/delay.h>
#include <linux/ioport.h>
#include <linux/init.h>
#include <linux/initrd.h>
#include <linux/bootmem.h>
#include <linux/acpi.h>
#include <linux/tty.h>
#include <linux/percpu.h>
#include <linux/kmod.h>
#include <linux/vmalloc.h>
#include <linux/kernel_stat.h>
#include <linux/start_kernel.h>
#include <linux/security.h>
#include <linux/smp.h>
#include <linux/profile.h>
#include <linux/rcupdate.h>
#include <linux/moduleparam.h>
#include <linux/kallsyms.h>
#include <linux/writeback.h>
#include <linux/cpu.h>
#include <linux/cpuset.h>
#include <linux/cgroup.h>
#include <linux/efi.h>
#include <linux/tick.h>
#include <linux/interrupt.h>
#include <linux/taskstats_kern.h>
#include <linux/delayacct.h>
#include <linux/unistd.h>
#include <linux/rmap.h>
#include <linux/mempolicy.h>
#include <linux/key.h>
#include <linux/buffer_head.h>
#include <linux/page_cgroup.h>
#include <linux/debug_locks.h>
#include <linux/debugobjects.h>
#include <linux/lockdep.h>
#include <linux/kmemleak.h>
#include <linux/pid_namespace.h>
#include <linux/device.h>
#include <linux/kthread.h>
#include <linux/sched.h>
#include <linux/signal.h>
#include <linux/idr.h>
#include <linux/kgdb.h>
#include <linux/ftrace.h>
#include <linux/async.h>
#include <linux/kmemcheck.h>
#include <linux/sfi.h>
#include <linux/shmem_fs.h>
#include <linux/slab.h>
#include <linux/perf_event.h>
#include <linux/file.h>
#include <linux/ptrace.h>
#include <linux/blkdev.h>
#include <linux/elevator.h>
#include <asm/io.h>
#include <asm/bugs.h>
#include <asm/setup.h>
#include <asm/sections.h>
#include <asm/cacheflush.h> 
#ifdef CONFIG_X86_LOCAL_APIC
#include <asm/smp.h>
#endif
void __init my_start_kernel(void)
{    
    int i = 0;    
    while(1)    
    {        
        i++;        
        if(i%100000 == 0)            
        printk(KERN_NOTICE "my_start_kernel here  %d \n",i);               
    }
}

2.myinerrupt.c

/*

 *  linux/mykernel/myinterrupt.c

 *

 *  Kernel internal my_timer_handler

 *

 *  Copyright (C) 2013  Mengning

 *

 */

#include <linux/kernel_stat.h>

#include <linux/export.h>

#include <linux/interrupt.h>

#include <linux/percpu.h>

#include <linux/init.h>

#include <linux/mm.h>

#include <linux/swap.h>

#include <linux/pid_namespace.h>

#include <linux/notifier.h>

#include <linux/thread_info.h>

#include <linux/time.h>

#include <linux/jiffies.h>

#include <linux/posix-timers.h>

#include <linux/cpu.h>

#include <linux/syscalls.h>

#include <linux/delay.h>

#include <linux/tick.h>

#include <linux/kallsyms.h>

#include <linux/irq_work.h>

#include <linux/sched.h>

#include <linux/sched/sysctl.h>

#include <linux/slab.h>

#include <asm/uaccess.h>

#include <asm/unistd.h>

#include <asm/div64.h>

#include <asm/timex.h>

#include <asm/io.h>

#define CREATE_TRACE_POINTS

#include <trace/events/timer.h>

/*

 * Called by timer interrupt.

 */

void my_timer_handler(void)

{

       printk(KERN_NOTICE "\n>>>>>>>>>>>>>>>>>my_timer_handler here<<<<<<<<<<<<<<<<<<\n\n");

}

朱明涛 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 


微信公众号 weisico-com

微信公众号weisico-com

转载请注明:微思考学习网-关注技术,分享知识 >> 基于mykernel简单的时间片轮转多道程序内核代码分析

赞 (0) 收藏
分享到

相关阅读