再战树莓派内核编译

最近想学习ARM9,板子还没到,先拿树莓派体验一下,以前看教程编译过一次,这一次想写的更加详细一点。

我不是技术的生产者,我只是技术的搬运工。

以下所有知识均来至网络上的高手分享的。

所有链接如下:

  1. http://blog.csdn.net/jinzheng_2010/article/details/8676213
  2. http://shumeipai.nxez.com/2013/10/04/raspberry-pi-kernel-module-development-helloword.html
  3. http://blog.csdn.net/shunbenben/article/details/8840140
  4. http://blog.csdn.net/liuquancheng/article/details/9009345
  5. http://bbs.csdn.net/topics/310127356
  6. http://blog.csdn.net/huang5556019/article/details/7192396

感谢前辈们的无私分享。

说一下用到的所有软硬件。

操作系统:Ubuntu15.04(64) win7(64)

树莓派:B+,Raspbian

FileZilla

开始:先看看树莓派IP

先看一下树莓派上要做的:

先烧好系统,把配置文件 复制到 /home/pi 路径下,顺便看看内核版本。

uname -a

sudo cp /proc/config.gz .

树莓派上要做的就这些,

看下Ubuntu 要做的 (用的最新版本 15.04 所以有些问题要解决)

先下载 树莓派 的 源码、工具和固件。

以下操作均在 root 权限下进行 注意 路径!!

在 /home/你的用户名 创建文件夹 名称自定

mkdir rpi

cd rpi

git clone git://github.com/raspberrypi/firmware.git PRiFirmware 固件

git clone git://github.com/raspberrypi/tools.git RpiTools 工具

wget https://github.com/raspberrypi/linux/archive/rpi-3.18.y.tar.gz

源码 刚才我们看到我们烧写的镜像也是3.18的 所以这里也下载3.18的

所有的工具源码下载完毕后,解压下载的源码

tarxvfz rpi-3.18.y.tar.gz

顺便换个名字

mv rpi-3.6.y RpiLinux

接下来把刚才备份的 配置文件 config.gz 复制到 Ubuntu上来

192.168.1.31 是我的树莓派IP

scp -p [email protected]:config.gz /home/liu/rpi/RpiLinux

下载后解压一下

zcat config.gz > .config

至此准备工作就差不多了

下面还要配置或者安装一下 编译必须的 库 因为Ubuntu是64位的

先安装一下 32位的 一些库

用来解决

arm-bcm2708hardfp-linux-gnueabi- menuconfig 找不到命令的错误

sudo apt-get install lib32z1 lib32ncurses5

然后解决 curses.h:No such file or directory 问题

安装 Ncurses

sudo apt-get install libncurses5-dev

所有准备工作完毕 可以编译内核了

先看看配置是不是正确

make ARCH=arm CROSS_COMPILE=../RpiTools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/arm-bcm2708hardfp-linux-gnueabi- menuconfig

编译的时候 顺便 添加一内核调用,然并卵 我也不知道具体操作但是体验一把 还是很必要的

/*****************************************************************************/

不需要的 跳过 这些

在RpiLinux/arch/arm/kernel/目录下新建mysyscall.c文件,输入以下内容

/arch/arm/kernel/calls.S中添加新的系统调用,

这里我替换的是原本为sys_ni_syscall的0×900000+223号系统调用,

这是因为223号是内核默认未使用的(/*Demo_liu*/)

修改arch/arm/kernel/目录下的Make?le文件,在obj-y后面添加mysyscall.o,

不需要的 跳过这些

/*****************************************************************************/

下面内核编译开始

make ARCH=arm CROSS_COMPILE=../RpiTools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/arm-bcm2708hardfp-linux-gnueabi- -j4

-j4 开启线程编译 加快编译速度

大概 30分钟

编译结束

查看一下

zImage 就是我们所编译获得的文件。zImage 是 Compressed kernel image 文件,要转换为 kernel.img 还需要进一步处理。

cd ../RpiTools/mkimage/

./imagetool-uncompressed.py ../../RpiLinux/arch/arm/boot/zImage

可以看到当前目录中多了kenrel.img文件

新的Kernel要正确运行,还需要编译所需的module,主要对应"/lib"目录下的内容。编译时,使用"INSTALL_MOD_PATH"参数指定目标路径。

cd ../..

mkdir modules

cd RpiLinux/

make modules_install ARCH=arm CROSS_COMPILE=../RpiTools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/arm-bcm2708hardfp-linux-gnueabi- INSTALL_MOD_PATH=../modules

树莓派断电 把内存卡 插到Ubuntu 的电脑上

挂载 SD卡

先看一下 文件系统

df –h

sudo mkdir /media/agu/SD

sudo mount /dev/sdb2 /media/agu/SD/

sudo umount /media/agu/SD

备份 Firmware

升级RPi的kernel、Firmware、lib

cd ..

mkdir backup

sudo mount /dev/sdb1 /media/agu/SD/

cd /media/agu/SD/

mv *.elf *.bin /home/liu/rpi/backup/

sudo cp /home/liu/rpi/RpiTools/mkimage/kernel.img kernel_new.img

cd /home/liu/rpi/RPiFirameware/boot

cp bootcode.bin fixup.dat fixup_cd.dat start.elf /media/agu/SD/

cd ../hardfp/opt/

sudo umount /media/agu/SD

sudo mount /dev/sdb2 /media/agu/SD/

将挂载点换成SD卡的第2分区,即"/"分区。

sudo cp -r vc/ /media/agu/SD/opt/

将新的vc库复制到SD卡,因为之前选用的工具链是hardfp(硬浮点),所以现在所选用的vc库也是硬浮点的版本(RPiFramware/hardfp/opt/vc)。

cd ../../..

sudo cp -r modules/lib /media/agu/SD/

下面修改一下 kernel_new. 的 文件名 替换一下

插到树莓派 运行 看看 内核 版本

自此内核编译成功。

下面我们看一下 刚才插入的 调用

编写测试程序调用新的系统调用:

看到调用成功 我测试了两次 所以有两个

顺便在Ubuntu 上 编译个模块 试试

写一个最简单的内核模块 hello.c, 这个内核只会在加载的时候输出 helo,word,移除时输出goodbye

在树梅派上找个地方新建一个目录,创建文件hello.c:

创建Makefile文件:

编译:

传到树莓派

运行:

结束 END

原文地址:https://www.cnblogs.com/liuyunxiang/p/8448184.html

时间: 2024-10-09 20:54:26

再战树莓派内核编译的相关文章

内核编译安装

以下讲的是内核基础.内核管理.安装编译内核.安装程序anaconda.kickstart. 1.内核基础 对于内核,现在有单内核和微内核设计,现在的内核多采用单内核和高度模块化设计,对于模块化设计,可以进行动态装卸载. 内核一般由三部分组成:内核核心文件.内核对象.ramdisk.内核核心文件,一般为bzImage,经过压缩处理的镜像文件,通常内核核心文件保存在/boot目录下,名称为vmlinuz-VERSION-release.内核对象,即内核额外的功能模块,该类文件放置于/lib/modu

Linux入门之CentOS7内核编译三部曲(1)

Linux入门之CentOS7内核编译三部曲(1) 我们知道,一个Linux系统的主要组成是由liunx内核核心和一些支持模块组合而成的.但是在某些场合中,需要某项功能,而当前内核的核心或者模块不支持此功能,那么就需要对内核进行一个升级或者重新编译内核添加相应的功能,以此提供了对此功能的支持. 编译前的准备 认识kernel 所为kernel,就是一种操作系统的核心,当然也是一个文件,而这种核心提供了对一些硬件的支持,一般来说其中包含了一些对常见硬件核心驱动的核心代码.启动系统时会通过加载MBR

Linux大脑 "内核" 内核编译(NTFS)

Linux大脑 "内核" 关于它 什么是内核 kernel(内核)是操作系统的核心,相当于人的大脑,掌控所有的硬件设备的控制权,也就是希望计算机帮你完成各项工作,那都需要通过内核的帮助才能完成,当然,如果你想实现的功能内核没有提供,那就必须添加相关的模块到内核中,就类似驱动程序,有了模块的支持我们计算机才能去操控硬件,完成我们想完成的工作 内核其实就是系统上面的一个文件,这个文件包含了驱动硬件的检测程序与驱动模块,内核文件在/boot目录下一个以vmlinuz开头的文件,有时候/boo

在阿里云中编译Linux4.5.0内核 - Ubuntu内核编译教程

实验环境:Ubnuntu 64位(推荐使用14.04)+Xshell 阿里云现在提供的云服务器很好用的,用来编译内核性能也不错.本文介绍最基本的内核编译方法,为了方便,所有操作均在root用户下进行. 如果不是root用户可以使用su命令切换到root用户. 注:使用xshell的时候最好把这一项给关闭了(工具——选项——高级) 一.环境准备 1.准备linux源码和补丁,可以在官网(http://www.kernel.org)上下载,这里我们下载4.5版本. 不过阿里提供了http://mir

linux内核编译,配置本机驱动

1.前言  编译linux内核失败的原因很多时候就是驱动选错,适合自己本机的驱动没编译进去.面对特殊平台(或者有些洁癖者,我就是^_^),要编译精简内核,只要本机驱动,其他都不需要.面对内核里面这么多驱动,不懂硬件的我们,看到都头大.本人第一次安装gentoo的时候,内核编译了5次,前4次主要失败原因是以太网卡驱动.无线网卡驱动.显卡驱动.声卡驱动都没一次性配置正确.虽然gentoo提供了genkernel命令,可以自动帮你编译内核,但还是想自己手工尝试下. 2.获取本机驱动信息 既然跟内核挂钩

Linux 2.6、4.3内核编译过程感受与总结

之前编译过2.4.10版本的内核,很好编译,中间曾经漏下了SCSI low-level drivers下的BusLogic SCSI support选项导致没法启动系统,后来打开该选项后就行了,随手关闭一些没用的选项后编译速度非常快,30秒之内完成编译.当初以为内核编译也不过如此,直到这四天开始编译更新的内核才让我吃了大亏. 我起初的想法是编译一个极其简洁的内核,去掉网络.USB.光驱.等等所有没必要的东西,只留下核心功能,越精简越好,于是在1月21号我就下载了linux-2.6.34.tar.

Linux入门之CentOS7内核编译三部曲(3)

Linux入门之CentOS7内核编译三部曲(3) 在上篇通过一些简单的例子和使用介绍了linux系统中模块的功能和作用.那么每次系统启动完成之后,又是怎么去自动加载所需要的模块,那么回过头来看还是要连续模块加载具体在系统启动中的哪个阶段开始触发的.同时模块的加载是依据内核本身的预定程序,还是linux文件系统中的相应配置文件呢? 默认安装的模块文件路径:/lib/modules/$(uname -r)/kernel,如: #查看内核模块列表目录 [[email protected] ~]# l

Linux内核编译与安装

平台:虚拟机Ubuntu10.04 内核版本:3.0.80 ---------------------------------------------------------------------------------------------------- 内核的编译分为两种:X86平台和ARM嵌入式平台 一.X86 平台:虚拟机Ubuntu10.04 内核版本:3.0.80 1.下载(并安装)源码:linux-3.0.08 https://www.kernel.org/pub/linux/

[原创]Nexus5 内核编译烧录过程记录

参考Android系统源代码情况分析第二章进行实践,为了提高效率,也为了增加实践机会,使用Nexus5进行内核编译.需要说明的是,Android源代码工程默认是不包含它所使用的Linux内核源码,如果需要运行定制的Linux内核,就要单独下载内核源码,并且对它进行编译.Nexus Android源码的编译参考 1.下载nexus5 对应的内核源码 Android系统使用的是Linux内核,但与主线分枝的Linux内核又有一些差异,各个不同的厂商又有自己的修改.内核源码位于谷歌境外服务器,不FQ无