今年32岁多一点,以前接触过linux,但是没有实战经验,停留在写个简单的c函数编译一下这样。
最近当了爸爸,感觉花钱的地方会越来越多,自己的知识体系也要更新了,于是找出了几年前买的forlinx的开发板,尝试着从学习入门,现在就把这段时间的学习经历总结下来,给自己留个学习记录,顺便能帮到别人就更好了。
1 安装vmware station
这个没什么好说的,使用的是ver14 的版本,虚拟机工具什么的都带了,遇到的困难就是我的笔记本是4G的内存,win7系统,感觉跑起来有点卡,尤其是在后面安装了ubuntu之后更是明显。
2 安装ubuntu
怎么说这个过程呢,就是欠抽的过程。开发板带了个9.10 32位的系统,安装后,更新软件失败的太多,于是找了个朋友问下,朋友推荐了14.10的版本,这个好多了,许多软件都可以更新了,于是我开始按照开发板给出的指导手册倒腾着安装vi gcc arm-linux-gcc,在安装nfs系统时,失败了,一直提示缺少安装库。百度后找到了好多源列表开始更新,还是失败了,问朋友,喷狗无解。看到网上说这个版本不是LTS的版本,我想应该是没有提供更新维护,已经不能用了。于是,刚好看到除了最新的18版本,下载镜像,开始倒腾。可是这个beta版本是有问题的,我在使用vm的共享文件时,ubuntu检测不到共享文件夹。于是,下载掉这个版本,这次不敢再瞎折腾了,下载了16.04 LTS的版本,并在这个版本上继续我的学习之路。
总结下:太盲目了,没有了解ubuntu的版本,随意安装,对于初学者来说,花费大量时间倒腾这个东西,还不如老老实实的找个好版本来学习。
3 安装ftp
看到了网上有许多文件共享的方式和工具,但是教程上写的是ftp,那就按照这个来,在16.04LTS上安装ftp还是很顺利的,但是在修改属性文件时就头疼了,按照网上的步骤来,参考教程配置属性文件。还是失败了,主机和板子不能ping通。
百度后得到以下几个问题:
1 win7的防火墙没有关闭
2 ubuntu的上网方式不对
3 虚拟机的配置不对
4 属性文件配置不对
关掉防火墙,将dhcp方式获取网络地址改为手动分配,ubuntu在系统设置中修改网络地址有时是失败的,只好用ifconfig来搞,最后检查虚拟机网络连接方式(桥接)和属性文件(允许读写)
成功了。
4 安装nfs
nfs的目的是能够共享文件系统,按照教程来,基本没有遇到问题,学会了source exportfs两个命令,最后因为对mount命令的不理解,一直挂载不进去。。。
5 编译内核
这里按照教程来,基本不会出错,但是有个问题必须提出来,并且我也做了详细的记录
root@ubuntu:/forlinx/linux-3.0.1# make zImage
CHK include/linux/version.h
CHK include/generated/utsrelease.h
make[1]: 'include/generated/mach-types.h' isup to date.
CALL scripts/checksyscalls.sh
CHK include/generated/compile.h
TIMEC kernel/timeconst.h
Can't use 'defined(@array)' (Maybe you shouldjust omit the defined()?) at kernel/timeconst.pl line 373.
/forlinx/linux-3.0.1/kernel/Makefile:140:recipe for target 'kernel/timeconst.h' failed
make[1]: *** [kernel/timeconst.h] Error 255
Makefile:947: recipe for target 'kernel'failed
make: *** [kernel] Error 2
出现了这些错误,有人说是交叉编译器的位置错误,所以将Makefile中做了如下修改
export KBUILD_BUILDHOST := $(SUBARCH)
ARCH := arm
CROSS_COMPILE :=/usr/local/arm/4.3.2/bin/arm-linux-
#CROSS_COMPILE ?=$(CONFIG_CROSS_COMPILE:"%"=%)
没有解决问题,直到看到了这个文章
因为perl版本升级,取消了一些语法格式
在/timeconst.pl中的373行语句改成这样就可以了
https://www.cnblogs.com/asulove/p/6039907.html
0、开发环境
Ubuntu16.04.1(64bit)
linux-2.6.32.4
1、错误描述
使用ubuntu14.04(64bit)编译linux2.6.32.4并没有出现什么错误,但是使用ubuntu16.04.1(64bit)编译linux-2.6.32.4时,却提示Can't use 'defined(@array)' (Maybe youshould just omit the defined()?)错误。
2、解决方法
参考:编译kernel perl版本bug
最近升级了一下MAC系统,突然发现android的Linux kernel无法编译通过了,报了如下错误:
Can't use 'defined(@array)' (Maybe youshould just omit the defined()?) at kernel/timeconst.pl line 373.
其实,提示的错误信息已经明确告诉你了,你应该省略defined().
这里,我们打开 kernel/timeconst.pl
@val = @{$canned_values{$hz}};
if (defined(@val)) {
@val = compute_values($hz);
}
output($hz, @val);
将if (defined(@val)) 改为if (@val),再次编译就可以通过了。
查了一下更新,发现其中有一项是perl版本升级到了 v5.22.1,然后查了perl官方文档,发现官网因为一个bug,该版本将defined(@array)去掉了。可以直接使用数组判断非空。
问题解决了。下面我会继续学习其他的东西。
本人目前是做arm的嵌入式软件开发,所以想在嵌入式linux方向上发展,学习方法还不太明确,欢迎大家提出建议和意见。