博客
关于我
编译Linux内核--制作文件系统--远程调试程序
阅读量:362 次
发布时间:2019-03-05

本文共 3326 字,大约阅读时间需要 11 分钟。

编译Linux内核

本次实验采用的时64位ubuntu14.04

下载Linux内核源代码

网址 https://www.kernel.org/pub/linux/kernel/v2.6/

解压缩
tar jvxf linux-2.6.33.7.tar.bz2
设置环境变量
export ARCH=arm export CROSS_COMPILE=arm-linux-gnueabi-

配置编译

1.配置内核 make versatile_defconfig

2.编译 make zImage
3.将编译出的zImage拷贝到顶层目录
cp arch/arm/boot/zImage …/zImage
4.在qemu-system-arm中启动Linux
qemu-system-arm -M versatilepb -m 128M -kernel zImage
注:未能成功,需要制作文件系统,后续介绍

busybox制作rootfs

简介

BusyBox 是一个集成了三百多个最常用Linux命令和工具的软件。BusyBox 包含了一些简单的工具,例如ls、cat和echo等等,还包含了一些更大、更复杂的工具,例grep、find、mount以及telnet。有些人将 BusyBox 称为 Linux 工具里的瑞士军刀。简单的说BusyBox就好像是个大工具箱,它集成压缩了 Linux 的许多工具和命令,也包含了 Android 系统的自带的shell。

下载

  1. 终端执行:

    wget http://busybox.net/downloads/busybox-1.27.2.tar.bz2

  2. 解压 tar jvxf busybox-1.27.2.tar.bz2

    3.创建rootfs目录

  3. 设置环境变量

    export ARCH=arm - export CROSS_COMPILE=arm-linux-gnueabi-

  4. 编译

    make defconfig
    make menuconfig

  5. Busybox Settings -> BusyBox installation prefix

    设置为 “…/rootfs”
    注:如果make menuconfig报错,请安装 libncurses5-dev

  6. 编译 make install

准备init文件

init简介

init是Linux系统操作中不可缺少的程序之一。所谓的init进程,它是一个由内核启动的用户级进程。内核会在过去曾使用过init的几个地方查找它,它的正确位置(对Linux系统来说)是/sbin/init。如果内核找不到init,它就会试着运行/bin/sh,如果运行失败,系统的启动也会失败。

内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式, 完成引导进程。所以init始终是第一个进程(其进程编号始终为1)。
创建init文件,写入内容
在这里插入图片描述
注:改变init文件权限 chmod +x init;

将rootfs目录打包成initramfs

创建文件initramfs 填入内容
在这里插入图片描述

配置linux内核

执行 make menuconfig

将Initial RAM filesystem and RAM disk(initramfs/initrd) support () Initramfs source files(s)
改为…/initramfs.list

重新编译并启动

qemu-system-arm -M versatilepb -m 128M -kernel zImage - append “noinitrd root=/dev/ram0”
在这里插入图片描述

设置账户

修改etc/init文件

在这里插入图片描述

创建文件

1.创建inittab文件写入:

在这里插入图片描述

2.创建rootfs/etc/init.d/rcS文件写入:

在这里插入图片描述

3.创建rootfs/etc/passwd文件写入:

在这里插入图片描述

4.修改initramfs.list文件写入

在这里插入图片描述

5.重新编译运行

qemu-system-arm -M versatilepb -m 128M -kernel zImage -append “noinitrd root=/dev/ram0”
login:root
Password:admin

6.登陆进入全功能shell

在这里插入图片描述

  1. 在裁剪的内核后,用QEMU模拟仿真的终端中执行一系列的操作,以及后续的程序调试与运行。

在编译好的内核中开发

工具

1.Crossing GCC

GNU Compiler’s Collection

2.Make

Make可以从一个名为makefile的文件中获得如何构建你所写程序的依赖关系,Makefile中列出了每个目标文件以及如何由其他文件来生成它。 当你编写一个程序时,你可以为它编写一个makefile文件,这样你就可以使用Make来编译和安装这个程序。
3.Vi/Emacs
即强大且著名的文本编辑器,给开发带来了诸多便利
4. GDB/GDB Server
调试工具 源码 https://ftp.gnu.org/gnu/gdb/gdb-7.6.tar.gz
解压并安装

编写程序和调试

1.安装

分别在host和目标板上安装gdb和gdbserver

2.调试

编译 arm-linux-gnueabi-gcc -static -g hello.c -o hello
编写一个简单的 hello.c文件:
#include “stdio.h”
void main(void)
{
printf(“hello world ! \n”);
printf(“nihao ! \n”);
printf(“hello world ! \n”);
}

修改配置

1.修改initramfs.list文件,在文件末尾添加:

file /usr/bin/gdbserver …/gdbserver 755 0 0
file /hello …/hello 755 0 0
2. 重新编译内核
make zImage
3. 启动
sudo qemu-system-arm -M versatilepb -m 128M -net nic -net tap,ifname=tap0 - kernel zImage -append “noinitrd”
4. 配置网络接口
ifconfig eth0 192.168.11.133(ifconfig查看主机ip)
Ping网关
ping 192.168.11.133

5 .在qemu系统中

cd /
gdbserver :12345 ./hello
等待host连接
6. 在host中
运行arm-linux-gnueabi-gdb
target remote 192.168.159.100:12345 #连接远端的gdbserver
symbol-file hello -----------#加载调试符号
b main ------------------------#在main处设置断点
c ------------------------------ #开始执行,程序停止在main()
s -------------------------------#单步运行
……
等进行程序调试

图5.2.2-1 在qemu中运行程序

在这里插入图片描述

小结

嵌入式linux 是将日益流行的Linux操作系统进行裁剪修改,使之能在嵌入式计算机系统上运行的一种操作系统。嵌入式linux既继承了Internet上无限的开放源代码资源,又具有嵌入式操作系统的特性。嵌入式Linux的特点是版权费免费;购买费用媒介成本技术支持全世界的自由软件开发者提供支持网络特性免费,而且性能优异,软件移植容易,代码开放,有许多应用软件支持,应用产品开发周期短,新产品上市迅速,因为有许多公开的代码可以参考和移植,实时性能RT_Linux Hardhat Linux 等嵌入式Linux支持,实时性能稳定性好安全性好。

转载地址:http://gwxg.baihongyu.com/

你可能感兴趣的文章
Vue01常见指令,axios
查看>>
Vue路由嵌套刷新后页面没有重新渲染
查看>>
Vue使用bus进行组件间、父子路由间通信
查看>>
数据库三个级别封锁协议
查看>>
操作系统:缓冲技术的相关介绍
查看>>
函数与指针分析、回调函数
查看>>
新型类型转换
查看>>
类的实例
查看>>
Java中数据类型和运算符
查看>>
PAT 锤子剪刀布
查看>>
tomcat加载部署webapps目录下的项目
查看>>
ACM/NCPC2016 C Card Hand Sorting(upc 3028)
查看>>
方法重写
查看>>
Threading Programming Guide(多线程编程指南)
查看>>
Swift--14类型扩展
查看>>
Socket通信原理和基础实践
查看>>
Java求逆波兰表达式的结果(栈)
查看>>
SDWebImage--http图片加载不出来的问题
查看>>
Application received signal SIGSEGV
查看>>
MySQL删除数据库时的错误(errno: 39)
查看>>