zoukankan      html  css  js  c++  java
  • Linux内核学习笔记-1.简介和入门

    原创文章,转载请注明:Linux内核学习笔记-1.简介和入门 By Lucio.Yang

    部分内容来自:Linux Kernel Development(Third Edition),Robert Love,陈莉君等译。

    1.操作系统和内核简介  

      Linux内核是自由公开软件,使用GNU的General Public License(GPL)第二版作为限制条款。大多数软件许可证决意剥夺你共享和修改软件的自由。相比之下,GNU通用公共许可证试图保证你共享和修改自由软件的自由。

      通常一个内核负责响应中断的中断服务程序、负责管理多个进程从而分享处理器时间的调度程序、负责管理进程地址空间的内存管理程序和网络、进程间通信等系统服务程序共同组成。内核独立于普通应用程序,拥有受保护的内存空间和访问硬件设备的所有权限,这种系统态和受保护的内存空间,称之为内核空间。

      应用程序通过系统调用与内核通信。当一个应用程序执行一条系统调用,称应用程序在内核空间运行,而内核运行于进程上下文。

      内核还要管理硬件设备。当硬件设备要和系统通信时,首先发出中断信号打断处理器的执行,继而打断内核的执行,内核通过中断号寻找相应的中断处理程序,并调用这个程序相应和处理中断。

      所以,处理器活动的情况:

        1.运行于用户空间,执行用户程序。

        2.运行于内核空间,处于进程上下文。

        3.运行于内核空间,处于中断上下文。

      操作系统内核分为两大阵营:单内核和微内核。

      单内核是将内核从整体上作为一个单独的大过程来实现,同时运行在一个单独的地址空间上。内核可以直接调用函数。大多数Unix为单内核单模块。

      微内核的功能被划分为多个独立的过程,所有的服务器殴打保持独立并运行在各自的地址空间上,不能像单内核模块直接调用函数,通过进程间通信(IPC)机制实现消息传递。Windows和Mac OS X基于微内核,但是却让全部的服务器进程运行在内核空间,而避免频繁的上下文切换。

      Linux是单内核,但是有模块化设计、抢占式内核、支持内核线程以及动态装载内核模块的特性。

      与Unix的一些区别:

        1.Linux支持动态加载内核模块。

        2.Linux支持对称多处理机制(SMP)。

        3.Linux内核可以抢占。

        4.Linux不区分线程和进程。

    2.GNU C

      Linux使用c编写的,并不完全符合ANSI C标准,涵盖了ISO C99和GNU C标准。下面介绍内核使用的C语言拓展的部分。

      1.内联(inline)函数

        内联函数从源代码层看,有函数的结构,而在编译后,却不具备函数的性质。内联函数不是在调用时发生控制转移,而是在编译时将函数体嵌入在每一个调用处。因此,可以消除函数调用和返回带来的开销,但是意味着占用更多的空间。适合将对时间要求高、代码不长的函数定义为内联函数。如:

        static inline void wolf();(MS的C99支持的关键字是_inline)。

      2.内联汇编

        gcc编译器支持在c函数中嵌入汇编指令。通常使用asm()指令嵌入代码。

      3.分支声明

        对于条件选择指令,gcc内建立了一条指令用于优化,在一个条件经常出现(likely),或者该条件经常很少出现的时候(unlikely),编译器可以根据这条指令对分支选择进行优化,从而生成更好的汇编代码。内核将这条指令封装成了宏。

          #define likely(x)       __builtin_expect((x),1)//表示 x 的值为真的可能性更大;
          #define unlikely(x)     __builtin_expect((x),0)//表示 x 的值为假的可能性更大。

        用法如下:

          if (likely(prev != next)) {
               next->timestamp = now;
                ...
          } else {
                ...;
          }

      

  • 相关阅读:
    IE6,IE7 DIV高度技巧(div高度兼容问题)
    QQ在线咨询插件
    Singleton单件 (创建型模式)
    SQL Server ErrorLog 错误日志(如果数据库所占空间变大)
    IE6 div标签height的Bug
    c# 中 Volatile关键字理解
    翻译:SWFObject 2.0官方文档(用来做flash的js)
    已连接到空闲例程的问题解决办法
    Oracle 的一个非常好的触发器例子
    Oracle中表的非常全面的操作
  • 原文地址:https://www.cnblogs.com/lucio_yz/p/4572088.html
Copyright © 2011-2022 走看看