| 【转帖】uCLinux FAQs |
| 类别:网文精粹 |
|
Q: 请问uclinux启动时最先执行哪一个程序文件中的代码? 3g+ \? L-c A: 如果是不压缩的内核,则执行 linux-2.4.x/arch/armnommu/kernel/head-armv.S ^W{eO@ 如果是压缩的内核,则先执行解压的程序 0$(jBnE linux-2.4.x/arch/armnommu/boot/compressed/head.S RH1U_gp4 ] 当然,如果是其他的 arch ,应该可以依此类推。 \>_eEZ5 *GB$sXF Q: 程序在 ram 中运行和在 rom 中运行有什么不同? X@G[=Rs A: 至少有以下这些情况是需要 ram 的 : !k ;[^> 程序中定义了全局变量,并进行了赋值。 例如 int a; a = 1; 9,}fx+^ 程序中进行了函数调用,使用了堆栈。 例如 function(); ..sJtA8 在函数内部使用了局部变量,同样也会使用堆栈。 例如 void f() { int a = 5; } NO%|c|B| 程序中对某内存地址进行了写操作。例如 str r1, [r2]; *paddr = 1; "`H=AX0 如果一个程序没有上面的这些,那么 rom 中也是可以跑的,比如点led的小汇编。 jLpgWt`8)E n/,rn>k7: Q: uclinux中,与具体的cpu相关的代码都分布在哪几个目录中? *=r@vQ A: 以 Samsung 4510B 为例,以下目录的相关文件比较重要。 _CYmG"mY uClinux-Samsung\linux-2.4.x\arch\armnommu\mach-samsung\* 芯片级 il 8A&`% uClinux-Samsung\vendors\Samsung\4510B\makefile 如何生成 image, romfs 7l4InR] uClinux-Samsung\linux-2.4.x\drivers\char\serial_samsung.c 串口驱动 W_Ws3L1;N uClinux-Samsung\linux-2.4.x\include\asm-armnommu\arch-samsung 头文件定义 NG4eEnic!a N69eI dl Q: 编译之后在 images 目录下生成的那些文件都是什么意思? N23+1h A: 对于一些可能出现的文件,这里做一个解释: .jrR4@ romfs.img: 这个文件是通过 tools/romfs-inst.sh 脚本,生成 romfs 目录及其 jQw`*Y/, 下面的文件,然后通过 genromfs 程序打包成一个文件 romfs.img 6O[wVaC1u romfs.img 既可以放在 flash 中,也可以放在 ram 中,但需要在 LgD {! 编译内核时在 driver/block/blkmem.c 里指定地址,以便内核找到。 Lb mB([p linux.text: 编译后的内核中 text 段,一般放在 flash 中,只读。 ?AM 8*w linux.data: 编译后的内核中 data,init 段,一般放在 sdram 中,读写。 el*pYI image.bin: 上面三个文件顺序连接而生成的 = linux.text + linux.data + romfs.img y:|Xg0Kp ;Kd{h 有的时候还会得到: .]sIoB-54 image.rom: R4rm>zisVX 通常 image.rom 的文件大小要比 image.ram 小很多,这是因为 image.rom 是 4\eX=~C>: 一个压缩过的内核,前面加上一个小的解压程序负责把内核解压后搬到指定位置。 +qW w-8 这个文件可以直接烧进 flash 中,当然也可以在 ram 中运行。这个文件实际上 QmkC~kK1. 就是通常 linux 生成的 zImage 文件。 *e"GQd? I~5fz4Q image.ram: /KvPiQ% 这个内核没有压缩过,而且必须在 ram 里运行。所以需要通过板子上的 bootloader `zOAltfd 将它下载到指定位置后开始执行。相对 image.rom 而言,从 ram 里启动内核,则 C.e|VzQa 代码段和数据段都在 ram 里面。这个文件是编译生成的 elf 格式的linux内核,通过 @ un arm-elf-objcopy 工具生成的二进制映像文件。 0N[DV] 可以这样形象的说: image.rom = gunzip program + gzipped(image.ram) Jz3<yQ- 3 !w>"h0( boot.rom: eHyuO)(xH1 其实就是 uClinux 编译完成后的文件 images/romfs.img, >W]"a3E 可以看一下 makefile ,它不过是一个链接文件。 &EJ,k'7$ dv}R]f' Q: 在 make menuconfig 时读取的配置文件是什么? LmdV@gR A: make menuconfig 是用的的配置文件主要有以下几个: %c2i.E/G vi config.in Nv]/L +i 主要是处理 top level config ,包括 vendor/product, linux-2.4.x 版本选择, ~{$'sp0 Libc version,还有是否选择配置 Kernel Settings,Vendor/User Settings 等。 HZ4 ^T7G 这个 config.in 文件是通过执行 config/mkconfig > config.in 脚本自动生成的。 mBkQ 8e ( 因此修改 config.in 不起作用哟! ) >mSl~.I2 P>Rqy vi arch/armnommu/config.in rGL{g&_ 主要是处理和 kernel settings 相关的配置,比如 选择 cpu 类型,选择设备驱动, b>._ r&. 文件系统支持,网络支持 等等。这些也是裁减内核最重要的配置文件。 &c ~)z\$ 可以修改 arch/armnommu/config.in 来调整 make menuconfig 时的选项设置。 6{WT;W>WT: ~ZN9 E-uL vi config/config.in <L#r6y~H 主要是处理 Vendor/User Settings 相关的部分,也就是 romfs 中添加的应用程序, M_I\:Q 可以修改 config/config.in 来改变相关的选项设置。 !Ve3:OZ.nO '2oBi6|X vi vendors/Samsung/4510B/config.linux-2.4.x /omVM u >@iV!! Q: kernel 链接时用的 vmlinux.lds 是怎么得到的? I ]1fH A: vi linux-2.4.x/arch/armnommu/vmlinux-armv.lds.in 这个是原始文件, Vd~k4 vi arch/armnommu/Makefile 在这里定义了如何通过 sed 命令生成 lds。 c ?S402M} 其实就是把 Makefile 里面定义的 TEXTADDR 替换到 lds.in 文件里。 GjBQxn eD0@n : Q: kernel 链接时的起始地址 TEXTADDR 在哪里指定? Kfl+8UR5= A: vi arch/armnommu/Makefile 在相应的 ARCH 下找, f^ qQ 5N 一般缺省的是 0xC0008000 。但不同的芯片会有不同的定义,例如 $4pW#4/4 148 ifeq ($(CONFIG_ARCH_ATMEL),y) B%/Pn 2 149 TEXTADDR = 0x1000000 Z(P#]jI] 150 MACHINE = atmel LtBH4 A 151 endif /^"TMm =k z;CS+ 166 ifeq ($(CONFIG_ARCH_SAMSUNG),y) F )G#\r 167 TEXTADDR = 0x00008000 =zKp(_[D 168 MACHINE = samsung yY+2;`CH 169 endif |
- B2B搜索“联姻”..
- 2008-9-11
- HOLTEK推出H..
- 2008-9-11
- 关于ISPRO校验..
- 2008-9-11
- 利用适配板实现免制..
- 2008-9-11
- GSMSMS模块客..
- 2008-9-11
- ISPro下载型编..
- 2008-9-11
- C语言之stati..
- 2008-9-11
- 完美结合语音芯片与..
- 2008-9-11
- 又做一工具:ATm..
- 2008-9-11
- QE128的DEM..
- 2008-9-11
- 特别推荐一款高性能..
- 2008-9-11
- SATA硬盘使用解..
- 2008-9-16
- EPoX主板几种前..
- 2008-9-16
- 反其道行之降低电压..
- 2008-9-16
- 基于ATM8051..
- 2008-9-16
- THB6016H测..
- 2008-9-16
- 显示器黑屏的解决办..
- 2008-9-16
- 你会买网络服务器吗..
- 2008-9-16
- 酷漫教你制作只带一..
- 2008-9-16
- 酷漫破解网页右健锁定
- 2008-9-16



