本课程是理论和实验相结合的授课模式,同时通过参加操作系统大赛的方式,让我们能更好的利用所学的知识去处理实际问题,同时知道自己的不足之处,锻炼了自己自学钻研,思考和解决问题的能力。
我们小组参加的操作系统大赛是功能赛道的第111题,是基于openssl实现远程SSH登录的国密改造,主要是基于openssl提供的国密算法sm2/sm3/sm4改造openssh,使之改造后能够生成国密算法的密钥,并能使用国密算法自登录。我们小组三人分别负责一种算法的改造,将代码嵌入进openssl的源码中,虽然最终没有入围,但是在比赛过程中,加深了自己对加密算法的理解,以及对远程登录流程的熟悉,收获很多。
Linux内核,主要包括进程管理、内存管理、设备驱动、文件系统,从分析内核了解到整个系统是如何工作的,如何控制管理资源分配,进程切换并执行。各种策略和结构让系统运行时更有效率。只有懂得其中的基本工作机制才能够有效的裁剪内核,再重新编译内核,生成高效、可移植的内核模块。
通过课程,自己去编写代码,去debug内核代码,一步步的理解堆栈如何切换,系统调用是如何执行的。
- // main.c
- int g(int x)
- {
- return x + 3;
- }
-
- int f(int x)
- {
- return g(x);
- }
-
- int main(void)
- {
- return f(8) + 1;
- }
$ gcc –S –o main.s main.c -m32
- .file "main.c"
- .text
- .globl g
- .type g, @function
- g:
- .LFB0:
- .cfi_startproc
- pushl %ebp
- .cfi_def_cfa_offset 8
- .cfi_offset 5, -8
- movl %esp, %ebp
- .cfi_def_cfa_register 5
- movl 8(%ebp), %eax
- addl $3, %eax
- popl %ebp
- .cfi_restore 5
- .cfi_def_cfa 4, 4
- ret
- .cfi_endproc
- .LFE0:
- .size g, .-g
- .globl f
- .type f, @function
- f:
- .LFB1:
- .cfi_startproc
- pushl %ebp
- .cfi_def_cfa_offset 8
- .cfi_offset 5, -8
- movl %esp, %ebp
- .cfi_def_cfa_register 5
- subl $4, %esp
- movl 8(%ebp), %eax
- movl %eax, (%esp)
- call g
- leave
- .cfi_restore 5
- .cfi_def_cfa 4, 4
- ret
- .cfi_endproc
- .LFE1:
- .size f, .-f
- .globl main
- .type main, @function
- main:
- .LFB2:
- .cfi_startproc
- pushl %ebp
- .cfi_def_cfa_offset 8
- .cfi_offset 5, -8
- movl %esp, %ebp
- .cfi_def_cfa_register 5
- subl $4, %esp
- movl $8, (%esp)
- call f
- addl $1, %eax
- leave
- .cfi_restore 5
- .cfi_def_cfa 4, 4
- ret
- .cfi_endproc
- .LFE2:
- .size main, .-main
- .ident "GCC: (Ubuntu 4.8.2-19ubuntu1) 4.8.2"
- .section .note.GNU-stack,"",@progbits
本实验通过分析一个简单的时间片轮转多道程序的内核,来理解操作系统是如何工作的。
- # 注意路径是区分大小的
- $ cd ~/LinuxKernel/linux-3.9.4
-
- $ rm -rf mykernel
-
- $ patch -p1 < ../mykernel_for_linux3.9.4sc.patch
-
- $ make allnoconfig
-
- # 编译内核请耐心等待
- $ make
$ qemu -kernel arch/x86/boot/bzImage
- /*
- * 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);
-
- }
- }
-
- /*
- * 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");
- }
可以看出,这个系统目前只是简单地不停输出“my_timer_handler here”、“my_start_kernel
here”等字样。通过查看源码,可以发现这些输出字符串分别位于 mymain.c 和 myinterrupt.c
中。只要在此基础上,再加入进程描述 PCB 和进程链表管理、进程切换等代码,一个可运行的小OS kernel
就完成了。
运行结果如下:
通过以上实验,我们知道了操作系统的核心功能是:进程调度与中断机制。通过与硬件配合,实现多任务处理,再加上上层应用软件的支持,最终变成可以满足用户使用要求的计算机系统。
- cd ~/LinuxKernel/
- qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img
- $ qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
- # 打开 GDB 调试器
- $ gdb
-
- # 在 GDB 中输入以下命令:
-
- # 在gdb界面中targe remote之前加载符号表
- (gdb)file linux-3.18.6/vmlinux
-
- # 建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行
- (gdb)target remote:1234
-
- # 断点的设置可以在target remote之前,也可以在之后
- (gdb)break start_kernel


学号:485
参考资料
操作系统大赛地址oscomp/proj111-cypher-reconstruction: 基于openssl实现远程SSH登录的国密改造 (github.com)
Linux 内核分析配套实验_Linux - 蓝桥云课 (lanqiao.cn)
庖丁解牛Linux操作系统分析https://gitee.com/mengning997/linuxkernel