一 回忆昨天的内容:
移植uboot uboot属于bootloader的一种 redboot armboot...
PC UEFI
阅读uboot的源码
uboot需要初始化的硬件:
cpu 内存 闪存 时钟 网卡 串口 看门狗 关闭中断
提高用户体验
阅读uboot的方法:
1. 有设计文档看设计文档
2. 只关注框架,放弃细节
uboot代码的执行流程:
上电 --> uboot ---> _stext ---> b reset --->
bl board_init_f ---> ldr pc, =board_init_r --->
run_main_loop ---> while (1) {cli_loop} --->
cli_simple_loop ---> for (;;) ---> 引导linux内核
内存管理:mmu
物理地址:开启mmu之后,没有经过mmu,
直接出现在地址总线上的地址
虚拟地址:经过mmu映射的地址
二 Linux内核
2.0.0 linux内核版本
linux
2.4 最早期
2.6 版本使用最多的版本
x6818 使用的是3.4版本 uname -a
PC 机上使用的是5.4.0版本
2.0.1 linux内核的组织结构
见图 linux内核组织结构
2.0.2 烧录三大软件时 uImage是从哪里来的
uImage 就是Linux内核的二进制文件,具体实施步骤如下:
2.1 Linux内核源码的获取
三星公司提供:
cp /mnt/hgfs/easthome_porting/kernel.tar.bz2 ./
2.2 首先来聊聊linux 内核的特点:
著名的开源软件
www.kernel.org
Linux内核支持多种处理器架构
mips la x86 arm x64 ppc....
Linux内核支持多种开发板,上万种
Linux内核支持多种文件系统: NTFS FAT32 EXT4 CRAMFS...
Linux内核支持多种硬件驱动
2.3 谈谈linux内核的七大功能 (7大子系统)
内存管理/进程管理/网络协议栈/系统调用/
设备驱动/文件系统/平台相关(BSP)
2.4 linux内核的源码操作:
实施步骤:
2.4.1 参照2.1 获取linux内核源码
获取交叉编译工具
2.4.2 先不要根据硬件差异修改代码,先编译验证
make distclean //获取最干净的源码
make x6818_defconfig //匹配内核源码能够
在x6818开发板上运行
或
cp arch/arm/configs/x6818_defconfig .config
x6818_defconfig 是x6818的配置文件
make uImage -j8 //编译生成uImage
2.4.3 linux内核允许配置
具体到某一款嵌入式设备可能只需要用到其中的一部分
功能,linux内核允许通过配置只将选中的功能编译进
uImage
选择哪些编译进内核,哪些不编译进内核的过程,
叫做内核的剪裁
如何修改配置:
make menuconfig ---> 展示出来一个图形化的界面
通过上下左右,空格去选择配置
General setup ---> //通用配置
(-liuyang) Local version - append to kernel release
[*] System V IPC
(5) Default panic timeout
System Type ---> //系统类型
ARM system type (SLsiAP S5P6818) ---> //芯片的类型
Userspace binary formats --->
Kernel support for ELF binaries
Device Drivers ---> //设备驱动的配置
File systems ---> //文件系统的配置
[*] Network File Systems ---> //网络文件系统
退出时,可以选择是否保存
make config //也可以配置内核
make xconfig //需要QT4的支持
make gconfig //需要GTK的支持
2.5 内核的编译
配置结束后
kernel 跟目录下的Makefile是总的
vim Makefile
ARCH ?= arm
CROSS_COMPILE ?= arm-cortex_a9-linux-gnu-
make uImage --> 给uboot使用
linux 内核本质上也是一个裸板程序
压缩 压缩
125M vmlinux ----> 11M Image ---> 5.2M zImage
10M 软盘
最终生成可执行程序的过程和shell框架是一样的 01
xxx.o yyy.o zzz.o ...-> vmlinux (ELF二进制文件)
--> Image ---> zImage ----> uImage (比zImage大64B)
uImage是专门给uboot用的
uboot在加载启动linux内核时,需要一些内核的信息
内核加载的位置
内核的大小
内核版本
....
fdisk 2 2 0x100000:0x4000000 0x4100000:0x2f200000
2.6 linux内核的源码分析:
2.6.1 入口文件
1) 看链接脚本确定
2) make V=1
rm vmlinux
make V=1 > 1.txt
arm-cortex_a9-linux-gnueabi-ld -EL -r -o vmlinux.o
arch/arm/kernel/head.o
arch/arm/kernel/init_task.o
找到入口文件:arch/arm/kernel/head.S
就是linux内核的真正的入口文件
注意:
阅读源码时:
1.有设计文档看设计文档
2.注重框架注重流程,放弃细节
Linux内核(Day20)
于 2022-07-29 09:25:12 首次发布