Linux内核分析期末总结
要写一门课的总结,还真是难……先回顾一下这门课讲的内容……
首先,老师讲了寻址方式和汇编指令,实际上大二上学汇编基础的时候就已经学了。这里就简单提一下。
寻址方式常见的有立即数寻址、直接寻址、寄存器寻址、间接寻址和变址寻址。
最麻烦的就是变址寻址,举个例子:
movl 8(%ebx),%edx就是edx = (inet_32 )(ebx+8)的意思。
指令呢,就是mov,push,pop,call……等等……
实际上一开始老师要我们明白的就是数据在计算机内存中是怎么储存的,也就是堆栈是怎么回事。
当我们在写程序的时候,所有的函数、变量都是存在堆栈里的,这是计算机的数据储存基础。
当把数据存储弄明白之后……
就开始了Linux内核的学习……
开始是写简单的LINUX内核代码,比如myinterrupt~
印象最深的(都是刘老师讲的)是这段代码:
asm volatile(
"pushl %%ebp\n\t" /* save ebp */
"movl %%esp,%0\n\t" /* save esp */
"movl %2,%%esp\n\t" /* restore esp */
"movl %2,%%ebp\n\t" /* restore ebp */ //
"movl $1f,%1\n\t" /* save eip */
"pushl %3\n\t" //
"ret\n\t" /* restore eip */
: "=m" (prev->thread.sp),"=m" (prev->thread.ip)
: "m" (next->thread.sp),"m" (next->thread.ip)
);
这是一段在c里面写的汇编代码,我感觉很神奇……以前从来不知道好吗!
————————————分割线在此———————————————————
start_kernel
讲真,孟老师讲的课我真的很难听明白,好在后期加了字幕!好在刘老师上课讲的很清楚,才能弄明白一点点LINUX的皮毛。
一开始start_kernel是什么鬼我真的没听清楚,就一直在讲代码,我好难过。
实际上start_kernel是启动内核的,是内核关键部分,几乎所有的模块在启动的时候都是通过调用init函数来启动的!
(这里我就不贴代码了,以前的博客有,贴了大家看的也贼烦)
kernel_thread是0号进程,它创建了1号进程kernel_init,以及它的一些服务的内核线程,这样整个系统及启动起来了;
之后,init会又启动另外一些进程,一直这样这样下去,系统就启动了!
Linux在无进程概念的情况下将一直从初始化部分的代码执行到start_kernel,然后再到其最后一个函数调用rest_init;
从rest_init开始,Linux开始产生进程!
因为init_task是静态制造出来的,pid=0,它试图将从最早的汇编代码一直到start_kernel的执行都纳入到init_task进程上下文中。
另外,对于系统如果运行新进程的问题,init_task的核心是一个while(1)循环,在循环中它将会调用schedule函数以便在运行队列中有新进程加入时切换到该新进程上。
保证了不会卡壳的问题。
———————————————分割线———————————————————————
系统调用
我个人觉得,系统调用是这样的:应用程序好像植物,它需要在适合它的土壤里生长,而这个土壤就是硬件资源。
但土壤是分酸碱度的,有些植物喜欢偏碱性,有些喜欢偏酸性,这样就会造成植物不能正常生长,也就是程序不能完美的运行。
用三个字代替就是兼容性的问题。
而系统调用呢,把应用程序的请求传给内核,调用相应的的内核函数完成所需的处理,再将处理结果返回给应用程序。
有点类似于人工土壤吧,可以让植物想去哪生存就去哪生存。增加了可移植性。
API是什么鬼呢?
api汉语就是应用编程接口。说普通一点!
就是一些预先定义的函数!
干啥用的呢!就是提供程序基于某软件或硬件得以访问一组例程的能力!
而这种超能力无需访问源码!也不需要理解内部工作机制的细节。
相当于给你高管的权限,让你可以按照规定随心所欲管理公司。差不多的意思。
然后……………………………………………………………………
系统调用三层皮(真的不明白有啥用……)
API,中断向量,服务程序
然后其他的,就在平时的里面…………那些很难懂的……
进程呢,我没学懂…………真的不知道在讲啥……
最后,我觉得还是面对面讲课比较好,首先节奏能跟上,然后不明白的也可以随时打断问明白。
没写过总结……而且我不是很喜欢孟老师的上课方式……我是个很直接的人……
但我很欣赏刘老师的讲课方式,听起来很简单,但已经讲得很透彻了,而且掌握的也比较好,不容易忘记。
总之……LINUX学习之旅刚刚开始……