1、linux 内核基本概念-上
linux 内核 和 linux 操作系统的区别
linux 内核 : 通常指的是由官网下载下来的源码 编译出来的 uImage 或者 zImage 镜像
启动中包含的由 硬件抽象层、文件系统、进程调度、网络管理、驱动管理、内存管理(多任务)等功能。
通常我们使用的 linux 系统 是指: 像 Ubuntu 等操作系统。 包含linux 内核, 工具集,各种第三方库,
图形界面,应用程序的一个发布包(发行版)
linux 内核特性
免费开源
可移植性 支持广泛的硬件平台
arm ppc mips x86...
扩展性
软硬件可裁剪
高可靠性、稳定性
网络功能强大
多任务、多用户系统
模块化设计
linux 内核版本
采用 A.B.C.D
A 主版本号
B 次版本号 为偶数表示 稳定版本 奇数为开发中版本
C 表示linux的发行版本号
D 表示更新版本号
linux 内核包含的五大功能:
1. 进程管理
2. 内存管理
3. 文件系统
4. 网络协议
5. 设备驱动管理
linux 不会是一个真正的实时系统 (时间片轮转方式)
vxwork 是一个真正的实时(RTOS )系统 收费
linux 分层
应用程序
||
\/
系统调用
||
\/
linux 内核 分为 平台无关码 和 平台相关码
||
\/
硬件平台
linux 内核 下载地址 https://www.kernel.org/
linux 各个版本下载地址 https://www.kernel.org/pub/linux/kernel/
编译内核 make uImage
编译设备树 make dtbs
上面两个命令都需要在 源码的顶层目录上 使用 ☆☆☆
二、linux 内核基本概念-中
注意要把 linux源码 拷贝到 Ubuntu中 解压,
因为 源码中会有一些软件链文件, 这些文件,windows文件系统 不能识别
解压命令 tar -xvf ***.tar.xz
// arm-cortex_a8_linux-gnueabi-..
// 这个交叉编译工具链,我没有从录制课程的老师手里拿到
// 大家也不必使用这个工具链,直接使用 课程资料里提供的
// gcc-4.6.4.tar.xz 就可以了
配置交叉编译工具链:
1.export PATH=/自己的路径/gcc-4.6.4/bin:$PATH
2. 写到启动脚本中 /etc/profile 或者 .bashrc
修改 源码顶层目录的 Makfile
ARCH ?= arm
CROSS_COMPILE ?= arm-none-linux-gnueabi-
// 我们不用 arm-cortex_a8_linux-gnueabi- 这个。。
三、linux 内核基本概念-下
使用 gcc-4.6.4 编译内核
使用 putty 串口工具软件
// 提醒: 如果想启动内核,还需要配置一下网络
// 网络配置学习视频
// 系统移植之网络配置 11.3 群内 http://e.vhall.com/102020226
设备树: 用于描述硬件设备信息。
低版本内核的设备硬件备信息,是存放在linux源码中的
高版本是写到 设备树文件中
☆ arch 不同CPU体系结构的差异代码
-> arm 不同板子板子的源码
-> boot uImage zImage
-> dts 设备树
☆ driver 驱动目录
-> net 网络驱动 (与设备相关)
kernel 内核调度算法
net 网络协议 (与设备无关的)
block 块设备相关驱动
fs 文件系统
include 头文件存放目录
Documentation 帮助文档
tools 工具
scripts 编译内核时使用的脚本
ipc 进程间通信
mm 内存管理
理解平台相关代码和平台无关代码
四、linux 内核启动分析
启动 u-boot -> kernel -> rootfs(root filesystem)
启动脚本 /etc/init.d/rcS 自启动应用
Starting kernel ... 属于 uboot的打印
重点理解 uboot 启动流程(面试出现频率高)
内核启动流程
a. 自解压 decompess (arch/arm/boot/compressed/head.S) 汇编
b. 检测合法性 入口 stext (arch/arm/kernel/head.S)
(CPU 类型 机器类型)
c. 运行 C代码 start_kernel (init/main.c)
d. 挂在 rootfs
e. 运行第一个应用程序 linuxrc
五、linux 内核调试方法
1. 汇编阶段 点灯法
2. puts(内核解压前)
3. printascii (console 初始化前)
4. printk (内核解压后,信息输出显示到console初始化之后)
打印级别 /proc/sys/kernel/printk
8个打印级别
init/main.c - start_kernel
第一次编译内核代码会比较长时间
如果修改或者添加源文件,再次编译,只会编译变化的部分 会快一些
oop内核异常信息
pc : 程序计数器
arm-none-linux-gnueabi-addr2line pc地址 -e vmlinux -f
在源码中显示具体出错的位置