第二章:从内核出发

2.1获取源代码

  2.1.1使用git

    Git:内核开发者们用来管理Linux内核源代码的控制系统。

    我们使用git来下载和管理Linux源代码。

    

  2.1.2安装内核源代码(如果使用git的话就省去解压这一步)

    背景知识:内核压缩有两种形式:GUNd的zip(gzip)和bzip2.其中bzip2是首选默认的首选模式。

    如果是bzip2,则解压指令为:

    

    如果是GUN的zip:

    

    (注意:x.y.z内核源代码的具体版本,解压后源代码位于linux-x.y.z目录下。)

    (源代码安装注意事项:1.内核源代码安装在/usr/src/linux下,这个目录不能用于开发。2.不要使用root身份修改内核代码。而是创建自己的主目录,仅以root的身份暗爽内核,安装新内核时,/urs/src/linux原封不动。)

  2.1.3使用补丁

    补丁:可以以补丁的形式对代码修改,也可以以补丁的形式接收其他人做的修改。

    在内部源代码树下,运行:

    

  2.2内核源代码树

    源代码的根目录及子目录:

    

    

    根目录下有一些重要的文件:

      COPYING文件                   内核许可证

      CREDITERS文件      内核代码开发者列表

      MAINTAINERS          维护者列表,负责维护内核子程序和驱动程序

      Makefile                     基本内核的Makefile

2.3编译内核

  2.3.1配置内核

    配置选项:决定哪些文件编译进内核,也可以通过预处理命令处理代码。

      1.二选一:yes  no

      2.三选一:yes(把代码编译进主内核映像中)module(选定了,但是以模块形式动态安装的独立代码段)no

      3.字符串或者整数:不控制编译过程,只指定源代码可以访问的值,以预处理宏的形式表示

    简化内核配置的工具:

      字符界面的命令行:

      

      图形界面工具:

      

      Gtk+的图形工具:

      

      默认配置

      

    (默认配置项放在内核源代码根目录urs/src/linux/.config文件中,可以直接修改它。他的默认值比较随意,最好重新配置一下)(内核配置文件存放          在/proc/config.gz下,方便你下次编译一个新内核时直接复制,如下:

    

      修改好了之后,输入:

      

      配编译置好了之后就可以编译了:

      

  2.3.2减少编译的垃圾信息

    

  2.3.3衍生多个编译作业

    Make能把编译过程拆分为多个并行的作业,并独立地并发执行。但默认情况下make只衍生一个作业,因为makefiles会出错。但是内核的makefiles没有这样的错    误。(每个处理器一把衍生出一个或者两个作业。N为衍生的作业数,例如16核的处理器就-j16)

    

    加上减少编译的垃圾信息:

    

  2.3.4安装新的内核

    模块安装是自动的,把编译的模块安装到主目录/lib/modules下:

    

2.4内核开发的特点

  内核开发与用户开发明显的差别:

  

  2.4.1无libc库异或无标准头文件

    主要原因:速度和大小。访问它太大且太低效。

    但是大部分C库函数在内核中都得到了实现。只要包含头文件(内核头文件)就可以调用。著名的没有实现是函数就是printf(),不过内核用printk()代替,最显著   的区别是printk()允许设置优先级标志位。

  2.4.2GUN C

    简单地解释即为标准c的拓展语言,以下几点是拓展部分中有趣的部分:

    1.内联函数(一定要用 static inline xxxxxxxx这样的格式)

      编译器会把调用函数的代码和函数本身放在一起优化,一般将比较短的函数定义为内联函数。

    2.内联汇编

      内核代码中的C语言嵌入汇编代码,gcc编译器支持这样编译,但是要在知道体系结构的时候才支持此功能。

      Asm()可以使用

      

    3.分支声明

      将绝大数情况不会成立的条件设为unlikely(),另一个设置为likely()。性能会得到提升。

  2.4.3没有内存保护机制

    原因是:如果内核非法访问自己,后果很难控制。所以不设置内存保护机制。

   2.4.4不要轻易在内核中使用浮点数

    在内核中使用浮点数,要做得事太多了。

  2.4.5容积小且定长的栈

    内核栈固定为2页大小(32位则为8kb,64位则为16kb)

  2.4.6同步和并发

    内核要求有同步机制以避免出现竞争(使用自旋锁和信号量),主要原因如下:

    

  2.4.7可移植性的重要性

    大部分c代码与体系结构无关,必须将于体系结构相关的代码适当地分离出来。因为,要求内核代码在不同体系结构的计算机上都要能编译执行。

总结

    第二章主要任务是学会自己获取,编译,安装Linux内核源代码。其中有许多需要注意的小细节,例如编译过程中有哪些目录是不能动的,一般编译新内核时的配置  过程以及配置好的文件在哪里,安装过程中如何将垃圾信息清除。除此之外,还讲了内核开发的特点,内核开发和用户开发的区别非常重要,内核的特点就是内存小,速  度极快,内核的开发的代码要满足这些条件,就一定要记住内核开发的特点。本章的收获颇丰,尤其是知道内核不能调用库函数和了解到内核要避免竞争的重要性。信号  量我已经有所了解,自旋锁还不知道是什么,很期待接下来的知识。

linux及安全《Linux内核设计与实现》第二章——20135227黄晓妍的更多相关文章

  1. linux及安全《Linux内核设计与实现》第一章——20135227黄晓妍

    <linux内核设计与实现>第一章 第一章Linux内核简介: 1.3操作系统和内核简介 操作系统:系统包含了操作系统和所有运行在它之上的应用程序.操作系统是指整个在系统中负责完成最基本功 ...

  2. linux及安全《Linux内核设计与实现》第四章——20135227黄晓妍

    第四章 进程调度 进程调度程序是一个内核子系统 分配有限的处理器时间和资源 最大限度利用时间的原则(只要有可执行的进程,那么总会有进程执行) 基本工作:从一组处于等待(阻塞)状态的可执行进程中选择一个 ...

  3. linux及安全《Linux内核设计与实现》第三章——20135227黄晓妍

    第三章 (由于linux不区分进程和线程,所以它们在linux中被称为task,也叫任务) 总结:本章主要包括进程以及线程的概念和定义,Linux内核如何管理每个进程,他们在内核中如何被列举,如何创建 ...

  4. linux及安全期中总结——20135227黄晓妍

    Linux及安全期中总结 黄晓妍 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ...

  5. linux及安全第三周总结——20135227黄晓妍

    总结部分: Linux内核源代码: Arch 支持不同cpu的源代码:主要关注x86 Init   内核启动的相关代码:主要关注main.c,整个Linux内核启动代码start_kernel函数 K ...

  6. Linux基础入门学习笔记20135227黄晓妍

    学习计时:共24小时 读书:1小时 代码:8小时 作业:3小时 博客:12小时 一.学习目标 1. 能够独立安装Linux操作系统   2. 能够熟练使用Linux系统的基本命令   3. 熟练使用L ...

  7. linux及安全第八周总结——20135227黄晓妍

    实验部分 实验环境搭建 -rm menu -rf git clone https://github.com/megnning/menu.git cd menu make rootfs qemu -ke ...

  8. linux及安全第七周总结——20135227黄晓妍

    实验部分 首先clone最新的menu 我们可以看到,test.c里多了一个exec的功能,它的代码和fork基本一致,多了一项加载hello rootfs也有一些变化 执行一下exec 让我们启动一 ...

  9. linux及安全第六周总结——20135227黄晓妍

    总结部分: 操作系统内核三大功能: 进程管理,内存管理,文件系统 最核心的是进程管理 为了管理,首先要对每一个进程进行描述.进程描述符提供了所有内核需要了解的信息. 进程控制模块:task_struc ...

随机推荐

  1. PHP自带方法验证邮箱、URL、IP是否合法

    PHP验证邮箱.URL.IP是否合法 以前用PHP验证邮箱.URL.IP是否合法都是通过自己写正则来实现,但是有时候脑子发昏,可能会写出一个不是完全正确的正则,导致验证出错,今天发现原来PHP本身自带 ...

  2. Linux 启动文件、设置环境变量的位置

    系统级启动文件  ==================================== 1./etc/rc  主启动文件,不要修改它 2./etc/rc.conf  决定启动哪些系统自带的守护进程 ...

  3. MyBatis官方文档——XML 映射配置文件

    XML 映射配置文件 MyBatis 的配置文件包含了影响 MyBatis 行为甚深的设置(settings)和属性(properties)信息.文档的顶层结构如下: configuration 配置 ...

  4. eclipse 改变颜色,背景

    Eclipse背景颜色修改: 操作界面默认颜色为白色.对于我们长期使用电脑编程的人来说,白色很刺激我们的眼睛,所以我经常会改变workspace的背景色,使眼睛舒服一些.设置方法如下: 1.打开win ...

  5. 【Android】TextView动态设置android:drawableLeft|Right|Top|Bottom,SetColor

    Android中有时需动态设置控件四周的drawble图片,这个时候就需要调用 setCompoundDrawables(left, top, right, bottom),四个参数类型都是drawa ...

  6. SpringMVC实现简单应用

    我们都知道,servlet代码一般来说只能在一个servlet中做判断去实现一个servlet响应多个请求, 但是springMVC的话还是比较方便的,主要有两种方式去实现一个controller里能 ...

  7. windows下resin的配置部署与调试

    配置 从Resin官网(http://www.caucho.com)下载Resin解压后,启动Resin,运行resin根目录下的resin.exe文件,运行期间将出现下图所示的命令提示符窗口. 表示 ...

  8. 问答项目---用户注册的那些事儿(JS验证)

    做注册的时候,由于每一个页面都有都要可以注册,可以把注册方法写到一个公用的方法里去,其他方法继承这个方法: 简单注册JS示例: <script type='text/javascript'> ...

  9. C++ 引用的辨别

    对于习惯使用C进行开发的朋友们,在看到c++中出现的&符号,可能会犯迷糊,因为在C语言中这个符号表示了取地址符,但是在C++中它却有着不同的用途,掌握C++的&符号,是提高代码执行效率 ...

  10. Visual Studio 2015 Enterprise - 企业版 - 简体中文

    文件名称 文件大小 百度网盘下载 微软官方下载 Visual Studio 2015 Enterprise - 企业版 - 简体中文 3.89GB http://pan.baidu.com/s/1bn ...