第一章 Linux内核简介

一、Unix

Unix是一个强大、健壮和稳定的操作系统。

  1. 简洁
  2. 绝大部分东西都被当做文件对待。这种抽象使对数据和对设备的操作都是通过一套相同的系统调用借口来进行的:open(),read(),write(),lseek()和close()
  3. 出色的平台可移植性——内核和相关的系统工具软件用C语言编写而成
  4. 进程创建迅速
  5. 进程间通信原语简单稳定

Unix——支持抢占式多任务、多线程。虚拟内存、换页、动态链接和TCP/IP网络。

二、操作系统和内核简介

操作系统是指在整个系统中负责完成最基本功能和系统管理的那些部分。

  • 内核
  • 设备驱动程序
  • 启动引导程序
  • 命令行shell或者其他种类的用户界面
  • 基本的文件管理工具和系统工具

内核独立于普通应用程序,一般处于系统态,拥有受保护的内存空间和访问硬件设备的所有权限。

这种系统态和被保护起来的内存空间,统称为内核空间

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

应用程序完成其工作的基本行为方式是:

应用程序通过系统调用界面陷入内核。

处理器的活动必然其下三者之一:

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

三、Linux内核版本

Linux内核有两种,稳定的和处于开发中的。



从版本号如果是偶数,就是稳定版,如果是奇数,就是开发版。

第二章 从内核出发

一、获取内核源码

课本中给出的方式是使用git,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.配置内核

  1. 字符页面的命令行工具:

     make config
  2. 图形界面工具

     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位对其,不假定字长和页面长度等。

总之

课本上的内容与视频中、老师上课讲述内容有所重复也有所补充,并且配合曾经学习过的知识一同学习,事半功倍。

20135202闫佳歆--week3 课本1-2章学习笔记的更多相关文章

  1. 20135202闫佳歆--week6 课本第三章学习笔记

    第三章 进程管理 一.进程 1.进程 进程就是处于执行期的程序. 进程就是正在执行的程序代码的实时结果. 进程是处于执行期的程序以及相关的资源的总称. 进程包括代码段和其他资源. 2.线程 执行线程, ...

  2. 20135202闫佳歆--week4 课本第5章学习笔记

    第五章 系统调用 一.与内核通信 系统调用在用户控件进程和硬件设备之间添加了一个中间层,作用如下" 为用户空间提供了一种硬件的抽象接口 系统调用保证了系统的稳定和安全 每个进程都运行在虚拟系 ...

  3. 20135202闫佳歆--week4 系统调用(上)--学习笔记

    此为个人笔记存档 week 4 系统调用(上) 一.用户态.内核态和中断处理过程 用户通过库函数与系统调用联系起来. 1.内核态 在高执行级别下,代码可以执行特权指令,访问任意的物理地址. 2.用户态 ...

  4. 20135202闫佳歆--week5 系统调用(下)--学习笔记

    此为个人笔记存档 week 5 系统调用(下) 一.给MenuOS增加time和time-asm命令 这里老师示范的时候是已经做好的了: rm menu -rf 强制删除 git clone http ...

  5. 20135202闫佳歆--week3 跟踪分析Linux内核的启动过程--实验及总结

    实验三:跟踪分析Linux内核的启动过程 一.调试步骤如下: 使用gdb跟踪调试内核 qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd r ...

  6. 20135202闫佳歆--week5 课本18章学习笔记

    第十八章 调试 内核级开发的调试工作远比用户级开发艰难的多. 一.准备开始 准备工作需要的是: 一个bug 一个藏匿bug的内核版本 相关内核代码的知识和运气 在这一章里,调试的主要思想是让bug重现 ...

  7. 20135202闫佳歆--week3 构造一个简单的Linux系统MenuOs--学习笔记

    此为个人学习笔记存档 week 3 构造一个简单的Linux系统MenuOs 复习: 计算机有三个法宝:存储程序计算机,函数调用堆栈,中断 操作系统有两把剑: 1.中断上下文的切换,保存现场和恢复现场 ...

  8. 20135202闫佳歆--week 7 Linux内核如何装载和启动一个可执行程序--实验及总结

    week 7 实验:Linux内核如何装载和启动一个可执行程序 1.环境搭建: rm menu -rf git clone https://github.com/megnning/menu.git c ...

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

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

随机推荐

  1. 获取QQ头像接口

    https://q4.qlogo.cn/g?b=qq&nk=QQ号码&s=140

  2. Oracle RMAN 恢复数据库到不同主机(二)

    我们在recover database时报一个错误: RMAN-06054: media recovery requesting unknown archived log for thread 1 w ...

  3. eclipse中ant打war包

    注:有可能打包失败是eclipse没有集成的原因,用我自己的eclipse可以,同事那就有可能打包失败,一定要注意这点. 1.先在eclipse中集成或自己安装解压ant,总之有可用的ant就好. 2 ...

  4. pycham database查看db.sqlites文件 无内容解决方法

    初学django,使用pycharm IDE的时候,通过使用默认的sqlites数据库,执行问makemigration 和migrate操作之后,控制台正常输出类似如下结果,按照道理应该生成了数据表 ...

  5. Android ListView下拉刷新时卡的问题解决小技巧

    问题:ListView下拉刷新时看上去非常的卡 解决方案: 在BaseAdapter的getView方法中,有三个参数 public View getView(int position, View c ...

  6. 计算机视觉-sift(2)代码理解

    之前结合不同人的资料理解了sift的原理,这里通过opencv中的代码来加深对sift的实现的理解. 使得能够从原理性理解到源码级的理解.不过该博文还是大量基于<赵春江, opencv2.4.9 ...

  7. centos发送邮件

    这里使用mailx发送. #yum -y install mailx 安装成功后,进入家目录编写配置文件.配置发送方的邮箱.密码.发送的服务器 #vi ~/.mailrc set from=hello ...

  8. 前尘浮华一场梦 NOI2018 游记

    前尘浮华一场梦 NOI2018 哦?我摆弄着手中的键盘,看起来,是要我离开吗?好吧,对于每一个OIer的年,都是以NOI开始,以NOI结束的啊…这个年过的,可不是那么让人舒服呢… 你想听那个人的故事? ...

  9. 添加树莓派python程序自启动的方法

    首先确保网络,硬件连接都正确.保证py程序可以正确运行. 然后远程登录树莓派 打开这个文件来修改自启动,网上有很多方法都是新建一个脚本来完成的.由于我们是自启动python文件,所以命令会有不同. 如 ...

  10. 如何优雅的使用mybatis

    原文:https://blog.csdn.net/gebitan505/article/details/54929287 这两天启动了一个新项目因为项目组成员一直都使用的是mybatis,虽然个人比较 ...