第二章 從內核出發

1. 內核源碼樹的根目錄描述

目錄 描述
arch 特定體繫結構的代碼
block 塊設備IO層
crypto
加密API

Documentation 內核源碼文檔
drivers 設備驅動程序
firmware 使用某些驅動程序而需要的設備固件
fs VFS和各種文件系統
include 內核頭文件
init 內核引導和初始化
ipc 進程間通訊代碼
kernel 像調度程序這樣的核心子系統
lib 通用內核函數
mm 內存管理子系統和VM
net 網絡子系統
samples 示例,示範代碼
scripts 編譯內核所用的腳本
security Linux安全模塊
sound 語音子系統
usr 早期的用戶空間代碼(所謂的initramfs)
tools 在Linux開發中有用的工具
virt 虛擬化基礎結構

2. 在修改過內核配置文件.config後,或者用已有的配置文件配置新的代碼樹的時候,使用下面的命令驗證和更新配置

  1. make oldconfig

3. 如果配置了內核選項CONFIG_IKCONFIG和CONFIG_IKCONFIG_PROC,那麼就會把完整的壓縮過的內核配置文件存放在/proc/config.gz下。具體配置:

General setup

---> <*> Kernel .config support

---> [*]   Enable access to .config through /proc/config.gz

可以使用下面的命令將config.gz取出,並用它來編譯一個新內核:

  1. zcat /proc/config.gz >.config
  2. make oldconfig

此外,也可以利用內核提供的腳本scripts/extract-ikconfig將內核配置文件從內核鏡像裏解析出來,用法如下:

  1. ./scripts/extract-ikconfig arch/arm/boot/zImage | tee config_file
  2. 或者
  3. ./scripts/extract-ikconfig arch/arm/boot/uImage | tee config_file
  4. 或者
  5. ./scripts/extract-ikconfig arch/arm/boot/Image| tee config_file
  6. 或者
  7. ./scripts/extract-ikconfig  ./vmlinux | tee config_file

4. 在編譯完Linux內核後,會在內核源碼樹的根目錄下創建一個System.map文件。

這是一份符號對照表,用於將內核符號和它們的起始地址對應起來。在調試的時候,如果需要把內存地址翻譯成容易理解的函數名以及變量名,這很有用。

5. 內核編程的特點

  • 不能訪問C庫也不能訪問標準的C頭文件。(原因是速度和大小,因爲C庫太低效)

基本的內核頭文件位於內核源代碼樹頂級目錄下的include下,如頭文件<linux/inotify.h>對應的是include/linux/inotify.h

跟體繫結構相關的頭文件集位於內核源碼樹的arch/<architecture>/include/asm目錄下,內核代碼通過以asm/爲前綴的方式包含這些頭文件,如<asm/ioctl.h>

printk的用法範例:

  1. printk(KERN_ERR "this is an error.\n")
  • 必須使用GNU C
  • 缺乏像用戶空間那樣的內存保護機制
  • 難以執行浮點運算

除一些極少的情況,不要在內核中使用浮點操作

  • 內核給每個進程只有一個很小的定長內核堆棧
  • 由於內核支持異步中斷、搶佔和SMP,故必須時刻注意同步和併發
  • 要考慮可移植性的重要性

6. 內聯函數:函數會在他所調用的位置展開

  • 使用內聯函數的目的是這麼做可以消除函數調用和返回帶來的開銷(寄存器存儲和恢復)。編譯器會把調用函數的代碼和函數本身放在一起進行優化,代價是代碼會變長,會佔用更多的內存空間或者佔用更多的指令緩存
  • 把對時間要求比價高,而本身長度又比較短的函數定義成內斂函數
  • 實際使用時,內斂函數一般定義在頭文件中,如果只在某個源文件中使用,也可以定義在該文件開始的地方
  • 定義內斂函數的範例
  1. static inline void wolf (unsigned long tail_size)

7. 內聯彙編

Linux的內核混合使用了C語言和彙編語言,在偏近體繫結構的底層或者對執行時間要求嚴格的地方,一般使用彙編語言。

8.  unlikely()和likely()

在一個條件經常出現,或者很少出現時,編譯器可以根據gcc內建的一條指令對條件分支選擇進行優化。內核將這條指令封裝成了上面的兩個宏。

對於很少發生的分支,用unlikely()宏,對於經常發生的分支,用likely()宏。

9. 內核中的內存都不分頁,你用掉一個字節,物理內存就減少一個字節。在內核中不應該去訪問非法的內存地址,否則死掉。

10. 用戶空間的棧本身比較大,而且還能動態地增長。但是內核棧的大小隨體繫結構變,大小爲兩頁,即在32位機器上,內核棧爲8KB,在64位機器上爲16KB。每個處理器都有自己的棧。

11. 內核產生競爭的原因:

  • Linux是搶佔多任務操作系統

內核的進程調度程序即興對進程進行調度和重新調度,內核必須和這些任務同步。

  • Linux內核支持對稱多處理系統(SMP)

同時在兩個或兩個以上的處理器上執行的內核代碼很可能同時訪問共享的資源。

  • 中斷是異步到來的,完全不顧及當前正在執行的代碼

中斷處理程序有可能訪問同一資源

  • Linux內核可以搶佔

內核中一段正在執行的代碼可能會被另一段代碼搶佔,可能導致幾段代碼同時訪問相同資源

12. 常用的解決競爭的辦法是自旋鎖信號量

完。

来自为知笔记(Wiz)

时间: 2024-10-08 07:43:35

第二章 從內核出發的相关文章

第一章 Linux內核簡介

1. Linux是類Unix系統,但他不是Unix. 儘管Linux借鑑了Unix的許多設計並且實現了Unix的API(由Posix標準和其他Single Unix Specification定義的),但Linux沒有像其他Unix變種那樣直接使用Unix的源代碼. 2. Linux系統的基礎是內核.C庫.工具集和系統的基本工具,如登錄程序和Shell. 3. 操作系統是指在整個系統中負責完成最基本功能和系統管理的那些部分.這些部分應該包括內核.設備驅動程序.啓動引導程序.命令行Shell或者其

第九章 內核同步介紹

1. 隨着2.6版內核的出現,Linux內核已經發展成搶佔式內核,如果不加保護,調度程序可以在任何時刻搶佔正在運行的內核代碼,重新調度其他的進程執行 2. 臨界區或者臨界段:訪問和操作共享數據的代碼段 3. 如果兩個執行線程(指代的是任何正在執行的代碼,如一個在內核執行進程.一個中斷處理程序或者內核線程)處於同一個臨界區中同時執行,就成它是競爭條件(race conditions) 4. 避免併發和防止競爭條件稱爲同步(synchronization). 5. 忙等待:反覆處於一個循環中,不斷檢

第十章 內核同步的方法

原子操作 1. 原子操作可以保證指令以原子的方式執行--執行過程不被打斷. 2. 兩個原子操作絕對不可能併發地訪問同一個變量.大多數體繫結構會提供支持原子操作的簡單算數指令,即使沒有,也會爲單步執行提供鎖內存總線的指令,確保其他改變內存的操作不會同時發生. 3. 原子操作分爲兩種,一種是針對整數的,另一種是針對單獨的位. 4. 針對單獨位的操作,提供了一套原子操作和一套非原子操作,非原子操作函數的特點函數名字前綴多了兩個下劃線.比如test_bit()對應的非原子形式是__test_bit().

PRML第二章笔记

这是关于PRML第二章的学习笔记.主要从内容思想的理解,具体的理论推导需要结合原文以及概率论的知识.这一章主要讲概率分布,概率分布的?个作?是在给定有限次观测x1, - , xN的前提下,对随机变量x的概率分布p(x)建模.这个问题被称为密度估计,分为二元 多元 高斯 以及先验分布 beta 狄利克雷分布,最后将这些分布统一到指数簇家族一类中. 引言:概率分布分为两个经典学派,频率学派和贝叶斯学派. 频率学派关注数据,认为数据是不会说谎的,一切以数据为中心,采用最大似然函数来求取data 的概率

第二章、诊断

目录 第二章.诊断 一.阿斯伯格综合征的问卷和评分 二.诊断评估 三.当前诊断的标准 目前和DSM-IV相关的一些问题 四.是阿斯伯格综合征还是高功能孤独症 五.阿斯伯格综合征的患病率 六.对女孩的诊断评估 七.成人阿斯伯格综合征的诊断 成人阿斯伯格综合征评估工具 八.结束诊断评估 九.对诊断的信心 本章重点及策略 ++++++ 第二章.诊断 这些孩子一眼就能看出来,你能从那些细小的地方发现他们就是这一类孩子,从他们第一次来就诊时走进房间的样子,从他们刚开始时的行为和他们嘴里说出的第一个词. -

Machine Learning In Action 第二章学习笔记: kNN算法

本文主要记录<Machine Learning In Action>中第二章的内容.书中以两个具体实例来介绍kNN(k nearest neighbors),分别是: 约会对象预测 手写数字识别 通过“约会对象”功能,基本能够了解到kNN算法的工作原理.“手写数字识别”与“约会对象预测”使用完全一样的算法代码,仅仅是数据集有变化. 约会对象预测 1 约会对象预测功能需求 主人公“张三”喜欢结交新朋友.“系统A”上面注册了很多类似于“张三”的用户,大家都想结交心朋友.“张三”最开始通过自己筛选的

关于《大道至简》第二章的收获

今天阅读了大道至简的第二章,这一章的标题是懒人造就了方法.文章以愚公和李冰作为例子,讲述了好的方法是如何产生的.由此我们可以想到身边的一些例子,假如我们要给一些学生出算数题,题量不大的情况下我们可以直接出题,当要求题量的时候这就是一个大工程了.为此,我们可以写一个简单的软件实现出题的功能.虽然写这个软件会花费一些时间,但是完成之后会省下很大的精力. 我们应该学会将源代码分写在几个文件中,而不是所有的都写在一起,因为都放在一个文件中,到了后期的维护可能会是很大的问题,因此Unit关键字出现了,将一

深入浅出Zabbix 3.0 -- 第二章 Zabbix Web操作与定义

第二章  Zabbix Web操作与定义 本章介绍Zabbix 中一些基本概念的定义和web前端页面的操作,包括Zabbix中使用的一些术语的定义,Web页面中用户管理.主机和主机组的管理,以及监控项.模板.触发器.告警的管理和操作,还有Graphs.Screens.Maps及Reports等.通过本章的学习掌握一些基本概念并能够通过Web页面的操作完成对Zabbix的管理. 2.1 定义 hosts(主机) Zabbix中需要监控的服务器.交换机及其他设备我们都统一称作host,这些设备与Za

《大道至简》第二章阅读笔记

<大道至简>这本书在第二章中的主要内容是“懒人创造方法”!因为一个勤勤恳恳.老实工作的人是不太可能会懂得创新的,因为他只知道认真仔细的工作,一点一滴.一丝不苟.按部就班的按照上司交给他的内容,因为他认真负责,不容许自己出现一点纰漏.而懒人则不一样了,因为工作量庞大,所以他们自己因为懒惰而各种寻找方法,从而减轻自己的工作量,动脑筋让自己的实际工作量减到最小,而这时就需要开动脑筋,让自己想出一个可行的办法,从而实现自己的目的. 在这本书的第二章开头,还是延续了这本书的惯例,用一个寓言小故事来引入本