最近想学习ARM9,板子还没到,先拿树莓派体验一下,以前看教程编译过一次,这一次想写的更加详细一点。
我不是技术的生产者,我只是技术的搬运工。
以下所有知识均来至网络上的高手分享的。
所有链接如下:
感谢前辈们的无私分享。
说一下用到的所有软硬件。
操作系统: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 pi@192.168.1.31: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