Linux内核源码目录树读写分析
1、Linux内核源码目录树读写分析:
sudo apt-get install tree
tree //查看目录树
大约1.3w个C文件:1100w行代码
Linux开源、免费,由Linux开源社区工作者共同维护
Linux是开源的,支持多架构、多平台代码,具有特别高的可移植性
但Linux内核通常编译成几M----4M
因为它支持多平台、多架构,所以在编译之前必须进行配置,配置为合适的目标平台来使用。
平台:ARM(海思、友善之臂、Raspberry Pi、nanopi)X86 MIPS
参考文章:
Linux内核源代码目录树形结构
了解源码目录树的结构
2、配置适合Raspberry Pi相关操作的Linux内核:
我们工作的时候,需要编译驱动代码linux源码编译阿帕奇,然后编译驱动代码,但是驱动代码的编译需要预编译内核,而编译好的内核必须要配置。
配置的最终目标是生成 .config 文件,该文件指示 Makefile 将有用的内容组织到内核中。
制造商分发Linux内核源代码:例如,如果您购买Raspberry Pi,制造商将给您Raspberry Pi Linux内核源代码
拿到源码后linux源码编译阿帕奇,里面包含了厂家的源码
第一种形式:
cp 厂家.config .config
find . -name *_defconfig
找到:
./arch/arm/configs/bcm2709_defconfig
第二种形式:
make menuconfig //一项项配置,通常基于厂家的config来配置
第三种形式:
厂家自家:全部自己做
如何配置Linux树莓派的内核?
方法一:
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make bcm2709_defconfig
//用来配置,指定编译器
该命令的作用是将bcm2709_defconfig的配置获取到.config中。
我们可以直接使用项目中的配置,但这样的话,树莓派原有的配置可能会丢失。 这是获取当前使用的树莓派配置的方法。
实现将manufacturer.config改为,config
方法二:
添加驱动程序
安装必要的库:
sudo apt-get install bc
sudo apt-get install libncurses5-dev libncursesw5-dev
sudo apt-get install zlib1g:i386
sudo apt-get install libc6-i386 lib32stdc++6 lib32gcc1 lib32ncurses5
安装后:
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make menuconfig
驱动两种加载形式:
*:编译进内核-----zImage包含驱动程序。
M:驱动文件xxx.ko以模块的形式生成。 系统启动后,传递命令
inmosd xxx.ko 已加载
**方法三:**暂时忽略
3.Linux内核编译:
编译:
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make -j4 zImage modules dtbs 2>&1 | tee build.log
//arm架构,内核7,j4:指定用多少电脑资源编译,
//zImage:生成内核镜像
//modules:生成驱动模块
//dtbs:生成配置文件
用n个进程进行编译。 如果不指定进程数,默认会在单个进程中编译。
内核编译成功后可以看到源码树多了vmlinux,如果失败则没有这个文件。
成功后zImage就是我们需要的目标图片
cd arch/arm
cd boot
ls
3. 将 Linux 内核镜像复制到 Raspberry Pi 并启动新内核:
打包 zImage 文件:
直接使用linux源码包中的工具:
./scripts/mkknlimg arch/arm/boot/zImage ./kernel_new.img
在此目录下生成kernel_new.img文件,该文件就是要放到sd卡中的文件。
注意:网上很多地方都说使用tools/mkimage/imagetool-uncompressd.py的方式不行! !
镜像副本:
1. 关闭树莓派电源,拔出SD卡,使用U盘插入笔记本连接虚拟机。
dmesg //显示可移动设备信息
cd //回到根目录
mkdir data1
mkdir data2
//数据拷贝;创建两个文件夹,挂载U盘
sudo mount /dev/sdb1 data1//一个fat分区,是boot相关的内容,kernel的img文件就放在这个分区里;
sudo mount /dev/sdb2 data2//一个是ext4分区,也就是系统的根目录分区
// sudo umount /dev/sdb1 //取消挂载
//data1:U盘数据 data2:根目录数据
数据2:
安装模块:
sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make INSTALL_MOD_PATH=/home/dazai/data2 modules_install
安装设备驱动文件:hdmi接口 usb WiFi io等;
更新 kernel.img 文件:
注:镜像名称:kernel7.img
cd data1
ls
//可以看到kernel7.img 文件
cp kernel7.img kernel7OLD.img//做一个备份
然后将新生成的副本复制到data1中并命名为:kernel7.img
cp kernel_new.img /home/dazai/data1/kernel7.img
md5sum kernel_new.img//检查cp是否成功
md5sum /home/dazai/data1/kernel7.img
复制成功。
复制其他相关文件:
cp arch/arm/boot/dts/.*dtb* /home/dazai/data1/
cp arch/arm/boot/dts/overlays/.*dtb* /home/dazai/data1/overlays/
cp arch/arm/boot/dts/overlays/README /home/dazai/data1/overlays/
之后,Ubuntu 会切断对 SD 卡的处理,并将其发送给 Windows 进行捕获。
减少:
之后:将 SD 卡插回 Raspberry Pi
通过并口登录观看启动过程,
树莓派终端输入:
uname -r
内核版本已更改。
树莓派内核配置、编译、移植成功。
这些行动始于:
驱动代码的编译需要预编译内核。
参考文章:
树莓派-内核开发-说明书下载代码编译和替换内核