zoukankan      html  css  js  c++  java
  • linux及安全《Linux内核设计与实现》第二章——20135227黄晓妍

    第二章:从内核出发

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

  • 相关阅读:
    iis WebSocket 搭建环境及配置
    RESTful API 设计最佳实践
    laravel/lumen 单元测试
    后台管理UI的选择
    lumen Response
    计算机网络——OSI、TCP/IP协议族详解
    Java中'&'与、'|'或、'^'异或、'<<'左移位、'>>'右移位
    Servlet、Struts2、SpringMVC执行流程
    final修饰符,finally,finalize区别
    JSP的九个隐式(内置)对象
  • 原文地址:https://www.cnblogs.com/angelahxy/p/5286296.html
Copyright © 2011-2022 走看看