Chinaunix首页 | 论坛 | 博客
  • 博客访问: 349019
  • 博文数量: 120
  • 博客积分: 4010
  • 博客等级: 上校
  • 技术积分: 1810
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-11 17:50
文章分类

全部博文(120)

文章存档

2008年(120)

我的朋友

分类:

2008-04-23 14:28:16

 [转帖]uCLinux FAQs
发信人: Atari (行胜于言), 信区: Embedded
标  题: uclinux FAQ 
发信站: BBS 水木清华站 (Tue May 25 21:49:51 2004), 站内

以前总结的一点东东,希望对大家有用,还可以继续补充。 其实问题的答案都在源码里。

附录 - uCLinux FAQs

Q: 请问uclinux启动时最先执行哪一个程序文件中的代码?
A: 如果是不压缩的内核,则执行 linux-2.4.x/arch/armnommu/kernel/head-armv.S
    如果是压缩的内核,则先执行解压的程序
        linux-2.4.x/arch/armnommu/boot/compressed/head.S
    当然,如果是其他的 arch ,应该可以依此类推。

Q: 程序在 ram 中运行和在 rom 中运行有什么不同?
A: 至少有以下这些情况是需要 ram 的 :
    程序中定义了全局变量,并进行了赋值。 例如 int a;  a = 1;
    程序中进行了函数调用,使用了堆栈。 例如 function();
    在函数内部使用了局部变量,同样也会使用堆栈。 例如 void f() { int a = 5; }
    程序中对某内存地址进行了写操作。例如 str r1, [r2];   *paddr = 1;
    如果一个程序没有上面的这些,那么 rom 中也是可以跑的,比如点led的小汇编。

Q: uclinux中,与具体的cpu相关的代码都分布在哪几个目录中?
A: 以 Samsung 4510B 为例,以下目录的相关文件比较重要。
    uClinux-Samsung\linux-2.4.x\arch\armnommu\mach-samsung\*        芯片级
    uClinux-Samsung\vendors\Samsung\4510B\makefile      如何生成 image, romfs
    uClinux-Samsung\linux-2.4.x\drivers\char\serial_samsung.c       串口驱动
    uClinux-Samsung\linux-2.4.x\include\asm-armnommu\arch-samsung   头文件定义

Q: 编译之后在 images 目录下生成的那些文件都是什么意思?
A: 对于一些可能出现的文件,这里做一个解释:
romfs.img:  这个文件是通过 tools/romfs-inst.sh 脚本,生成 romfs 目录及其
            下面的文件,然后通过 genromfs 程序打包成一个文件 romfs.img
            romfs.img 既可以放在 flash 中,也可以放在 ram 中,但需要在
            编译内核时在 driver/block/blkmem.c 里指定地址,以便内核找到。
linux.text: 编译后的内核中 text 段,一般放在 flash 中,只读。
linux.data: 编译后的内核中 data,init 段,一般放在 sdram 中,读写。
image.bin:  上面三个文件顺序连接而生成的 = linux.text + linux.data + romfs.img

有的时候还会得到:
image.rom: 
    通常 image.rom 的文件大小要比 image.ram 小很多,这是因为 image.rom 是
    一个压缩过的内核,前面加上一个小的解压程序负责把内核解压后搬到指定位置。
    这个文件可以直接烧进 flash 中,当然也可以在 ram 中运行。这个文件实际上
    就是通常 linux 生成的 zImage 文件。

image.ram:  
    这个内核没有压缩过,而且必须在 ram 里运行。所以需要通过板子上的 bootloader
    将它下载到指定位置后开始执行。相对 image.rom 而言,从 ram 里启动内核,则
    代码段和数据段都在 ram 里面。这个文件是编译生成的 elf 格式的linux内核,通过
    arm-elf-objcopy 工具生成的二进制映像文件。
可以这样形象的说: image.rom = gunzip program + gzipped(image.ram)

boot.rom:   
   其实就是 uClinux 编译完成后的文件 images/romfs.img,
   可以看一下 makefile ,它不过是一个链接文件。

Q: 在 make menuconfig 时读取的配置文件是什么?
A: make menuconfig 是用的的配置文件主要有以下几个:
    vi config.in                                        
    主要是处理 top level config ,包括 vendor/product, linux-2.4.x 版本选择,
    Libc version,还有是否选择配置 Kernel Settings,Vendor/User Settings 等。
    这个 config.in 文件是通过执行 config/mkconfig > config.in 脚本自动生成的。
    ( 因此修改 config.in 不起作用哟! )

    vi arch/armnommu/config.in
    主要是处理和 kernel settings 相关的配置,比如 选择 cpu 类型,选择设备驱动,
    文件系统支持,网络支持 等等。这些也是裁减内核最重要的配置文件。
    可以修改 arch/armnommu/config.in 来调整 make menuconfig 时的选项设置。

    vi config/config.in
    主要是处理 Vendor/User Settings 相关的部分,也就是 romfs 中添加的应用程序,
    可以修改 config/config.in 来改变相关的选项设置。

    vi vendors/Samsung/4510B/config.linux-2.4.x

Q: kernel 链接时用的 vmlinux.lds 是怎么得到的?
A: vi linux-2.4.x/arch/armnommu/vmlinux-armv.lds.in 这个是原始文件,
    vi arch/armnommu/Makefile 在这里定义了如何通过 sed 命令生成 lds。
    其实就是把 Makefile 里面定义的 TEXTADDR 替换到 lds.in 文件里。

Q: kernel 链接时的起始地址 TEXTADDR 在哪里指定?
A: vi arch/armnommu/Makefile 在相应的 ARCH 下找,
    一般缺省的是 0xC0008000 。但不同的芯片会有不同的定义,例如
    148 ifeq ($(CONFIG_ARCH_ATMEL),y)
    149 TEXTADDR        = 0x1000000
    150 MACHINE         = atmel
    151 endif

    166 ifeq ($(CONFIG_ARCH_SAMSUNG),y)
    167 TEXTADDR         = 0x00008000
    168 MACHINE          = samsung
    169 endif
阅读(706) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~