# elegant_linux_design **Repository Path**: pengpeijie/elegant_linux_design ## Basic Information - **Project Name**: elegant_linux_design - **Description**: linux kernel统一学习平台 - **Primary Language**: Unknown - **License**: GPL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 16 - **Created**: 2023-07-25 - **Last Updated**: 2023-07-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 《linux驱动优雅设计》 by cxj 2023. v1.0.0 初始化版本 v1.0.1 进行中 # 0 平台使用指引 本平台采用qemu来虚拟arm/arm64平台,内部提供linux源码、busybox源码、编译脚本、和qemu预装环境。开发者通过该平台可以进行:交叉编译、驱动开发、源码分析与验证等工作。 如下是平台的使用指引及基本思路,读者可以参考。 ``` +-----------+ +--------------+ +---------+ +--------------+ +----------+ +------------+ | How to use|------| Environment |-------| ubuntu |-------| 14.04~16.04 |---| prebuilt |---| qemu 2.9.1 | +-----------+ +--------------+ +---------+ +--------------+ +----------+ +------------+ | | +--------------+ +-----------------------------------+ | +-----------| 18.04~20.04 |---| apt-get intall or newest builing | | +--------------+ +-----------------------------------+ | | +--------------+ +--------------+ +--------------+ +------------| build |--------| busybox |------| ramdisk |-----------------------------+ | +--------------+ +--------------+ +--------------+ | | | | | | | +--------------+ | +---------+ | | +----------------| kernel |------------+----------->| Image | | | | +--------------+ +---------+ | | | +--------------+ +---host---+ | rootfs | +----------------| modules |------------| kmodules |-------O---share--+ | | +--------------+ +----------+ | | | | +------------+ +--------------+ | | | +--------------| qemu |--------| setup arm |-------------------------------| /lib/modules | +------------+ +--------------+ | | | | +--------------+ | +---V-----+ | +---------------| setup arm64 |-------------------------------+----->| running |<-+ +--------------+ +---A-----+ | /data +--host--+ | | data |-------share-------+ +--------+ ``` `注意:强烈推荐使用windows的wls子系统安装ubuntu20.04版本,可以快速完成安装部署` # 1 目录结构 ├── busybox-1.35.0 //busybox源码 ├── elegant-design //课程设计源码 ├── linux-5.9 //linux源码 ├── qemu //qemu虚拟开发环境 └── README.md # 2 使用说明 ## 2.1 基础环境 ### 2.1.1 交叉编译工具: 【aarch64】 - 直接安装方式:`sudo apt-get install gcc-aarch64-linux-gnu`,安装默认版本 - 其他方式:`https://releases.linaro.org/components/toolchain/binaries/` 选择各类发布版本source或者binary.选择该方式往往是主机或者服务器的环境比较老旧,默认安装的gcc版本较低 - 默认安装:本平台默认使用了其他版本的安装方式,详见:`elegant_linux_design/qemu/arm64/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu` - 选定交叉编译工具目录后,配置qemu/armXX/export_env,如: ``` ARCH=arm64 CROSS_COMPILE=/home/user1/codes/elegant_linux_design/qemu/arm64/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu- ``` 如果是直接安装的方式,可以: ``` ARCH=arm64 CROSS_COMILE=aarch64-linux-gnu- ``` - 注意: - 配置CROSS_COMPILE选用选用绝对路径或者环境变量名 【arm】 - 直接安装方式:`sudo apt install libncurses5-dev gcc-arm-linux-gnueabi build-essential flex bison`,安装默认版本 ### 2.1.2 Qemu 环境 【aarch64】 - 直接安装方式:`sudo apt-get install qemu-system-aarch64` - 其他发布版本的安装:`https://download.qemu.org/`, 具体安装可以参考官网wiki。选用该方式,往往是主机或者服务器的环境比较老旧,默认安装版本较低。本平台默认支持较低版本qemu-2.9.1,如果你的平台ubuntu版本是14~16的,可以考虑直接使用该版本,不需要单独下载和编译(但不排除个别电脑环境的差异,该版本也不能运行)。 - 共享目录:为了方便调试,预编译的qemu支持虚拟机与主机的文件共享。如果读者使用的qemu无法通过`setup`脚本启动,可能需要基于源码配置: `./configure --enable-kvm --enable-virtfs --prefix=$PWD/out`,具体可以参考网上的资源,如:https://blog.csdn.net/gatieme/article/details/82912921 【arm】 - 直接安装方式:`sudo apt-get install qemu` ## 2.2 单独编译busybox 在qemu/armXX中依次执行: - Step1: `./config_busybox` - 选择静态编译:`Settings--->Build static binary(no shared libs)`,退出保存即可 - 结果:在busybox-1.35.0下面会生成`build_busybox_${ARCH}_out/.config`文件 - Step2: `./build_busybox` - 在当前目录下会生成ramdisk - 结果:在`build_busybox_${ARCH}_out`目录下生成_install目录,也就是busybox的最终生成结果 - 如果需要重新编译busybox(如修改其中的源码),需要删除`build_busybox_${ARCH}_out`目录 - Step3: `./make_ramdisk` - 用于在当前目录下生成ramdisk(rootfs) - 将Step2生成的_install的内容拷贝,并基于此通过该脚本补充其他所需文件或资源。 - 生成的ramdisk主要是用于根文件系统,用户的大文件不建议存放与此,可以选择共享目录的方式加载到系统。详见2.1.2说明 ## 2.3 单独编译kernel 在qemu/armXX中依次执行: - Step1: `./config_kernel` - 配置`General Settup-->Initramfs source file(s)`中回车,填入对应的rootfs路径,如:ramdisk64 - 结果:在kernel_out目录下产生.config配置文件,并生成制定的rootfs目录(如ramdisk64)。 - 如果仅通过该命令更新ramdisk,那么可以选择执行`./config_kernel nomenu` - 如果是arm(而不是aarch64),还需要选择: ``` //1:3布局虚拟内存空间 Kernel Features ---> Memory split(3G/1G) user/kernel split ---> [*] High Memory Support //使能内核log带有内核时间戳(也可以直接配置vexpress_defconfig的CONFIG_PRINTK_TIME=y) Kernel hacking ---> printk and dmesg options ---> [*]show timing information on printks - Step2: `./build_kernel` - 结果:产生kernel_out目录,编译所有built-in的驱动 注意: - 必须要先生成ramdisk才能编译kernel,因为在制作Image镜像时需要打包该目录内容 - 如果`qemu/armXX/ramdisk`有修改,需要重新执行`./config_kernel`,便于镜像打包文件的更新,否则单独执行该命令或者单独启动qemu,rootfs不会发生任何改变 ## 2.4 编译启动镜像 - 将ramdisk打包到内核镜像中 `./build_image` - 结果:在kernel_out/arch/armXX/boot/下生成qemu启动所需的镜像Image 注意: - 更新ramdisk的内容时,需要执行该脚本,便于同步镜像内容 ## 2.5 编译模块 - 可选,依赖build_kernel `./build_modules` - 结果:编译生成ko文件,同时会将linux源码配置成模块的所有的ko安装在`kmodules`目录下,该目录将通过`共享目录`形式供qemu使用。 ## 2.6 启动arm平台 `./setup arm` ## 2.7 启动arm64平台 `./setup arm64` - 注意:setup脚本中,默认使用prebuilt的qemu,如果使用host安装的qemu(直接安装方式),需要修改: ``` SETUP_QEMU=qemu-system-aarch64 ``` ## 2.8 退出qemu 键盘上执行`ctrl+A`,释放按键之后,单独输入 `x` 即可。