网易云课堂--Linux 内核 之结课报告

来源:互联网 发布:西部数码域名备案流程 编辑:程序博客网 时间:2024/06/06 09:24

说明

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

自从上学期学了孟宁老师的软件工程的课程,开始对Linux进行了简单的了解,这学期看见Linux内核课程,毫不犹豫的选了,由于这门课,现手头有菜鸟的Linux基础篇与服务器篇,和第三版的深入理解Linux内核,当然此课程的收获不只只是对Linux内核的学习,对Linux的操作也是加深了熟练,都说一个成熟的编程人员,必须熟悉Linux,但是对Linux内核的了解重要么?现在的我无法解答,答案留给时间,虽然若干时间后对课程的内容会忘记,但是这些属于知识体系的东西,永远不会忘记。


收获

    **以下总结课程所带给我的:**
  1. 每周除了正常上课的时间,抽空看老师的视屏,习惯与坚持真的感觉特别重要,目前还不知道成绩,但是坚持下来了,对自己也是一种肯定。
  2. 老师的课程选择人数特别多,学员也是层次不齐,有研究生,本科生,对于我这样的大三的学生,其实没有必要给自己留什么借口,批改作业的时候收藏的别人的作业真心感觉到自己与别人的差距,大家能把一件事情认认真真的做到最好,无形的正能量吧,你能感觉的到优秀的人很多,优秀并且还在更加努力的人又有好多,比如本人目前的博客就只是对待作业的八篇Linux内核的作业,但是好多人的博客里就会有显示出来本周做的东西还有很多,算法,大数据,等等方面的,所以对本课程的作业互评模块给个赞,真是个一举两得的发明。
  3. 每周的作业都会有不会的,或者做错的题目,在作业提交结束之后,系统可以自动公布答案,对自己的学习有很大的帮助。
  4. 我从别的写博客的地方知道了wordpress,我也为自己搭建了网站。
    wordpress

  5. 我知道了GitHub这个强大的网站
    这里写图片描述

  6. 与本门课程合作的实验楼课程 - 实验楼
    https://www.shiyanlou.com/courses/,虽然本人的该课程的绝大部分的实验环节都在本机完成,但是我所在学习主要学习的方向的Hadoop系列的课程,在这里也有,对我看书本的知识有很大的帮助,没有选这个课,我是不会知道的,非常感谢
    这里写图片描述

  7. 重复一下,深刻的体会到,人外有人,天外有天。我们需要不断地努力。

Linux内核课程内容文章简介及导航

本人的专栏 - 博客频道 - CSDN.NET
http://blog.csdn.net/u011407724

课程的目录如下:
这里写图片描述
本人的作业也是针对上图中的各个章节。
这里写图片描述


第一章:通过反汇编一个简单的C程序。本人错过了第一章的作业提交,报名时间略迟


第二章:完成一个简单的时间片轮转多道程序内核代码

http://blog.csdn.net/u011407724/article/details/44282475
1.函数调用堆栈与mykernel实验基础测试中的错题:
### 32位x86的Linux系统中,函数调用约定使用__stdcall方式, 调用f(x,y,z)时,需要把参数压栈,首先压入的参数是x,y,z中的哪一个?
答案z
2.mykernel实验中,时钟中断处理函数是void my_timer_handler(void)
3.32位x86 计算机中,在形成函数调用堆栈时,使用哪个寄存器指向栈底?
答案是 EBP


第三章:构造一个简单的Linux系统MenuOS

跟踪分析Linux内核的启动过程http://blog.csdn.net/u011407724/article/details/44539467

qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S # 关于-s和-S选项的说明:# -S freeze CPU at startup (use ’c’ to start execution)# -s shorthand for -gdb tcp::1234 若不想使用1234端口,则可以使用-gdb tcp:xxxx来取代-s选项
gdb(gdb)file linux-3.18.6/vmlinux # 在gdb界面中targe remote之前加载符号表(gdb)target remote:1234 # 建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行(gdb)break start_kernel # 断点的设置可以在target remote之前,也可以在之后

第四章:扒开系统调用的三层皮(上)

使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
http://blog.csdn.net/u011407724/article/details/44735153

Linux中,用户态切换到内核态时,int指令会保存 用户态堆栈顶地址当时的状态字当时的cs:eip值====针对API xyz, Linux中系统调用的三层皮指的包括 API xyz中断向量system_call中断服务程序sys_xyz===Linux中,系统调用号是使用(eax)寄存器传递的Linux中可以通过执行int $128来执行系统调用。Linux中,(系统调用号)将API xyz和中断服务程序sys_xyz关联起来。

系统调用 就是用户态应用程序和内核提供的服务之间的一个接口。 它们通常是通过库把这些函数调用映射成进入操作系统所需要的原语。
系统调用实际上一种保护操作系统正常运行的设置。 由于操作系统快速的在每个进程间切换执行,同时这也带来了很多安全问题。
只是系统调用由操作系统内核提供,运行于内核态
Linux的系统调用通过int 0x80实现,用系统调用号来区分入口函数。
在Linux中是通过软中断来实现这种操作系统陷入(OperatingSystem trap)的,在x86平台上,这条指令是int 0x80。也就是说在Linux中,系统调用的接口是一个中断处理函数的特例。

这里的嵌入汇编格式为:Extended assembler syntax:asm ( assembler template : output operands /* optional */ : input operands /* optional */ : list of clobbered registers /* optional */ );关于sys_mkdirasmlinkage long sys_mkdir(const char __user *pathname, umode_t mode);从上面的定义中,可以看出,sys_mkdir有两个参数:要创建的目录名mode of fileReturn:当成功创建目录时,该函数返回0

第五章:扒开系统调用的三层皮(下)

分析system_call中断处理过程
http://blog.csdn.net/u011407724/article/details/44887751

32位x86 Linux系统中系统调用处理过程的最后一条汇编指令是(iret)Linux内核中,系统调用处理过程中保护现场使用的宏是SAVE_ALL

sys_call实现的汇编代码:
该代码位于Linux的目录下:/arch/x86/kernel/entry_32.S
系统-调用的过程其实是另一种上下文切换的实现
从系统的调用过程可以看出,与中断处理相似,在进行操作前后,均要对现场进行保护和恢复

学习连接:http://en.wikipedia.org/wiki/System_call

附上一张资料里的使用中断方式的系统调用的简单流程:
这里写图片描述


第六章:进程的描述和进程的创建

分析Linux内核创建一个新进程的过程:http://blog.csdn.net/u011407724/article/details/45015771

Linux中,PCB task_struct中包含 进程状态 进程打开的文件 进程优先级信息===操作系统的三大管理功能包括进程管理内存管理文件系统===Linux内核通过唯一的进程标识PID来区别每个进程。===Linux中,1号进程是所有用户态进程的祖先,0号进程是所有内核线程的祖先===Linux中,fork()系统调用产生的子进程在系统调用处理过程中从ret_from_fork处开始执行。
总结,创建一个新进程在内核中的执行过程大致如下    1.使用系统调用SyS_clone(或fork,vfork)系统调用创建一个新进程,而且都是通过调用do_fork来实现进程的创建;    2.Linux通过复制父进程PCB--task_struct来创建一个新进程,要给新进程分配一个新的内核堆栈;    3.要修改复制过来的进程数据,比如pid、进程链表等等执行copy_process和copy_thread    4.p->thread.sp = (unsigned long) childregs; //调度到子进程时的内核栈顶      p->thread.ip = (unsigned long) ret_from_fork; //调度到子进程时的第一条指令地址

第七章:可执行程序的装载

Linux内核如何装载和启动一个可执行程序
http://blog.csdn.net/u011407724/article/details/45154195

Linux下有三种目标文件格式,它们是共享目标文件格式可执行文件格式可重定位文件格式===一般系统调用库函数API的参数传递过程,比如execve系统调用,先进行函数调用参数传递,然后系统调用参数传递,最后又进行函数调用参数传递。===动态连接有两种形式:可执行程序装载时动态连接和运行时动态链接execve执行静态链接程序时,通过修改内核堆栈中EIP的值作为新进程的起

ELF可执行文件
ELF 是“可执行可连接格式”的英文缩写,该格式由 Unix 系统实验室制定。它是 Linux 中最经常使用的格式,和其他格式(例如 a.out 或 ECOFF 格式)比较起来,ELF 在装入内存时多一些系统开支,但是更为灵活。ELF 可执行文件包含了可执行代码和数据,通常也称为正文和数据。这种文件中包含一些表,根据这些表中的信息,内核可组织进程的虚拟内存。另外,文件中还包含有对内存布局的定义以及起始执行的指令位置。

linux通过sys_execve()系统调用从文件系统中读取、识别并加载elf
调用sys_execve后,执行过程:do_execve -> do_execve_common -> exec_binprm->load_elf_binary()->sys_close
根据elf的库类型,elf_entry不一样.load_elf_binary通过解析器将不同的入口地址写入.
学习网址:
Linkers and Loaders:http://www.iecc.com/linker/
ELF在Linux下的加载过程:http://blog.csdn.net/joker0910/article/details/7686836


第八章:进程的切换和系统的一般执行过程

理解进程调度时机跟踪分析进程调度与进程切换的过程
http://blog.csdn.net/u011407724/article/details/45293303

Linux进程调度是基于分时和优先级的。Linux中,内核线程是只有内核态没有用户态的特殊进程。内核可以看作各种中断处理过程和内核线程的集合。Linux中,内核线程可以主动调度,主动调度时不需要中断上下文的切换Linux内核调用schedule()函数进行调度,并调用context_switch进行上下文的切换,这个宏调用switch_to来进行关键上下文切换。

Linux中的进程调度

Linux既支持普通的分时进程,也支持实时进程
Linux中的调度是多种调度策略和调度算法的混合。
Linux的调度基于分时和优先级
Linux中进程的优先级是动态的

中断处理过程(包括时钟中断、I/O中断、系统调用和异常)中,直接调用schedule(),或者返回用户态时根据 need_resched 标记调用schedule();内核线程可以直接调用schedule()进行进程切换,也可以在中断处理过程中进行调度,也就是说内核线程作为一类的特殊的进程可以主动调度,也可以被动调度;用户态进程无法实现主动调度,仅能通过陷入内核态后的某个时机点进行调度,即在中断处理过程中进行调度。

遗憾

这种课程不能像学完一门语言一样,可以做个实际的项目练练手,而且觉得应用到的时候在什么时候,很迷茫。。哈哈但是答案交给时间。
这里写图片描述

遗憾的是我没有老师帅。。。。
遗憾的是dancing girl 没找到 哈哈。

0 0