第一章 LINUX内核简介

1.1 Unix的历史

  • 1969年的夏天,贝尔实验室的程序员们在一台PDR-7型机上实现了Unix这个全新的操作系统。
  • 1973年,整个Unix系统用C语言进行了重写,给后来Unix系统的广泛移植铺平了道路。
  • 伯克利的第一个Unix演化版是1977年推出的1BSD系统。
  • 伯克利真正独立开发的Unix系统是于1979年推出的3BSD系统,支持虚拟内存。
  • 1994年重写了虚拟内存子系统,推出了最终官方版,即4.4BSD。

Unix内核的特点:

  • 首先,Unix很简洁,仅仅提供几百个系统调用并且有一个非常明确的设计目的。
  • 在Unix中,所有的东西都被当做文件对待。
  • Unix内核和相关的系统工具软件是用C语言编写而成的,使得其在各种硬件体系架构面前都具备令人惊异的移植能力。
  • Unix的进程创建非常迅速,并且有一个非常独特的fork系统调用。
  • Unix提供了一套非常简单但又很稳定的进程间通信元语,把目标放在一次执行保质保量地完成一个任务上。

1.2Linux简介

Linux是类Unix系统,没有直接使用Unix的源代码,但也没有抛弃Unix的设计目标并且保证了应用程序编程接口的一致性。

Linux内核也是自由(公开)软件。

1.3操作系统和内核简介

操作系统:整个系统中负责完成最基本功能和系统管理的部分。

内核(管理者或者操作系统核心):由负责响应中断的中断服务程序,负责管理多个进程从而分享处理器时间的调度程序,负责管理进程地址空间的内存管理程序和网络、进程间通信等系统服务程序共同组成。

内核空间:系统态和被保护起来的内存空间。

在系统中运行的应用程序通过系统调用来与内核通信。

将每个处理器在任何指定时间点上的活动必然概括为:

  • 运行于用户空间,执行用户进程
  • 运行于内核空间,处于进程上下文,代表某个特定的进程执行
  • 运行于内核空间,处于中断上下文,与任何进程无关,处理某个特定的中断

1.4Linux内核和传统Unix内核的比较

单内核:把它从整体上作为一个单独的大过程来实现,同是也运行在一个单独的地址空间上。

微内核:功能被划分成各个独立的过程。每个过程叫做一个服务器。

Linux是一个单内核,汲取了微内核的精华:模块化设计、抢占式内核、支持内核线程以及动态装载内核模块的能力。让所有事情运行在内核态,直接调用函数,无需消息传递。

  • 支持动态加载内核模块
  • 支持对称多处理(SMP)
  • 内核可以抢占(preemptive),允许内核运行的任务有优先执行的能力
  • 不区分线程和其他的一般进程
  • 提供具有设备类的面向对象的设备模型、热插拔事件,以及用户空间的设备文件系统。

1.5Linux内核版本

版本号为2.6.30.1的内核,主版本号是2,从版本号是6,修订版本号是30,稳定版本号是1。

第二章 从内核出发

1. 获取内核源码

  • 使用Git

    git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
    git pull # 更新分支到Linux的最新分支
  • 安装内核源代码(如果使用git获取就不需要下载压缩文件。)

    tar xvjf linux-x.y.z.tar.bz2
    或者
    tar xvzf linux-x.y.z.tar.gz

注意:内核源代码一般安装在/usr/src/linux目录下,即使在安装新内核时,/usr/src/linux目录应当保证原封不动。

  • 使用补丁

    patch -p1 < ../patch-x.y.z

2. 内核源码树

3. 编译内核

3.1 配置内核

配置项的二选一和三选一:

二选一:yes 或者 no

三选一:yes 或者 no 或者 module(module意味着该配置被选定了,以模块生成。驱动程序一般都用三选一的配置项)

字符页面的命令行工具:
make config 图形界面工具:
make menuconfig 基于默认配置为体系结构创建一个配置:
make defconfig 验证和更新配置:
make oldconfig

3.2 编译内核

编译内核:
make 重定向到该文件中:
make > .. /detritus 把无用的输出信息重定向到永无返回值的黑洞中:
make > /dev/null

3.3 安装新内核

将所有已编译的模块安装到正确的主目录/lib/modules下
make modules_install

4. 内核开发的特点

  • 内核开发时既不能访问C库也不能访问标准的C头文件 (解决方法:include/linux文件夹中包含了所需的内核头文件。)
  • 内核编程时必须使用GNU C

    • 内联函数: 函数会在所调用的位置上展开。 定义时,需要使用static作为关键字,用inline限定它。 内联函数必须在使用之前就定义好,一般在头文件中定义。 内核中优先使用内联函数而不是宏。

    • 内联汇编: 通常使用asm()指令嵌入汇编代码,用volatile表示不优化

    • 分支声明: unlikely(x) - x很少出现,绝少发生,通常为假 likely(y) - y经常出现,通常为真

  • 内核编程时缺乏像用户空间那样的内存保护机制

  • 内核编程时难以执行浮点运算
  • 内核给每个进程只有一个很小的定长堆栈
  • 由于内核支持异步中断、抢占和SMP(对称多处理系统),必须时刻注意同步和并发。(常用的解决竞争的方法:自旋锁和信号量)。
  • 要考虑可移植性的重要性(诸如保持字节序,64位对其,不假定字长和页面长度等。)

linux第一次读书笔记的更多相关文章

  1. Linux内核读书笔记第二周

    什么是系统调用 简单来说,系统调用就是用户程序和硬件设备之间的桥梁.用户程序在需要的时候,通过系统调用来使用硬件设备. 系统调用的存在,有以下重要的意义: 1)用户程序通过系统调用来使用硬件,而不用关 ...

  2. Linux 第一次学习笔记

    一.Linux 为何物 Linux 就是一个操作系统,就像你多少已经了解的 Windows(xp,7,8)和 Max OS ,至于操作系统是什么,就不用过多解释了,如果你学习过前面的入门课程,应该会有 ...

  3. Linux内核读书笔记第六周

    主要内容: 什么是调度 调度实现原理 Linux上调度实现的方法 调度相关的系统调用 什么是调度 现在的操作系统都是多任务的,为了能让更多的任务能同时在系统上更好的运行,需要一个管理程序来管理计算机上 ...

  4. Linux内核读书笔记第五周链接

    1.临界区(critical regions)就是访问和操作共享数据的代码段.多个执行线程并发访问同一个资源通常是不安全的,为了避免在临界区中并发访问,编程者必须保证这些代码 原子地执行.也就是说,代 ...

  5. Linux内核读书笔记第四周

    进程管理 1.进程描述符及任务结构 进程存放在叫做任务队列(task list)的双向循环链表中.链表中的每一项包含一个具体进程的所有信息,类型为task_struct,称为进程描述符(process ...

  6. Linux内核读书笔记第三周 调试

    内核调试的难点在于它不能像用户态程序调试那样打断点,随时暂停查看各个变量的状态. 也不能像用户态程序那样崩溃后迅速的重启,恢复初始状态. 用户态程序和内核交互,用户态程序的各种状态,错误等可以由内核来 ...

  7. 《深入理解Linux内核》 读书笔记

    深入理解Linux内核 读书笔记 一.概论 操作系统基本概念 多用户系统 允许多个用户登录系统,不同用户之间的有私有的空间 用户和组 每个用于属于一个组,组的权限和其他人的权限,和拥有者的权限不一样. ...

  8. 《Linux内核设计与实现》读书笔记(十二)- 内存管理【转】

    转自:http://www.cnblogs.com/wang_yb/archive/2013/05/23/3095907.html 内核的内存使用不像用户空间那样随意,内核的内存出现错误时也只有靠自己 ...

  9. 《Linux内核设计与实现》读书笔记(十一)- 定时器和时间管理【转】

    转自:http://www.cnblogs.com/wang_yb/archive/2013/05/10/3070373.html 系统中有很多与时间相关的程序(比如定期执行的任务,某一时间执行的任务 ...

随机推荐

  1. Hive-1.2.1_04_DML操作

    Hive官方文档:Home-UserDocumentation Hive DML官方文档:LanguageManual DML 参考文章:Hive 用户指南 1. Loading files into ...

  2. 改变javascript函数内部this指针指向的三种方法

    在查了大量的资料后,我总结了下面的三条规则,这三条规则,已经可以解决目前我所遇到的所有问题.规则0:函数本身是一个特殊类型,大多数时候,可以认为是一个变量. function a() { alert( ...

  3. Spark机器学习中ml和mllib中矩阵、向量

    1:Spark ML与Spark MLLIB区别? Spark MLlib是面向RDD数据抽象的编程工具类库,现在已经逐渐不再被Spark团队支持,逐渐转向Spark ML库,Spark ML是面向D ...

  4. 敌兵布阵 HDU - 1166 (树状数组模板题,线段树模板题)

    思路:就是树状数组的模板题,利用的就是单点更新和区间求和是树状数组的强项时间复杂度为m*log(n) 没想到自己以前把这道题当线段树的单点更新刷了. 树状数组: #include<iostrea ...

  5. 【转】BAT批处理中的字符串处理详解(字符串截取)

    下面对这些功能一一进行讲解. 1.截取字符串 截取字符串可以说是字符串处理功能中最常用的一个子功能了,能够实现截取字符串中的特定位置的一个或多个字符.举例说明其基本功能: @echo off set ...

  6. C# 委托知识总结

    原文地址:http://www.cnblogs.com/qingyuan/archive/2010/05/11/1732415.html 1.什么是委托,为什么要使用委托 我正在埋头苦写程序,突然想喝 ...

  7. python 上传百度语音识别+文字返回结果

    1文字生成语音 #!/usr/bin/python3 import urllib.request import requests#导入requests库 import urllib import js ...

  8. Android开发之加载GIF图片

    一.加载GIF图片我用的是GitHub上的开源库:android-gif-drawable,项目地址:https://github.com/koral--/android-gif-drawable 二 ...

  9. <转>大型分布式网站术语浅析

    夜半睡起看书,看到一篇关于分布式网站性能优化术语的文章,个人觉得不错,分享出来... 原文地址:大型分布式网站术语分析 一.I/O优化 1.增加缓存,减少磁盘的访问次数. 2.优化磁盘的管理系统,设计 ...

  10. Android 如果布局中有ScrollView和Fragment或者带有滚动条的布局进行嵌套,布局加载完成页面无法定位到顶部的情况

    页面无法定位到顶部: 1.ScrollView中嵌套Fragment(Fragment中可能有想ScrollView,ListView带有滚动条的控件). 2.ScrollView嵌套ScrollVi ...