2020年5月13日星期三

基于mykernel 2.0编写一个操作系统内核

基于mykernel 2.0编写一个操作系统内核


资源下载:https://github.com/mengning/mykernel

实验内容:

1、配置实验环境,完成Linux内核编译。

2、对系统源码进行修改,基于mykernel 2.0实现一个简单的操作系统内核。

3、简要分析操作系统内核核心功能及运行工作机制。

实验环境:

VMWare虚拟机下的Ubuntu18.04.4,实验采用的内核版本为linux-5.4.34。


1 内核编译

1.1 准备工作

1.1.1 修改镜像源地址

为了节省资源下载时间,使用国内镜像源。

cd /etc/apt/sudo cp sources.list sources.list.bksudo gedit sources.list
deb bionic main multiverse restricted universedeb bionic-updates main multiverse restricted universedeb bionic-security main multiverse restricted universedeb bionic-proposed main multiverse restricted universedeb bionic-backports main multiverse restricted universe

将sources.list修改保存后,更新apt源。

sudo apt-get update

1.1.2 添加hosts映射

新增GitHub资源域名与对应IP的映射。

sudo vi /etc/hosts
151.101.76.133 raw.githubusercontent.com

1.1.3 安装axel

多线程下载工具,用于下载Linux内核。

sudo apt install axel

1.2 下载内核补丁

wget https://raw.github.com/mengning/mykernel/master/mykernel-2.0_for_linux-5.4.34.patch

补丁文件如下,根据diff对比,主要做了以下改动:

  • 在时钟中断时调用自定义的my_timer_handler函数,打印输出>>>>>>>my_timer_handler here<<<<<<<<
  • 在start_kernel.h与timer.h中分别声明my_start_kernel与my_timer_handler函数
  • 在main.c中调用my_start_kernel函数
  • 在Makefile中新增mykernel的编译路径
  • 创建mykernel的Makefile文件
  • 编写myinterrupt.c与mymain.c文件,mymain.c中模拟系统运行,每100000次循环输出一次
diff -Naur linux-5.4.34/arch/x86/kernel/time.c linux-5.4.34-mykernel/arch/x86/kernel/time.c--- linux-5.4.34/arch/x86/kernel/time.c	2020-04-21 15:05:05.000000000 +0800+++ linux-5.4.34-mykernel/arch/x86/kernel/time.c	2020-04-25 21:58:16.436717811 +0800@@ -16,6 +16,7 @@ #include <linux/irq.h> #include <linux/i8253.h> #include <linux/time.h>+#include <linux/timer.h> #include <linux/export.h> #include <asm/vsyscall.h>@@ -59,6 +60,7 @@ static irqreturn_t timer_interrupt(int irq, void *dev_id) { 	global_clock_event->event_handler(global_clock_event);+ 	my_timer_handler(); 	return IRQ_HANDLED; } diff -Naur linux-5.4.34/include/linux/start_kernel.h linux-5.4.34-mykernel/include/linux/start_kernel.h--- linux-5.4.34/include/linux/start_kernel.h	2020-04-21 15:05:05.000000000 +0800+++ linux-5.4.34-mykernel/include/linux/start_kernel.h	2020-04-25 22:00:17.304717811 +0800@@ -9,6 +9,7 @@ up something else. */ extern asmlinkage void __init start_kernel(void);+extern void __init my_start_kernel(void); extern void __init arch_call_rest_init(void); extern void __ref rest_init(void); diff -Naur linux-5.4.34/include/linux/timer.h linux-5.4.34-mykernel/include/linux/timer.h--- linux-5.4.34/include/linux/timer.h	2020-04-21 15:05:05.000000000 +0800+++ linux-5.4.34-mykernel/include/linux/timer.h	2020-04-25 21:56:45.064717811 +0800@@ -193,6 +193,8 @@ extern void init_timers(void); extern void run_local_timers(void);+extern void my_timer_handler(void);+ struct hrtimer; extern enum hrtimer_restart it_real_fn(struct hrtimer *); diff -Naur linux-5.4.34/init/main.c linux-5.4.34-mykernel/init/main.c--- linux-5.4.34/init/main.c	2020-04-21 15:05:05.000000000 +0800+++ linux-5.4.34-mykernel/init/main.c	2020-04-25 22:01:13.476717811 +0800@@ -781,6 +781,7 @@ 	arch_post_acpi_subsys_init(); 	sfi_init_late(); + 	my_start_kernel(); 	/* Do the rest non-__init'ed, we're now alive */ 	arch_call_rest_init(); }diff -Naur linux-5.4.34/Makefile linux-5.4.34-mykernel/Makefile--- linux-5.4.34/Makefile	2020-04-21 15:05:05.000000000 +0800+++ linux-5.4.34-mykernel/Makefile	2020-04-25 22:02:47.144717811 +0800@@ -1012,7 +1012,7 @@ export MODORDER := $(extmod-prefix)modules.order ifeq ($(KBUILD_EXTMOD),)-core-y		+= kernel/ certs/ mm/ fs/ ipc/ security/ crypto/ block/+core-y		+= kernel/ certs/ mm/ fs/ ipc/ security/ crypto/ block/ mykernel/ vmlinux-dirs	:= $(patsubst %/,%,$(filter %/, $(init-y) $(init-m) \ 		  $(core-y) $(core-m) $(drivers-y) $(drivers-m) \diff -Naur linux-5.4.34/mykernel/Makefile linux-5.4.34-mykernel/mykernel/Makefile--- linux-5.4.34/mykernel/Makefile	1970-01-01 08:00:00.000000000 +0800+++ linux-5.4.34-mykernel/mykernel/Makefile	2020-04-25 17:14:13.537908421 +0800@@ -0,0 +1,6 @@+#+# Makefile for the linux mykernel.+#++obj-y  = mymain.o myinterrupt.o+diff -Naur linux-5.4.34/mykernel/myinterrupt.c linux-5.4.34-mykernel/mykernel/myinterrupt.c--- linux-5.4.34/mykernel/myinterrupt.c	1970-01-01 08:00:00.000000000 +0800+++ linux-5.4.34-mykernel/mykernel/myinterrupt.c	2020-04-25 19:09:50.612555999 +0800@@ -0,0 +1,44 @@+/*+ * 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>++/*+ * Called by timer interrupt.+ */+void my_timer_handler(void)+{+	pr_notice("\n>>>>>>>>>>>>>>>>>my_timer_handler here<<<<<<<<<<<<<<<<<<\n\n");+}diff -Naur linux-5.4.34/mykernel/mymain.c linux-5.4.34-mykernel/mykernel/mymain.c--- linux-5.4.34/mykernel/mymain.c	1970-01-01 08:00:00.000000000 +0800+++ linux-5.4.34-mykernel/mykernel/mymain.c	2020-04-25 19:10:27.635058000 +0800@@ -0,0 +1,91 @@+/*+ * 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/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/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/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>+

没有评论:

发表评论