2009年2月26日星期四

android kernel 的toolchain

有两套toolchain可以编译android kernel。

在fedora 9上装Cell SDK 3.1

在IBM网站上下载SDK包 选择SDK 3.1 for Fedora 9 from developerWorks
需要注册用户。
先装SDK installer
rpm -ivh cell-install-3.1.0.0.0.noarch.rpm
接下来执行
/opt/cell/cellsdk --iso /your path of sdk install
确认安装
/opt/cell/cellsdk verify



让vim显示行尾的空格

fedora 9系统下
在/etc/vimrc文件添加如下两行
highlight WhitespaceEOL ctermbg=red guibg=red
match WhitespaceEOL /\s\+$/

2009年2月25日星期三

ARM ADR 伪指令用法

ADR指令用来获取操作数的地址。比如
ADR r4,b ; 取b的地址,放到r4中
LDR r0,[r4] ; 取b的值,放到r0中

2009年2月24日星期二

make xxx Is a directory. Stop. 的原因

编译内核时候的一个错误提示
make: ***    arm/kernel.git/arch/arm: Is a directory.  Stop.

这个错误是由在Makefile的 
ARCH ?= $(SUBARCH)
这行的后面多了一个空格造成的。
所以,在编辑Makefile时候,每行结尾,一定要确认没有空格,直接是换行。

2009年2月19日星期四

为linux建立最小的根文件系统

在编译内核时候,可以指定一个文件夹作为内核启动时候的根文件系统,linux中管这个文件系统叫做initramfs。

具体做法如下(以i386为例)

1.下载内核文件

  wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.26.tar.bz2

2.解压内核

   bzip2 -d linux-2.6.26.tar.bz2  生成一个linux-2.6.26.tar文件,然后

   tar xvf linux-2.6.26.tar 

   解压后,将有个linux-2.6.26文件夹存在

3.准备一个iniramfs文件系统的文件夹

  在linux-2.6.26文件夹下建立一个文件夹 myinitramfs

   写一个测试用的hello world,起名为hello.c,如下:

  #include

  #include

  int main(int argc,char *argv[])

  {

     int i = 0;

     while (1) {

      printf("hello world (%d)\n",i);

     }

    return 0;

   }

  编译  gcc -static -o init hello.c

  把init拷贝到myinitramfs文件夹下。

  cp init myinitramfs/

  由于需要显示文字,还需要在文件夹下准备console设备文件。

  mkdir myinitramfs/dev

  cp -a /dev/console myinitramfs/

4.编译内核

   在linux-2.6.26文件下下,执行make help。

   将看到很多帮助信息,其中有一项是 i386_defconfig

   执行 make i386_defconfig,将生成一个.config文件。

   为了把之前准备好的文件夹添加到内核配置文件中,还需要重新配置下config文件

   make config

    在 General Setup --->

    Initial RAM filesystem and RAM disk (initramfs/initrd) support (BLK_DEV_INITRD) [Y/n/?]

     Initramfs source file(s) (INITRAMFS_SOURCE) [myinitramfs]

   处,输入准备好的文件夹.

    配置好后,在.config文件中会有如下一条定义

   CONFIG_INITRAMFS_SOURCE="myinitramfs"

   保存.config

   make 编译内核

5.用qemu测试内核和initramfs

   qemu -kernel  linux-2.6.26/arch/i386/boot/bzImage  -initrd linux-2.6.26/usr/initramfs_data.cpio.gz  /dev/zero

   initramfs_data.cpio.gz 这个文件是内核自动生成的,具体名字可能不同的系统或者内核有差异,但是后缀应该是.cpio.gz