9223刘霄

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

补交第三周作业

完成一个简单的时间片轮转多道程序内核
1.使用实验楼的虚拟机打开shell,用cd LinuxKernel/linux-3.9.4进入linux-3.9.4。
2.执行命令qemu -kernel arch/x86/boot/bzImage会发现弹出新的窗口,代表内核启动了。

执行mykernel代码

进入mykernel代码,可以看到mymain.cmyinterrupt.c

打开mymain.c代码如下:开始启动操作系统。

前面是头文件,然后有一个my_start_kernel()函数,该函数是整个操作系统的入口, 变量i不停的自加1,if循环是执行i每当加到1000000的整数倍的时候就打印出当前的i的值,我们也可以通过修改if的条件使打印加快或减慢

打开myinterrupt.c代码如下:

前面还是头文件,然后有一个my_timer_handler函数,里面只有一条prink的打印语句,每次时钟中断都调用这个printk()输出,所以屏幕会不停的有信息打印出来。

阅读教材3、5章

进程管理

1.进程就是处于执行期的程序。但进程并不仅仅局限于一段可执行程序代码。通常进程还要包含其他资源,像打开的文件,挂起的信号,内核内部数据,处理器状态,一个或多个具有内存映射的内存地址空间及一个或多个执行线程。
2.线程是在进程中活动的对象。每个线程都拥有一个独立的程序计数器、进程栈和一组进程寄存器。内核调度的对象不是进程而是线程。一个进程可以包含多个线程。但linux系统的线程实现并不特别区分进程和线程。
3.调用fork()系统的结果,该系统调用通过复制一个现有进程来创建一个全新的进程。fork()系统调用从内核返回两次:一次回到父进程,另一次回到新产生的子进程。调用exec()这组函数就可以创建新的地址空间,并把新的程序载入其中。

系统调用

1.一般情况下,应用程序通过在用户空间实现的应用的编程接口(API)而不是直接通过系统调用来编程。
2.要访问系统调用,通常通过C库中定义的系统调用来进行。系统调用还会通过一个long类型的返回值来表示成功或者错误。负的返回值表示错误,返回0通常表明成功。
3.Linux中每个系统调用都有一个系统调用号。通过这个独一无二大的号就可以关联系统调用。当用户空间的进程执行一个系统调用的时候,这个系统调用号就用来指明到底是要执行哪个系统调用;进程不会提及系统调用的名称。系统调用的列表存储在sys_call_table中。
4.Linux系统调用比其他许多操作系统执行要快。Linux很短的上下文切换时间是一个重要原因,进出内核都被优化的简洁高效。另外一个原因是系统调用处理程序和每个系统调用本身也都非常简洁。
5.内核驻留在受保护的地址空间上,所以用户空间的程序不能直接调用内核空间中的函数。通常通过软中断,触发一个异常促使系统切换到内核执行系统调用处理程序。在x86上预定义的软中断中断号是128.
在x86上,系统调用号是通过eax寄存器传递给内核的。
6.内核在执行系统调用的时候处于进程上下文。current指针指向当前任务,即引发系统调用的那个进程。
7.在进程上下文中,内核可以休眠并且可以被抢占。能够休眠说明系统调用可以使用内核提供的绝大部分功能。在进程上下文中能够内抢占表明,像用户空间内的进程一样,当前的进程同样可以被其他进程抢占。因为新的进程可以使用相同的系统调用,所以必须小心,保证系统调用是可重入的。
8.建立一个新的系统调用有利有弊,需谨慎使用。
9.常用的系统调用函数有fork、wait、getpid等。

第四周实验

一、静态库的测试实验

1.gcc -c *.c,-c为把.c文件生成.o文件
2.ar cr libmymath.a *.o,其中ar cr是生成静态库的语句,对于静态库开头要用lib+名字结尾再.a,把.o文件生成到libmymath.a里
3. gcc main.c -L. lmymath,-L.表示要库依赖,-l表示是寻这个静态库

4.运行结果

二、共享库的测试实验

1.使用 -fPIC 选项,会生成 PIC 代码。.so 要求为 PIC,以达到动态链接的目的,否则,无法实现动态链接
2.cp 是复制,复制libmymath.so到/lib文件中
3.之后同静态库命令一样执行

三、跟踪分析Linux内核的启动过程

使用实验楼的虚拟机打开shell,输入以下代码启动内核
cd LinuxKernel/
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img

使用gdb跟踪调试内核
输入代码qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S当前状态被冻结
再打开一个窗口,输入gdb,把Linux-3.18.6/vmLinux加载进去,连接到刚才启动的被冻结的Linux
输入file linux-3.18.6/vmlinux,target remote:1234,显示连接超时

四、遇到的问题:

1.在做动态库实验室的时候,会出现以下现象:

不知道问题所在,自己想的是是不是电脑配置太低,所以没有办法执行命令?所以用同学的电脑完成了共享库的实验。

2.在跟踪分析内核时,为什么会显示连接超时?之后输入break start_kernel断点的设置,为什么显示无法运行?

posted on 2017-10-22 22:22  20179223刘霄  阅读(182)  评论(1编辑  收藏  举报