社区导航

 

搜索
查看: 17676|回复: 32

[经验] BB Black入门基础之内核的编译

[复制链接]

1739

TA的帖子

24

TA的资源

五彩晶圆(初级)

Rank: 7Rank: 7Rank: 7

发表于 2013-12-30 19:39 | 显示全部楼层 |阅读模式
本帖最后由 lonerzf 于 2013-12-31 14:47 编辑 首先说明下: 1 还有些问题没有解决。需要论坛里边广大兄弟姐妹们一起解决。 2 建议新建一个统一的文件夹,统一管理uboot、kernel、交叉编译工具等。 开始正文 首先是交叉编译器的下载。不要客气,我已经下载好了。 不想去原网站下的就下这个: gcc-linaro-arm-linux-gnueabihf-4.8复制到自己的文件夹下,并后解压出来
  1. tar xJf gcc-linaro-arm-linux-gnueabihf-4.8-2013.10_linux.tar.xz
复制代码
接着是添加环境变量 btw,我自己一直用的这种方式,但不能保证绝对没有问题。为防止系统损坏,还需要事先备份。如遇到重启后不能登录图形界面的情况,进入命令行模式恢复修改的文件即可。 接着咱们还得再装一个文件压缩程序。当然了,也可以先不安装,不过编译内核的时候会报错,到时根据提示再安装也行。
  1. apt-get install lzop
复制代码
现在开始uboot跟kernel的编译了。 首先下载对应的Uboot并安装mkimage
  1. cd /home/zhao/Desktop/zhao/uboot
  2. wget ftp://ftp.denx.de/pub/u-boot/u-boot-latest.tar.bz2 下载U-boot
  3. tar -xjf u-boot-latest.tar.bz2
  4. cd u-boot-2013.10
  5. make tools
  6. sudo install tools/mkimage /usr/local/bin 安装mkimage工具
复制代码
接着上github网页。找到BB Black的内核工程。可以在Github网站上下载。 我找到了这个 https://github.com/beagleboard/kernel/tree/3.8 a.png 看看是否咱们需要的。貌似这个挺好,就它了。 注意:下载这个内核文件有些耗时,这时候你可以吃点东西睡个觉,大约半个小时后就下好了。中途不可中断。 开始下载。 进入要存放BB Black内核的目录(比如我这新建了一个叫kernel的文件夹)。
  1. cd kernel 进入目录 .../kernel/
复制代码
  1. git clone git://github.com/beagleboard/kernel.git 下载内核
复制代码
  1. git checkout 3.8 检查预编译镜像标签是否为3.8。
复制代码
  1. ./patch.sh 打补丁
复制代码
  1. cp configs/beaglebone kernel/arch/arm/configs/beaglebone_defconfig 复制我们需要编译的配置文件beaglebone
复制代码
  1. wget http://arago-project.org/git/projects/?p=am33x-cm3.git\;a=blob_plain\;f=bin/am335x-pm-firmware.bin\;hb=HEAD -O kernel/firmware/am335x-pm-firmware.bin
复制代码
好了,这时候ls 查看你的kernel目录,是不是又有个kernel目录了? b.png 行,进入kernel目录
  1. cd kernel .../kernel/kernel/
复制代码
接着正式编译内核文件,按以下顺序进行操作
  1. make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- beaglebone_defconfig
  2. make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- uImage dtbs
  3. make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- uImage-dtb.am335x-boneblack
  4. make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules
复制代码
上述过程还需要等待大约1小时(我的机子也就中等配置,时间长短你们自己计算吧) 完成后进入boot目录收获你的编译成果。
  1. cd arch/arm/boot
复制代码
c.png 然后把这里边的文件全部拷贝到上次我们说过的tftp服务器根目录下。不清楚的请点这里 BB Black入门基础之TFTP与minicom的安装
  1. sudo cp -rf * /home/zhao/desktop/zhao/tftpboot/
复制代码
上面的工作都做完了以后就可以吧BB Black内核镜像通过tftp传到BB Black上运行了。 方便起见,我进入tftp根目录并重命名uImage-dtb.am335x-boneblack文件。
  1. mv uImage-dtb.am335x-boneblack uImage-BBB
复制代码
再制作成内核镜像文件
  1. mkimage -l uImage-BBB
复制代码
打开minicom,给BB Black上电并多按几下空格。 这时候进入uboot了吧? u.png 再按下面的顺序操作
  1. setenv autoload no
  2. dhcp 获取BB Balck的IP
  3. setenv serverip 192.168.1.168 假定我宿主机的IP地址是 192.168.1.168
  4. tftp 0x80200000 uImage-BBB 注意地址一定要是0x80200000
  5. setenv bootargs console=ttyO0,115200n8 quiet root=/dev/mmcblk0p2 ro rootfstype=ext4 rootwait
  6. bootm 0x80200000 从该地址引导内核镜像文件
复制代码
v.png 然后就是该干嘛干嘛了,跟你之前的操作一样。如果出现了登录界面,恭喜,那就算成功了。 好了,问题来啦。我自己写了个hell.c的简单内核驱动#include /* Needed by all modules */ #include /* Needed for KERN_INFO */ #include /* Needed for the macros */ static int __init hello_start(void) { printk(KERN_INFO "Loading hello.ko module...\n"); printk(KERN_INFO "Hello world\n"); return 0; } static void __exit hello_end(void) { printk(KERN_INFO "Goodbye: hello.ko exiting...\n"); } module_init(hello_start); module_exit(hello_end); MODULE_DESCRIPTION("Example kernel module based on many sources on the internet."); MODULE_AUTHOR("am0802"); MODULE_LICENSE("GPL"); 编译也没错,安装如下(类似insmod 方法)
  1. # depmod
  2. # modprobe hello
复制代码
安装不报错但是没有打印出内容。这非常奇怪。 大家有兴趣的可以一起想想这是为什么,怎么解决。 还是那句话,咱们都是初学者,欢迎交流,欢迎指导。
这孩子,成熟的象征,理智的典范。


回复

使用道具 举报

1739

TA的帖子

24

TA的资源

五彩晶圆(初级)

Rank: 7Rank: 7Rank: 7

 楼主| 发表于 2013-12-30 19:49 | 显示全部楼层
不好意思,帖子貌似有点问题,怎么改代码都显示不出来。
环境变量的修改:

#vim ~/.bashrc
最后一行添加PATH=$PATH:/opt/LON/gcc-linaro-arm-linux-gnueabihf-4.8-2013.10_linux/bin (根据自己目录修改)

对于普通用户
# vim /etc/environment
添加路径并保存。

修改之后 source /etc/environment
就可以生效了。

今天那就到这里吧,就到这里。
这孩子,成熟的象征,理智的典范。


回复

使用道具 举报

27

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2013-12-31 11:28 | 显示全部楼层
我先顶起  正发愁怎么搞呢 楼主你就是黑暗中的灯塔


回复

使用道具 举报

27

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2013-12-31 11:29 | 显示全部楼层
楼主  能把你的《交叉编译环境的下载安装》 这个给整理一下贴出来吗

点评

我是整理了,不过论坛发布出来后的东西全乱了。这就没办法啦,亲。  详情 回复 发表于 2013-12-31 12:20


回复

使用道具 举报

1739

TA的帖子

24

TA的资源

五彩晶圆(初级)

Rank: 7Rank: 7Rank: 7

 楼主| 发表于 2013-12-31 12:20 | 显示全部楼层
wk123 发表于 2013-12-31 11:29
楼主  能把你的《交叉编译环境的下载安装》 这个给整理一下贴出来吗

我是整理了,不过论坛发布出来后的东西全乱了。这就没办法啦,亲。
这孩子,成熟的象征,理智的典范。


回复

使用道具 举报

27

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2014-1-4 15:39 | 显示全部楼层
setenv bootargs console=ttyO0,115200n8 quiet root=/dev/mmcblk0p2 ro rootfstype=ext4 rootwait 楼主 这句能给解释一下嘛 谢谢

点评

bootargs在环境变量中很重要。console=ttyO0表示使用内核串口驱动。115200n8 就不用过多解释了吧,就串口的配置而已。root=/dev/mmcblk0p2 表示根分区存放在这个块当中,你可以登陆后用fdisk -l查看到底是什么。ro R  详情 回复 发表于 2014-1-5 17:55


回复

使用道具 举报

1739

TA的帖子

24

TA的资源

五彩晶圆(初级)

Rank: 7Rank: 7Rank: 7

 楼主| 发表于 2014-1-5 17:55 | 显示全部楼层
本帖最后由 lonerzf 于 2014-1-5 17:56 编辑
wk123 发表于 2014-1-4 15:39
setenv bootargs console=ttyO0,115200n8 quiet root=/dev/mmcblk0p2 ro rootfstype=ext4 rootwait 楼主 这 ...

bootargs在环境变量中很重要。console=ttyO0表示使用内核串口驱动。115200n8 就不用过多解释了吧,就串口的配置而已。root=/dev/mmcblk0p2 表示根分区存放在这个块当中,你可以登陆后用fdisk -l查看到底是什么。ro ReadOnly。rootfstype=ext4 文件系统的类型,注意如果不匹配根分区就会挂载不上去。当文件系统不是立即可用的时候,就需要rootwait了。它会提供无限期的等待,但是并不是任何情况都需要用到这个参数。有时候你可能会运行备份的系统,那就不能用这个参数了。类似的还有rootdelay,它用于告诉内核当设备不是立即可用的时候不要马上放弃。差点忘了,还有quiet,用了quiet,那么就只有重要和关键的内核信息会打印到控制台。如果想看到更多内核信息,使用debug参数。

不知道这个答案你还满意不?

点评

嗯 哈哈 谢谢楼主  详情 回复 发表于 2014-1-8 20:38
这孩子,成熟的象征,理智的典范。


回复

使用道具 举报

95

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2014-1-6 21:20 | 显示全部楼层
系统日志可能有打印的内容 tail /var/log/messages

点评

哈哈,谢谢。  详情 回复 发表于 2014-1-7 09:11


回复

使用道具 举报

1739

TA的帖子

24

TA的资源

五彩晶圆(初级)

Rank: 7Rank: 7Rank: 7

 楼主| 发表于 2014-1-7 09:11 | 显示全部楼层
wbhb2011 发表于 2014-1-6 21:20
系统日志可能有打印的内容 tail /var/log/messages

哈哈,谢谢。
这孩子,成熟的象征,理智的典范。


回复

使用道具 举报

27

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2014-1-8 20:38 | 显示全部楼层
lonerzf 发表于 2014-1-5 17:55
bootargs在环境变量中很重要。console=ttyO0表示使用内核串口驱动。115200n8 就不用过多解释了吧,就串口 ...

嗯  哈哈 谢谢楼主


回复

使用道具 举报

729

TA的帖子

0

TA的资源

纯净的硅(中级)

Rank: 5Rank: 5

发表于 2014-1-9 11:59 | 显示全部楼层
真详细,谢谢楼主,好东西!


回复

使用道具 举报

1368

TA的帖子

18

TA的资源

五彩晶圆(初级)

Rank: 7Rank: 7Rank: 7

发表于 2014-1-9 12:05 | 显示全部楼层
这个需要MARK一下!哈哈!


回复

使用道具 举报

142

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2014-1-10 08:43 | 显示全部楼层
好棒的,我按照文中的操作成功了!

点评

恭喜恭喜,可惜我的账号这几天发不了帖子了。暂时就不能分享经验啦。  详情 回复 发表于 2014-1-11 15:26


回复

使用道具 举报

1739

TA的帖子

24

TA的资源

五彩晶圆(初级)

Rank: 7Rank: 7Rank: 7

 楼主| 发表于 2014-1-11 15:26 | 显示全部楼层
651927693 发表于 2014-1-10 08:43
好棒的,我按照文中的操作成功了!

恭喜恭喜,可惜我的账号这几天发不了帖子了。暂时就不能分享经验啦。
这孩子,成熟的象征,理智的典范。


回复

使用道具 举报

24

TA的帖子

4

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2014-1-14 11:43 | 显示全部楼层
楼主,为啥我的kernel中找不到beaglebone_defconfig文件

点评

啊? 你确定是 .../kernel/kernel/ 这个目录吗?  详情 回复 发表于 2014-1-14 13:25


回复

使用道具 举报

1739

TA的帖子

24

TA的资源

五彩晶圆(初级)

Rank: 7Rank: 7Rank: 7

 楼主| 发表于 2014-1-14 13:25 | 显示全部楼层
gwj221 发表于 2014-1-14 11:43
楼主,为啥我的kernel中找不到beaglebone_defconfig文件

啊? 你确定是 .../kernel/kernel/ 这个目录吗?

点评

我也找不到beaglebone_defcinfig,确定是在这个目录,楼主帮帮忙啊,这问题卡着好久了  详情 回复 发表于 2015-3-12 11:03
这孩子,成熟的象征,理智的典范。


回复

使用道具 举报

90

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2014-7-11 10:06 | 显示全部楼层
i know ,tks!


回复

使用道具 举报

6

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2014-7-18 10:40 | 显示全部楼层
楼主 我在编译内核时最后结果 Kernel: arch/arm/boot/zImage is ready
  UIMAGE  arch/arm/boot/uImage
Image Name:   Linux-3.8.13-00729-g31d1776
Created:      Fri Jul 18 10:28:48 2014
Image Type:   ARM Linux Kernel Image (uncompressed)
Data Size:    4301088 Bytes = 4200.28 kB = 4.10 MB
Load Address: 80008000
Entry Point:  80008000
  Image arch/arm/boot/uImage is ready
这个load Address和内核镜像引导地址0x80200000是否有联系?

点评

不是应该从0x80200000启动吗? 内核地址从0x80200000开始加载啊。  详情 回复 发表于 2014-7-18 14:14


回复

使用道具 举报

1739

TA的帖子

24

TA的资源

五彩晶圆(初级)

Rank: 7Rank: 7Rank: 7

 楼主| 发表于 2014-7-18 14:14 | 显示全部楼层
本帖最后由 lonerzf 于 2014-7-18 14:30 编辑
zhaoshu 发表于 2014-7-18 10:40
楼主 我在编译内核时最后结果 Kernel: arch/arm/boot/zImage is ready
  UIMAGE  arch/arm/boot/uImage
I ...

不是应该从0x80008000启动吗? 内核从0x80200000地址开始加载啊。

哦,我可能明白你的意思了。
比如,tftp 0x80200000 uImage-BBB 表明这是镜像存放地址。之前空间用来做引导、时钟配置、内存复制等工作的。
不知道解释地对不对。也没有查到相关资料,其他论坛上也没具体说明的。


点评

我也不知道还没烧写试试,但又出错了。make ARCH=......models 时结果没通过 CC [M] net/wireless/regdb.o net/wireless/regdb.c:1551:1: error: expected expression before â  详情 回复 发表于 2014-7-18 14:54
这孩子,成熟的象征,理智的典范。


回复

使用道具 举报

6

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2014-7-18 14:54 | 显示全部楼层
本帖最后由 zhaoshu 于 2014-7-18 15:04 编辑
lonerzf 发表于 2014-7-18 14:14
不是应该从0x80008000启动吗? 内核从0x80200000地址开始加载啊。

哦,我可能明白你的意思了。

我也不知道还没烧写试试,但又出错了。make ARCH=......modules 时结果没通过
CC [M]  net/wireless/regdb.o
net/wireless/regdb.c:1551:1: error: expected expression before â

点评

错误见看图,uImage都编译出来了 这一步是做什么的。出错了怎么办呢  详情 回复 发表于 2014-7-18 15:02


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 1/8 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

词云| Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-7-10 14:12 , Processed in 0.577062 second(s), 41 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表