Linux 嵌入式开发
2011-06-24 21:25
================================================================================
现在用 openembedded 来进行 embedded linux 的编译配置,使用bitbake的时候,在命令
行运行 bitbake --help,出现一大堆错误最后提示 "ImportError: No module named ply"
这是有个python模块没有安装造成的,这个模块名是:python-py,安装就可以了
使用这个使令安装:sudo apt-get install python-ply,安装完成后再运行 bitbake 就没有问题了。
后如果执行*.py程序,遇到没有 xxx 模块,安装 python-xxx 就可以了,如
sudo apt-get install python-xxx
================================================================================
ubuntu安装directfb
先是启动了framebuffer,再启动的时候禁掉了图形图面,这个折腾了好久
启动framebuffer在文件尾有说到,不过ubuntu10.04跟8.04有所不同,还要装个什么v86d, fbi
还要在/etc/default/grub 里面写上要启动的图形模式,等
禁用gdm直接把 /etc/init/gdm和/etc/init.d/gdm.conf改个名好像就可以了。
编译安装directfb:
sudo apt-get install libpng12*
有几个库需要手动链接:
sudo ln -s /usr/lib/libfusion-1.2.so.0.8.0 /usr/lib/libfusion-1.4.so.5
sudo ln -s /usr/lib/libdirect-1.2.so.0.8.0 /usr/lib/libdirect-1.4.so.5
sudo ln -s /usr/lib/libdirectfb-1.2.so.0.8.0 /usr/lib/libdirectfb-1.4.so.5
Building cairo, 安装下面的库:
sudo apt-get install libpixman-1*
poppler
librsvg
Building ilixi
下面包版本要最新的
No package 'pangocairo' found --> glib
No package 'sigc++-2.0' found
No package 'libxml-2.0' found
================================================================================
在ilix-0.1.0/bin/Mastro.cpp的第844行,也就是调用了initFusion()后,就进进入 while(1) sleep(1);
这样再从命令行运行 ilixi_helloworld 就快多了。
可能是原来启动的东西太多导致一下子就很慢了。
不过就算是这样,相对来说也是慢的,那个滑块拖半天才动一点。
要么就是qemu-system-arm虚拟的 versatilepb cpu太慢??
用vmawre来虚拟一个linux,在上面安装directfb,ilixi,看看运行束度如何,再用这个来开发ilixi
用ubuntu编译源码时说:C compiler cannot create executables
是因为libc6-dev没装,装上去就好了
sudo apt-get install g++ libc6-dev
-----------------------------------------------------------
关于qemu黑屏的解释:
Unfortunately I have no experience on the RealView boards. I tried to compile the kernel
(both 2.6.33 and 2.6.34) like you did, only with CodeSourcery toolchain, and had the same
results you had. I noticed that, giving the option -cpu arm1136, it prints
“Uncompressing Linux... done, booting the kernel.” then stops.
You could do the following:
- Recompile the kernel with debugging symbols (the configuration should be in
“kernel hacking” section inside the kernel menuconfig)
- Launch QEMU with debugging enabled (“-s -S” to launch it stopped and waiting for GDB)
- Launch GDB with something like this (If you have ddd installed and your toolchain comes with gdb):
$ ddd --debugger arm-unknown-linux-uclibcgnueabi-gdb -- vmlinux
- Inside GDB:
(gdb) target remote localhost:1234
(gdb) b start_kernel
(gdb) c
- Try to debug step-by-step the kernel and understand what’s doing nasty things.
================================================================================
使用buildroot配置安装ilixi
下了个ilixi(http://www.ilixi.org/,基于directfb的窗口图形库),准备集成到 buildroot 里面安装,
可是出现了很多问题,首先是编译到directfb (directfb-1.4.11) 的时候说什么“kernel version too low, update please ...”
后来查看了一下代码发现是linux-fusion版本太低了,就换成最新的 linux-fusion-8.3.1 版本,再把原来
自带的旧版本补丁删掉了,重新编译OK了。
不过编译 linux-fusion-8.3.1 的同时,其写了依赖于linux26,挺郁闷的,把buildroot里面的kernel编译选项已选
上还是编译出错,后来想了想这个linux-fusion-8.3.1是内核的一个模块,可能要把模块加载功能也开启才可以吧,
于是在biuldroot下运行 "make linux-menuconfig" 把可以加载模块的功能选上,再编译,就没有再出问题了,编译OK。
不过运行的时候又出现了问题,就是运行 "dfbtest_window" 都出问题,提示以下错误:
///------------------------------------------------------------------------------------
(*) DirectFB/Core: Multi Application Core. (2011-06-10 16:58)
(*) Direct/Memcpy: Using libc memcpy()
(*) Fusion/SHM: Using MADV_REMOVE (2.6.33.0 >= 2.6.19.2)
(!) Direct/Util: opening '/dev/fusion/0' failed
--> No such device or address
(!) Fusion/Init: Opening fusion device (world 0) as 'any' failed!
--> No such device or address
(#) DirectFBError [DirectFBCreate() failed]: Initialization error!
///------------------------------------------------------------------------------------
原来是 /dev/fusion/0 这个设备文件没弄好,原来mknod创建了主设备号是253,后来又换到252还是不行,一看
linux-fusion-8.3.1的readme文档说是250,原来这个弄错了,于是改为250,再加载fusion模块 "modprobe fusion"
运行 dfbtest_window,又出现了下现错误
///------------------------------------------------------------------------------------
(*) DirectFB/Core: Multi Application Core. (2011-06-11 04:04)
(*) Direct/Memcpy: Using libc memcpy()
(*) Fusion/SHM: Using MADV_REMOVE (2.6.33.0 >= 2.6.19.2)
(!) Fusion/SHM: Could not find tmpfs mount point, falling back to /dev/shm!
(!) Fusion/SHM: Could not open shared memory file '/dev/shm/fusion.0'!
--> No such file or directory
(#) DirectFBError [DirectFBCreate() failed]: File not found!
///------------------------------------------------------------------------------------
于是手动建立了目录 "mkdir /dev/shm" , 再运行dfbtest_window就可以正常运行了。
不过运行ilixi_home命令的时候,出现了下面问题,目录 "/dev/shm" 存在的,还是有这个问题:
///------------------------------------------------------------------------------------
(*) Fusion/SHM: Using MADV_REMOVE (2.6.33.0 >= 2.6.19.2)
(!) Fusion/SHM: Could not find tmpfs mount point, falling back to /dev/shm!
(!) Fusion/SHM: Could not find tmpfs mount point, falling back to /dev/shm!
(*) Direct/Thread: Started 'Fusion Dispatch' (392) [MESSAGING OTHER/OTHER 0/0] <8388608>...
(!) Direct/Thread: Canceling 'Fusion Dispatch' (392)!
///------------------------------------------------------------------------------------
这个问题可能不是 "/dev/shm" 的问题了,应该是最后面的 "(!) Direct/Thread: Canceling 'Fusion Dispatch' (392)!"
这句引起的。
原来是用这个命令来启动的: ilixi_maestro --start
启动起来看到界面了,不过很慢,这是为么??
看来是directfb的问题,directfb原来的示例运行得也是很慢的
也不是dfb的问题吧,那些显示很多企鹅在动的那个就很快
一些df_**开头的都很快的
dfbtest_**这些就很慢了,看看是怎和么回事,看看代码有什么区别?
但是dfbtest_fillrect.c稍改了一下又显得很快了
那是ilixi代码的问题?是不是共享内存给得太少了呢??
看来确实是ilixi的代码有些问题,在ilix-0.1.0/bin/Mastro.cpp的第849行加个一个while(1);后
出现了个鼠标的背景图,鼠标现在可以移动得很快了,原来慢得不得了。
也许是用的资源太多,所以很慢了。
================================================================================
buildroot是个好东西,用来编译生成嵌入式linux根文件系统是最好不过了,只需要make menuconfig里面配置几下
后直接make,就所有东西都好了,buildroot会自动下载所有的包并自动生成好交叉编译所需要的工具,后再把rootfs需要
的包也下下来,全部一起编译完成,最好就得到rootfs.tar不,真是太方便了。
什么GTK, QT, X, mplayer等都包括进去了,太强大了。
接下来做个nfs来调试程序看看。
http://buildroot.uclibc.org
================================================================================
编译arm linux,在用qemu-system-arm运行时没有任何输出,屏幕黑黑的,可能是内核版本和编译器版本问题!
使用了下面的版本就又可以了:
linux-2.6.33
arm-2009q3-67-arm-none-linux-gnueabi.bin
试了别的还真的输出不了
.../linux-2.6.33/$ make ARCH=arm versatile_defconfig
.../linux-2.6.33/$ make ARCH=arm menuconfig #在这里选择一些配置,如framebuffer和eabi的支持
.../linux-2.6.33/$ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- all
.../linux-2.6.33/arch/arm/boot$ qemu-system-arm -M versatilepb -m 128M -kernel zImage
================================================================================
图形库:
DirectFB、QT、SDL、GTK
浏览器引擎:
WebKit
嵌入式Linux:设备上Bootloader、Kernel、RootFS、Driver、DirectFB、QT、MPlayer/GStreamer
QT界面
多媒体音视频
================================================================================
ubuntu 搜索相关包的名称,如只知道pcre这些字,搜索准确的相关安装包名字:
sudo apt-cache search pcre|grep dev
================================================================================
malloc, 堆和栈
堆(heap) 是的特征是比较散乱,可以动态的申请分配进程需的的内存空间,跟系统密切相关
栈(stack) 是后进先出,一层一层有有序叠放在一起的,用于函数调用时参数传递与返回地址的保存,和函数的一些
自动变量的临时存储。
================================================================================
grub加载linux内核,直接用硬盘作为最开始的根文件系统,其实只要把grub的memu.list写成下面就可以了:
title LINUX
root (hd0,0)
kernel /boot/bzImage ro root=/dev/hda1 rhgb vga=791 quiet
只要三行,就可以使用grub加载内核文件 /boot/bzImage 并令第一个分区作为最初始的根文件系统了。
但这样支持的分区格式可能会比较有限,因为内核不能太大所以不能把所有支持的文件系统都编译到内核里面去,
但是用用ext2自己作些试验也差不多了。
要高级些的些可以先加载内核和initrd.gz,通过initrd.gz加载放置于initrd里面的必要的模块和驱动后,
再把根文件系统切换到某一硬盘分区,这样就可以启动多一点的文件系统和模块,使内核体积减少。
================================================================================
下面的命令会死机,前面的冒号是函数名,后面的冒号是调用,递归调用,内存资源耗尽,导致死机
:(){ :|:; }; :
a(){ a|a; }; a
================================================================================
编译内核支持framebuffer, 在配置内核编译选项的时候把,drivers/graphics/framebuffer下面的选项全
选上就OK了
grub 1.98, 可以用“set gfxpayload=WIDTHxHEIGHTxCOLOR”来指定要开启哪种模式
================================================================================
vmware-mount hd.vmdk 0 initrd/k_mnt/
把当前目录下的hd.vmdk镜像的第0分区挂载到当前目录下的 initrd/k_mnt 下面
vmware-mount -L
查看已挂载的镜像
vmware-mount -d initrd/k_mnt/
umount镜像
可以先用qemu-img生成一个vmware的磁盘镜像,再用vmware从iso启动ubuntu并加载此磁盘镜像
在ubuntu时面格式化此img, 并安装好grub,后就可以用vmware-mount来挂载到linux下面了,
mount了之后就可以直接copy文件到img里面,并用qemu启动img,相当方便了
编译linux内核启动之
1) 编译linux kernel, 得到 bzImage
2) 安装grub到要启动的硬盘镜像上面,可以通过vmware启动ubuntu的iso, 通过此iso启动的ubuntu来格式化镜像,并安装grub
添加必要的grub.cfg
grub cfg:
linux /boot/bzImage root=/dev/sda1
initrd /boot/initrd.gz
3) 制作一个 initrd.gz 文件,这个是用来初始化系统的ram disk,对于一般系统这个ram disk是暂时的,初始
化完成后这个ram disk就被释放掉了,而对于嵌入式系统,这个ram disk则是至始至终都是存在于内存里面的。
4) 制作根文件系统,根据initrd.gz里面的初始化的需要来制作,可以放一些简单的命令和需要的程序在里面
framebuffer:
| 640x480 800x600 1024x768 1280x1024
----+-------------------------------------
256 | 0x301 0x303 0x305 0x307
32k | 0x310 0x313 0x316 0x319
64k | 0x311 0x314 0x317 0x31A
16M | 0x312 0x315 0x318 0x31B
==============================================================================
Ubuntu 8.04中启用FrameBuffer
打开/etc/initramfs-tools/modules文件,在末尾加上:
fbcon
vesafb
打开/etc/modprobe.d/blacklist-framebuffer,找到“blacklist vesafb”一行,在这一行前面加上“#”把它注释掉。
打开/boot/grub/menu.lst,找到相应的kernel一行,加上vga参数。例如我把分辨率设置为1024x768,对应的vga数值就是0x317。
kernel /boot/vmlinuz-2.6.22-14-generic root=UUID=3c51a0d7-d373-473b-830e-225b6d7aafdf ro quiet splash vga=0x317
最后执行:sudo update-initramfs -u更新,重启一下。
如果禁用了图形界面登陆,应该就能看到漂亮一些的字符界面了;
如果没有禁用,可以在桌面环境中按Ctrl+Alt+F1 ~ F6看看效果,按Ctrl+Alt+F7返回桌面环境。
禁用gdm图形,把/etc/init.d/gdm删掉就OK了,需要的时候再输入命令:startx
或ubuntu10.04: sudo mv /etc/init/gdm.conf ~
==============================================================================