linux学习总结

20135103王海宁

《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

一、学习感想

九个星期的学习时间结束了,真的对linux是又爱又恨,爱它的变化多端应用性强,恨它的难以捉摸自己操作起来实在不容易。linux不同于所学的其他东西,捧着一本书死啃一个月也不会有什么进展,除了要自己动手实践之外,还需要一个领路人把你领进去,当你摸索到门道之后才能顺着大路走,否则可能会原地打转,甚至误入歧途,在此真的很荣幸碰到孟老师,将我领入linux的大门,让我去探索,去前进。孟老师的讲解是真心好,每周一个小时的视频,即使那不算实验,到后来,几乎每次都要花上三个多小时的时间去理解它,不下功夫真的跟不上,在此再次感谢孟老师的教导,以及网易云课堂提供的这么一个可以免费学习了解linux的机会,孟老师辛苦了,您的辛苦没有白费,学生们都很敬重您,感激您,感谢您的教导。

除了所学知识外,还有一点让我很感动的是,linux本身并没有一个目的,他并没有一个准确的目标说我的任务是什么,他就是一个内核,还有许多开发者从不同地方弄过来的东西,这些乱七八糟的东西拼凑在一起却成为了一大笔财富,他并没有说我做什么,我不做什么,他的存在就是为了方便所有人,用它去做所有可以的事情。

除了网易云的公开课,我们还跟着自己的老师上课,得知linux是开源的,就是一种分享,你可以从网站上找到任何你想要的,这不是为了自由,而是为了让所有人找到他们需要的,去更改,去定制自己的代码,给与人们方便。

linux最大的优点就是它将所有都视为文件,这样最大的好处就是便于管理,虽然应用上有些不便,但这也是一个相当好的思路。

二、每周重点

第一周:反汇编

顾名思义,就是将汇编语言变成电脑语言,从cpu的角度主要就是堆栈和出栈,将数据放入栈中进行存储、运算和输出,用过ebp,esp控制寄存器的变化

第二周:精简内核分析(基于时间片轮转)

这里我们了解了计算机的三大法宝:(1)存储程序计算机(2)函数调用堆栈(3)中断机制

第三周:跟踪分析内核的启动过程

rest_init()就是start_kernel从进程内核一启动的时候就一直会存在,就是0号进程;

0号进程创建了1号进程以及其他的一些服务的内核线程,这样整个系统就启动起来了。

第四周:系统调用

系统调用三层皮:(1)xyz( API )    (2)system_call( 中断向量 )    (3)sys_xyz( 服务程序 )

第五周:system_call过程分析

(1)int 0x80从用户态进入内核态,跳到system_call()函数处执行相应服务进程。在此过程中内核先保存中断环境,然后执行系统调用函数。
            (2)system_call()函数通过系统调用号查找系统调用表sys_cal_table来查找具体系统调用服务进程。
            (3)执行完系统调用后,iret之前,内核会检查是否有新的中断产生、是否需要进程切换、是否学要处理其它进程发送过来的信号等。
            (4)内核是处理各种系统调用的中断集合,通过中断机制实现进程上下文的切换,通过系统调用管理整个计算机软硬件资源。
            (5)如没有新的中断,restore保存的中断环境并返回用户态完成一个系统调用过程。

第六周:进程创建过程学习

(1)无论用三种系统调用clone、fork、vfork中的哪种来创建一个新进程,都是通过调用do_fork来实现的

(2)通过复制父进程PCB的task_struct创建一个新进程

(3)子进程修改复制后的PCB,如pid、进程链表等

(4)fork()系统调用产生的子进程从ret_from_fork处开始执行,p->thread.ip = (unsigned long)ret_from_fork

(5)可通过返回值判断当前进程是父进程还是子进程,父进程处返回进程号,子进程自己返回0

第七周:可执行文件的装载和运行

可执行程序是怎么得来的:C代码经过编译器的预处理编译、编译成汇编代码、编译器将其编译成目标代码、链接成可执行文件

Linux内核装载和启动一个可执行程序

(1)创建新进程

(2)新进程调用execve()系统调用执行指定的ELF文件

(3)调用内核的入口函数sys_execve(),sys_execve()服务例程修改当前进程的执行上下文

ELF格式中主要有3种可执行文件:可重定位文件.o,可执行文件,共享目标文件

ELF可执行文件会被默认映射到0x8048000这个地址

命令行参数和环境变量是如何进入新程序的堆栈的

Shell程序-->execve-->sys_execve,然后在初始化新程序堆栈时拷贝进去。

先函数调用参数传递,再系统调用参数传递

当前程序执行到execve系统调用时陷入内核态,在内核中用execve加载可执行文件,把当前进程的可执行文件覆盖掉,execve系统调用返回到新的可执行程序的起点

动态链接库的装载过程是一个图的遍历过程,ELF格式中的.interp和.dynamic需要依赖动态链接器来解析,entry返回到用户态时不是返回到可执行程序规定的起点,返回到动态链            接器的程序入口

第八周:进程调度过程分析

Linux中进程切换的一般步骤为:

      (1)检测当前进程的状态,挂起当前进程的IO请求以防止死锁

      (2)获取当前运行CPU,以及它的可运行进程队列

      (3)从进程队列中获取当前进程的task_struct,并通过进程调度算法从队列中选择一个合适的进程作为待调入进程

      (4)检测待调入进程的状态以确保其正确性

      (5)使用switch_to宏来进行当前进程与待调入进程的切换(期间完成新进程的资源准备工作)

      (6)新进程完成schedule(),结束整个进程切换过程

三、博客汇总

  第一周: http://www.cnblogs.com/haiye/p/5213800.html 

  第二周: http://www.cnblogs.com/haiye/p/5245593.html 

  第三周: http://www.cnblogs.com/haiye/p/5271563.html

  第四周: http://www.cnblogs.com/haiye/p/5296174.html 

  第五周: http://www.cnblogs.com/haiye/p/5325347.html

  第六周: http://www.cnblogs.com/haiye/p/5350333.html

  第七周: http://www.cnblogs.com/haiye/p/5374272.html

  第八周: http://www.cnblogs.com/haiye/p/5402162.html

四、总结

  说实话,不是恭维,这门课的遗憾在于时间太短,好多东西没能继续学下去,如果孟老师能接着讲下去就好了,真的能学到很多东西。有些东西学的并不只是一门学科,更重要的是老师的思路,知识如果只是学到,而不能融会贯通,我觉得和没有学过差别不大,提纲挈领比硬塞知识,真的好的多太多,只有逻辑搞清楚,主线弄明白,脑子里的条理才会清晰,这样才能说真的我学了这门课。

虽然这门课在网易云上学完了,但我的课程还没有结束,感谢孟老师把我领进门,带我走过最开始的懵懂阶段,接下来我会自己认真的走下去。多谢孟老师,辛苦了。

时间: 2024-12-22 04:34:10

linux学习总结的相关文章

linux学习之路之LVM

试想一种情况,当初我们在规划磁盘的时候,只给某一个磁盘或分区之划分了30G的容量,但是后来,随着业务的需求,该磁盘或者分区的使用量会越来越大,等到以后再有数据存放时,发现该磁盘或者分区的容量不够用,此时该怎么办了?可以新增一个磁盘,经过格式化,挂载等过程就可以使用这个磁盘了,再将原来磁盘的数据完全的复制过来.等到后来又发现,规划的磁盘又太大了,然后又使用上述方法来减少磁盘的大小.虽然这种方法可行,但是效率低,比较复杂.不应该是我们首选的方法. 当然,我们可以这样做,将多个磁盘或者分区(PV)组合

Linux学习日志2-vim使用基础

vim是linux操作系统下的一个文本编辑工具,功能非常强大,但刚学习起来比较复杂.vim的所有功能要讲明白得有几百页,在这里只是记录一下vim的一些基本用法. 首先vim打开文件的三种方式: vim +# xxx(#是数字):表示打开xxx文件并将光标定位到指定行. vim -o xx1 xx2 xx3:表示同时打开三个文件,垂直分割显示 vim -O xx1 xx2 xx3:表示同时打开三个文件,水平分割显示 多个文件间跳转:键入ctrl+w后:→向左.←向右.↑向上.↓向下 vim打开文件

                        linux     学习  

决心书 我叫孙启浩,出生在山东淄博的一个农村.15岁初中还没有毕业,就去上了技校,其实父母是想让我提早的步入社会,我在那个地方学的是'电厂热能动力装置' 本来我是想学it的可是我父母说就学这个因为在我们那里电厂找工作也好找工资肯定比学it工资要高,我就这样在那个对我来说无所谓的学校学了两年半.放暑假的时候我哥回来说要进京学it,我就想要不我也去学?因为我对这个it还是挺感兴趣的,之后就来了北京,先去看了一个学校叫'八维'觉得这个学校不怎么好,上来先学单词什么的我这种人一看书就想睡觉.然后我父亲的

linux学习笔记(一)-文件目录相关的命令&&文件通配符

一.几个命令概述 1.查看目录以及目录底下的文件:ls(-a显示隐藏文件:-d显示目录本身:-l显示详细内容:-R递归显示,即把子目录的文件也显示出来:-h以更加被人类理解的格式显示,比如显示文件大小的时候用M为单位显示:-i显示文件索引ID) 2.查看文件内容:cat,head,tail,less,more,tac cat:将文件连接起来,输出在屏幕上,可接多个文件(-E:显示隐藏的换行符:-n:显示出行号) head:默认查看文件的前10行(-n#:查看文件的前#行.空白行也是一行) tai

Linux学习日志day1——无人值守系统安装DHCP+TFTP+PXE+Kickstar

Linux学习日志day1--无人值守批量系统远程网络安装(DHCP+TFTP+PXE+Kickstar)                                         --作者:江信瀚 服务器环境介绍: 主机名:workstation.example.com 关闭SElinux以及防火墙 虚拟机:VMware(关闭了VMware的DHCP服务) 网卡配置: 静态IP获取! IPV6全部都删除,因为根本用不到 子网IP可以在VMware中设置 8.8.8.8是谷歌的DNS服务器

linux学习-练习1

touch 创建多目录 ls查看当前目录下的所有隐藏文件 ls查看/boot目录下面的所有目录 帮助的使用 内部命令 用 help command   或  man bash 外部命令 用 command --help 或  command -h 使用手册 man 信息页 info date命令: 显示昨天 : date -d yesterday 显示前天 : date -d '-2 day' 显示当天 :  date -d '0 day' +%F 显示当前日期,格式:2016-08-08 显示

51CTO学院三周年,我的linux学习思想分享

51CTO学院三周年了,我也关注学院三周年了,在51CTO的平台上,让我学到了很多的东西,也交到了很多朋友,每当你发一篇博文,总会有些志同道合的小伙伴们去点赞,甚至还会有大神高手,去指出你分享内容里面的不足.在和这些虚拟的未曾相识的朋友们的交流中我的技术得到了提高,时光荏苒,一晃都三年了. 首先我要感谢51CTO做的一个关于技术的分享平台,经过大家的分享,里面的博客已经非常丰富了,很多优秀的文章可以供我们去学习和分享.我是一名运维工程师,从事运维工作已经3年多了,每天上班的第一件事情就是登上我的

linux学习之centos(三):网卡配置

Linux系统版本:Centos 6.5 在linux学习之centos(二):虚拟网络三种连接方式和SecureCRT的使用中,使用远程工具SecureCRT,通过“ifconfig eth0 + 具体的ip地址”命令给linux配IP地址,但是这种配置方式存在以下问题: 只能临时生效,一旦重启,需要重新配置: 只能配置ip地址和子网掩码,可以连接内网,是无法连接外网的. 如果想要连接外网,ip地址.子网掩码.网关.DNS缺一不可. 如何真正的给CentOS配一个ip,而且设置成功后,通过使用

Linux学习 -- Shell基础 -- 概述

Shell是什么? 命令解释器 编程语言 Linux支持的Shell类型 cat /etc/shells 主要学习 bash 脚本执行方式 echo echo -e 单引号 -- 原始字符串  双引号 -- 支持转义字符串 \e[1;31m xxx  开启颜色 \e[0m    关闭颜色 首行:#!/bin/bash #写好注释 执行方式: 方式1 sh xxx.sh 方式2 chmod 755 xxx.sh  ./xxx.sh 或 绝对路径 Linux学习 -- Shell基础 -- 概述

Linux学习之CentOS(十三)--CentOS6.4下Mysql数据库的安装与配置

原文:http://www.cnblogs.com/xiaoluo501395377/archive/2013/04/07/3003278.html 如果要在Linux上做j2ee开发,首先得搭建好j2ee的开发环境,包括了jdk.tomcat.eclipse的安装(这个在之前的一篇随笔中已经有详细讲解了Linux学习之CentOS(七)--CentOS下j2ee环境搭建),如果要开发web项目,我们当然可以安装一个myeclipse到Linux系统上去,这个安装方法和安装eclipse完全相同