实验七 Linux 内核移植

【实验目的】

掌握 Linux 内核配置和编译的基本方法

【实验环境】

  1. ubuntu 14.04 发行版
  2. FS4412 实验平台
  3. 交叉编译工具:arm-none-linux-gnueabi-

【注意事项】

  1. 实验步骤中以"$"开头的命令表示在 ubuntu 环境下执行,以"#"开头的命令表
    示在开发板下执行

【实验步骤】

  1. 在 Linux 官网下载 Linux 内核源码(这里我们下载 linux-3.14.tar.xz)
    https://mirrors.edge.kernel.org/pub/linux/kernel/v3.x/

  2. 拷贝内核源码包到 ubuntu 的家目录下,解压并进入其顶层目录

    复制代码
     $ tar xvf linux-3.14.tar.xz
     $ cd linux-3.14
  3. 源码并不知道我们的处理器架构及交叉编译工具是什么,我们自己在 Makefile 中指定

    复制代码
     $ vi Makefile

复制代码
	ARCH ?= $(SUBARCH)
	CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%)

修改为以下内容(注意后边不要有多余空格),然后保存退出

复制代码
	ARCH ?= arm
	CROSS_COMPILE ?= arm-none-linux-gnueabi- 
  1. 指定使用的处理器

    复制代码
    $ make exynos_defconfig

显示如下信息表示配置成功

  1. 进入内核配置界面

    复制代码
     $ make menuconfig

弹出如下图形化配置界面,在该界面下我们可以对 linux 进行进一步的修改和配置方向键可选择不同的选项,'Enter'键进入子菜单,'Y'键选中某项功能,'N'键去除某项功能,'M'键将该功能编译成内核模块,两次'Esc'键退出界面,'?'键为帮助选项,'/'键为搜索选项

注 1:若显示如下信息,是因为 ubuntu 上没有安装对应的图形库

执行如下命令安装对应的图形库,然后重新执行 make menuconfig 即可

复制代码
$ sudo apt-get install libncurses5-dev

注 2:若显示如下信息,是因为终端窗口太小,需将终端最大化后再执行

  1. 配置内核

    将'System Type'菜单下的'S3C UART...'修改为 2(即使用 UART2)

    复制代码
    System Type --->
    (2) S3C UART to use for low-level messages

设置完成后通过方向键选择'Save'保存即可,然后选择'Exit'退出该配置界面

  1. 编译内核(该过程可能需要二十分钟左右)

    复制代码
     $ make uImage

显示如下信息表示编译成功,即在源码的 arch/arm/boot/目录下生成了 uImage 镜像

注:如图所示,第一次在 ubuntu 上编译 Linux 内核会提示缺少一个 mkimage 命令

该命令可在 uboot 源码中 u-boot-2013.01/tools/目录下获取(必须是编译后的 uboot)

将该命令拷贝到 ubuntu 的/usr/bin 目录下即可正确编译内核

复制代码
$ sudo cp u-boot-2013.01/tools/mkimage /usr/bin/

给该命令添加可执行权限

复制代码
$ sudo chmod 777 /usr/bin/mkimage

完成后回到内核的顶层目录下重新编译内核即可

  1. 编译设备树

内核源码中并没有 fs4412 平台的设备树文件,这里我们从源码支持的平台中找一个硬

件与我们最类似的,在其基础上进行修改,这里我们参考的是 samsung 公司的 origen

拷贝 origen 的设备树并将其重命名

复制代码
$ cp arch/arm/boot/dts/exynos4412-origen.dts arch/arm/boot/dts/exynos4412-fs4412.dts

因为添加的设备树文件也要编译,所以对应的 Makefile 也要修改

复制代码
$ vi arch/arm/boot/dts/Makefile

复制代码
exynos4412-origen.dtb \

后添加如下内容,然后保存退出

复制代码
exynos4412-fs4412.dtb \

回到源码的顶层目录下编译设备树

复制代码
$ make dtbs

显示如下信息表示编译成功,即在arch/arm/boot/dts/目录下生成了exynos4412-fs4412.dtb

  1. 测试内核和设备树

将编译生成的内核和设备树拷贝到 tftp 的工作目录

复制代码
$ sudo cp arch/arm/boot/uImage /tftpboot
$ sudo cp arch/arm/boot/dts/exynos4412-fs4412.dtb /tftpboot/
$ sudo chmod 777 /tftpboot/* 

设置 uboot 的启动参数并保存

复制代码
	# setenv ipaddr ***.***.***.***
	# setenv serverip xxx.xxx.xxx.xxx
	# setenv bootcmd tftp 41000000 uImage\;tftp 42000000 exynos4412-fs4412.dtb\;bootm
	41000000 - 42000000
	# setenv bootargs root=/dev/nfs nfsroot=xxx.xxx.xxx.xxx:/opt/4412/rootfs/ rw
	console=ttySAC2,115200 init=/linuxrc ip=***.***.***.***
	# saveenv

注 1:xxx.xxx.xxx.xxx 为 ubuntu 主机的 ip,. .***.***为开发板的 ip,必须和 ubuntu主机的 ip 在同一个网段(根据自己电脑情况进行设置)
注 2:以上设置手动输入,命令粘贴可能会有中文符号

回到ubuntu重启 tftp 和 nfs 服务器

复制代码
	$ sudo service tftpd-hpa restart
	$ sudo service nfs-kernel-server restart

重启开发板查看现象,如图所示,内核在启动到一半时会崩溃卡死,原因在于我们在该

实验中只是对 UART 进行了配置,而其他功能都保持默认选项,内核默认配置中没选

配我们使用的网卡驱动. nfs 等功能,所以在挂载根文件系统时导致内核崩溃,所以后

续我们还需要配置网卡驱动. nfs 等

相关推荐
fishwww_ww11 分钟前
服务器免密登录与流量端口转发
linux
开开心心_Every2 小时前
解决打印机共享难题的实用工具
linux·b树·安全·游戏·随机森林·pdf·计算机外设
小小龙学IT2 小时前
Drizzle ORM:TypeScript 生态中冉冉升起的数据库工具链引言
javascript·数据库·typescript
江华森3 小时前
操作系统与 Linux 内核实战教程
linux·运维·服务器
ECT-OS-JiuHuaShan3 小时前
什么是对和错?——“有针对性定义域的逻辑值的真伪”:认识论终极追问的公理化裁决
数据库·人工智能·算法·机器学习·数学建模
乐维_lwops3 小时前
多类型数据库如何高效监控?
数据库·数据库监控·运维监控
齐潇宇3 小时前
Redis数据库基础
linux·数据库·redis·缓存
xixingzhe23 小时前
AI运维注意点
运维·人工智能
嵌入式学习和实践3 小时前
Ubuntu 系统 socat 详细介绍与使用教程 - 映射任意两种数据通道
linux·ubuntu·虚拟串口·数据映射·socat
大树884 小时前
PUE 超 1.35 要多交多少?存量机房液冷改造 3 张算账表
大数据·运维·服务器·人工智能