第一章 Linux内核简介

一、历史

由于Unix系统设计简洁并且在发布时提供源代码,所以许多其他组织和团体都对它进了进一步的开发。

Unⅸ虽然已经使用了40年,但计算机科学家仍然认为它是现存操作系统中最强大和最优秀的系统。从1969年诞生以来,由Dennis Ritchie和Ken Thompson的灵感火花点亮的这个Unix产物已经成为一种传奇,它历经了时间的考验依然声名不坠。

二、操作系统和内核简介

处理器在任何指定时间点上的活动范围可以概括为下列三者之一:

运行于内核空间,处于进程上下文,代表某个特定的进程执行。

运行于内核空间,处于中断上下文,与任何进程无关,处理某个特定的中断。

运行于用户空间,执行用户进程。

三、Linux内核和传统UNIX内核特点的比较

  • Linux支持动态加载内核模块。
  • Linux支持对称多处理(SMP)机制
  • Linux内核可以抢占。
  • Linux内核并不区分线程和其他的一般进程

四、Linux内核版本

命名规则:

五、Linux内核开发者社区

最重要的论坛:Linux kernel mailing list(lkml)

第二章 从内核出发

一、获取内核源码

课本中给出的方式是使用git,代码如下:

git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git

git pull # 更新分支到Linux的最新分支

安装:

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

• 如果使用git获取就不需要下载压缩文件。

• /usr/src/linux目录应当保证原封不动。

打补丁:

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

二、内核源码树

三、编译内核

1.配置内核

字符页面的命令行工具:
make config


图形界面工具
make menuconfig


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

二选一:yes 或者 no

三选一:yes 或者 no 或者 module(以模块生成)

其他的几种配置:

make defconfig //基于默认配置

make oldconfig //验证和更新配置

2.编译内核:make

• 减少编译的垃圾信息→对输出进行重定向。

make > .. /detritus # 重定向到这个文件里了

make > /dev/null # 把无用的输出信息重定向到永无返回值的黑洞里。

• 衍生多个编译作业→

make jn # n是衍生出的作业数,每个处理器可以衍生出1或2个作业,16核时n可取32.

3.安装新内核

make modules_install

System.map这个文件是一份符号对照表

四、内核开发的特点

1.内核开发时既不能访问C库也不能访问标准的C头文件

应对:include/linux文件夹中包含了所需的内核头文件。

2.内核编程时必须使用GNU C

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

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

分支声明:

unlikely(x) - x很少出现,绝少发生,通常为假

likely(y) - y经常出现,通常为真

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

内核中内存不分页。

4.内核编程时难以执行浮点运算

5.内核给每个进程只有一个很小的定长堆栈

6.由于内核支持异步中断、抢占和SMP,必须时刻注意同步和并发

SMP:对称多处理系统。

常用的解决竞争的方法:自旋锁和信号量。

7.要考虑可移植性的重要性

诸如保持字节序,64位对其,不假定字长和页面长度等。

《Linux内核设计与实现》学习总结 Chap1~2的更多相关文章

  1. Linux内核设计第一周学习总结 计算机如何工作

    北京电子科技学院 20135310陈巧然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-100002 ...

  2. Linux内核设计第二周学习总结 完成一个简单的时间片轮转多道程序内核代码

    陈巧然 原创作品 转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.使用实验楼的虚拟机 ...

  3. Linux内核设计第四周学习总结 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    陈巧然原创作品 转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验目的: 使用库函数A ...

  4. linux内核设计与实现学习笔记-模块

    模块 1.概念:  如果让LINUX Kernel单独运行在一个保护区域,那么LINUX Kernel就成为了“单内核”.    LINUX Kernel是组件模式的,所谓组件模式是指:LINUX K ...

  5. 《Linux内核设计与实现》课本第五章学习笔记——20135203齐岳

    <Linux内核设计与实现>课本第五章学习笔记 By20135203齐岳 与内核通信 用户空间进程和硬件设备之间通过系统调用来交互,其主要作用有三个. 为用户空间提供了硬件的抽象接口. 保 ...

  6. 《Linux内核设计与实现》课本第一章&第二章学习笔记

    <Linux内核设计与实现>课本学习笔记 By20135203齐岳 一.Linux内核简介 Unix内核的特点 Unix很简洁,所提供的系统调用都有很明确的设计目的. Unix中一切皆文件 ...

  7. 《Linux内核设计与实现》 第一二章学习笔记

    <Linux内核设计与实现> 第一二章学习笔记 第一章 Linux内核简介 1.1 Unix的历史 Unix的特点 Unix很简洁,所提供的系统调用都有很明确的设计目的. Unix中一切皆 ...

  8. 《Linux内核设计与实现》第四章学习笔记

    <Linux内核设计与实现>第四章学习笔记           ——进程调度 姓名:王玮怡  学号:20135116 一.多任务 1.多任务操作系统的含义 多任务操作系统就是能同时并发地交 ...

  9. 《Linux内核设计与实现》第五章学习笔记

    <Linux内核设计与实现>第五章学习笔记 姓名:王玮怡  学号:20135116 一.与内核通信     在Linux中,系统调用是用户空间访问内核的唯一手段:除异常和陷入外,它们是内核 ...

  10. 《Linux内核设计与实现》第四章学习笔记——进程调度

                                                                        <Linux内核设计与实现>第四章学习笔记——进程调 ...

随机推荐

  1. javaweb(二十一)——JavaWeb的两种开发模式

    一.JSP+JavaBean开发模式 1.1.jsp+javabean开发模式架构 jsp+javabean开发模式的架构图如下图(图1-1)所示

  2. css布局笔记(一)

    布局方式 一列布局 通常固定宽高,用margin:0 auto:居中显示 两列布局 说起两列布局,最常见的就是使用float来实现.float浮动布局的缺点是浮动后会造成文本环绕等效果,以及需要及时清 ...

  3. pytest使用笔记(三)——pytest+allure+jenkins配置使用

    按照pytest使用笔记(二)把pytest+allure配置好后,现在在jenkins配置好,先实现手动构建(立个小目标) 一,安装jenkins插件 首页->系统管理->插件管理,从“ ...

  4. python环境通过selenium实现自动化web登陆及终端邀请

    自动化主要的就是识别对象,可以在网上搜到各种各样的方法,自行百度.下面仅附上一个简单的例子. 环境搭建参考如下链接: https://www.cnblogs.com/hepeilinnow/p/101 ...

  5. UGUI简易摇杆

    实现 直接使用系统自带圆形控件图标 编写脚本, 实现UGUI拖拽事件 将多拽范围限定于给定半径和圆心的圆内 计算出等同于Input.GetAxis()的值,直接控制被控制物体 代码 using Sys ...

  6. Java如何调用shell脚本的

    有些时候会碰到这样的场景:java的功能里面要嵌入一个功能点,这个功能是通过是shell脚本实现的.这种时候就需要Java对脚本调用的支持了. 测试环境 Ubuntu16.04 i3-6100,12G ...

  7. CentOS7部署ELK5.2

    原文发表于cu:2017-02-10 参考文档: Elasticsearchyum文档:https://www.elastic.co/guide/en/elasticsearch/reference/ ...

  8. hive 2以上版本启动异常 Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient

    hive2.0以上的版本启动时 抛出 “Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreCli ...

  9. react native中props的使用

    react native中props的使用 一.props的使用 1:父组件传递的方式 在子组件中可以用this.props访问到父组件传递的值 <View> <Text> { ...

  10. 20181009-3 Scrum立会报告+燃尽图02

    此作业要求:[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2190] 一.小组介绍 组长:王一可 组员:范靖旋,王硕,赵佳璐,范洪达,祁 ...