📄 uclinux
字号:
height=13 alt=收藏夹 hspace=3
src="Guangzhou Linux Consortium 阅读主题 - uclinux的移植三步曲(第二步).files/icon_mini_groups.gif"
width=12 border=0>收藏夹</A> <A class=mainmenu
href="http://www.gzlinux.org/forum/topics_anywhere.php"><IMG
height=13 alt="Rss Sync" hspace=3
src="Guangzhou Linux Consortium 阅读主题 - uclinux的移植三步曲(第二步).files/icon_mini_groups.gif"
width=12 border=0>Rss Sync</A> <A
class=mainmenu
href="http://www.gzlinux.org/forum/profile.php?mode=register"><IMG
height=13 alt=注册 hspace=3
src="Guangzhou Linux Consortium 阅读主题 - uclinux的移植三步曲(第二步).files/icon_mini_register.gif"
width=12 border=0>注册</A></SPAN> </TD></TR>
<TR>
<TD vAlign=top noWrap align=middle height=25><SPAN
class=mainmenu> <A class=mainmenu
href="http://www.gzlinux.org/forum/profile.php?mode=editprofile"><IMG
height=13 alt=个人资料 hspace=3
src="Guangzhou Linux Consortium 阅读主题 - uclinux的移植三步曲(第二步).files/icon_mini_profile.gif"
width=12 border=0>个人资料</A> <A class=mainmenu
href="http://www.gzlinux.org/forum/privmsg.php?folder=inbox"><IMG
height=13 alt=登陆查看您的站内信件 hspace=3
src="Guangzhou Linux Consortium 阅读主题 - uclinux的移植三步曲(第二步).files/icon_mini_message.gif"
width=12 border=0>登陆查看您的站内信件</A> <A class=mainmenu
href="http://www.gzlinux.org/forum/login.php"><IMG height=13
alt=登陆 hspace=3
src="Guangzhou Linux Consortium 阅读主题 - uclinux的移植三步曲(第二步).files/icon_mini_login.gif"
width=12
border=0>登陆</A> </SPAN></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR>
<TABLE cellSpacing=2 cellPadding=2 width="100%" border=0>
<TBODY>
<TR>
<TD vAlign=bottom align=left colSpan=2><A class=maintitle
href="http://www.gzlinux.org/forum/viewtopic.php?t=846&start=0&postdays=0&postorder=asc&highlight=">uclinux的移植三步曲(第二步)</A><BR><SPAN
class=gensmall><B></B><BR> </SPAN></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=2 cellPadding=2 width="100%" border=0>
<TBODY>
<TR>
<TD vAlign=bottom noWrap align=left><SPAN class=nav><A
href="http://www.gzlinux.org/forum/posting.php?mode=newtopic&f=44"><IMG
alt=发表新帖
src="Guangzhou Linux Consortium 阅读主题 - uclinux的移植三步曲(第二步).files/post.gif"
align=middle border=0></A> <A
href="http://www.gzlinux.org/forum/posting.php?mode=reply&t=846"><IMG
alt=回复帖子
src="Guangzhou Linux Consortium 阅读主题 - uclinux的移植三步曲(第二步).files/reply.gif"
align=middle border=0></A></SPAN></TD>
<TD vAlign=center align=left width="100%"><SPAN
class=nav> <A class=nav
href="http://www.gzlinux.org/forum/index.php">Guangzhou Linux
Consortium 首页</A> -> <A class=nav
href="http://www.gzlinux.org/forum/viewforum.php?f=44">嵌入式Linux</A></SPAN></TD></TR></TBODY></TABLE>
<TABLE class=forumline cellSpacing=1 cellPadding=3 width="100%"
border=0><TBODY>
<TR align=right>
<TD class=catHead colSpan=2 height=28><SPAN class=nav><A class=nav
href="http://www.gzlinux.org/forum/viewtopic.php?t=846&view=previous">阅读上一个主题</A>
:: <A class=nav
href="http://www.gzlinux.org/forum/viewtopic.php?t=846&view=next">阅读下一个主题</A>
</SPAN></TD></TR>
<TR>
<TH class=thLeft noWrap width=150 height=26>作者</TH>
<TH class=thRight noWrap>留言</TH></TR>
<TR>
<TD class=row1 vAlign=top align=left width=150><SPAN class=name><A
name=2956></A><B>minian_007</B></SPAN><BR><SPAN
class=postdetails><BR><BR><BR>注册时间: 2004-03-16<BR>帖子:
43<BR></SPAN><BR></TD>
<TD class=row1 vAlign=top width="100%" height=28>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD width="100%"><A
href="http://www.gzlinux.org/forum/viewtopic.php?p=2956#2956"><IMG
title=帖子 height=9 alt=帖子
src="Guangzhou Linux Consortium 阅读主题 - uclinux的移植三步曲(第二步).files/icon_minipost.gif"
width=12 border=0></A><SPAN class=postdetails>发表于: Tue Mar 23,
2004 9:33 pm<SPAN class=gen> </SPAN> 发表主题:
uclinux的移植三步曲(第二步)</SPAN></TD>
<TD vAlign=top noWrap><A
href="http://www.gzlinux.org/forum/posting.php?mode=quote&p=2956"><IMG
title=引用并回复 alt=引用并回复
src="Guangzhou Linux Consortium 阅读主题 - uclinux的移植三步曲(第二步).files/icon_quote.gif"
border=0></A> </TD></TR>
<TR>
<TD colSpan=2>
<HR>
</TD></TR>
<TR>
<TD colSpan=2><SPAN class=postbody>第二步:编译内核
<BR><BR>建立好了开发环境,接下来要做的当然就是根据你的硬件环境编译原程序. <BR>在这里呢就有两种方法
<BR><BR>第一种: 就是直接用dist来作.这种方法比较简单,比较适合初学者和对makefile不 <BR>熟的同志.
<BR>首先就是进入uClinux-dist目录(在第一步中巳做解释),你可以看到很多目
<BR>录,比如config;Documentation;freeswan;lib;linux-2.0.x;linux-2.4.x;
<BR>uClib;user;vendor;romfs;images
<BR>config:这个目录下是一些配置信息,在make config 的时候会用到里面的
<BR>mkconfig这个文件,比如选择vendor,选择内核版本(2.4还是2.0)
<BR>就在这个里面做的.然后在根目录下生成config.in文件. <BR>Documentation:这里是一些帮助信息
<BR>lib:库文件 <BR>uClib:也是库文件,不过比lib小,一般嵌入式linux都用它
<BR>linux-2.0.x:2.0版的内核 <BR>linux-2..4.x:2.4版的内核
<BR>user:这里面放一些用户程序 <BR>romfs:放的是romfs的目录架构,在这里用的文件系统是romfs
<BR>images:这里存放最后的执行印象和romfs印象 <BR><BR>好,下面再来看一下怎么样编译
<BR>一般是遵循以下步骤 <BR>make config <BR>make dep <BR>make clean
<BR>make lib_only(可以仅1次,不必要每次都来) <BR>make
user_only(每次修改过您的应用程序之后,这一步后面的都必须重 <BR>来) <BR>make romfs
<BR>make image <BR>make <BR>当你在做make config
的时候注意要选择你芯片的型号比如(SamSung- <BR>4510) <BR>然后以后的工作几乎都是自动完成的了.
<BR><BR>另外,就是可能你自己需要根据你自己的板子,选择ram的位置,还有linux开始 <BR>执行的地址,
<BR>这几项内容分别在
<BR>ram,rom的位置在linux-2.4.x/arch/ARCH/config.in(ARCH表示相应的
<BR>处理器,比如arm,i386)里面设置,你在linux-2.4.x/arch/ARCH/makefile
<BR>里面会看到下类下面的句子 <BR>if [ "$CONFIG_ARCH_SAMSUNG" = "y" ]; then
<BR>define_bool CONFIG_NO_PGT_CACHE y <BR>define_bool
CONFIG_CPU_32 y <BR>define_bool CONFIG_CPU_26 n
<BR>define_bool CONFIG_CPU_ARM710 y <BR>define_bool
CONFIG_CPU_WITH_CACHE y <BR>define_bool
CONFIG_CPU_WITH_MCR_INSTRUCTION n <BR>define_bool
CONFIG_SERIAL_SAMSUNG y <BR>define_hex DRAM_BASE 0x00000000
<BR>define_hex DRAM_SIZE 0x00800000 <BR>define_hex
FLASH_MEM_BASE 0x01000000 <BR>define_hex FLASH_SIZE 0x00200000
<BR>fi <BR>其中DRAM_BASE,和DRAM_SIZE表示ram的起始地址和大小,你可以做相应 <BR>的改变.
<BR>然后在linux-2.4.x/arch/ARCH/makefile里面会看到下面的语句 <BR>TEXTADDR =
0x00008000 <BR>TEXTADDR就是linux执行的开始位置啦.
<BR><BR>另外可能就是要设置串口的波特率啦,这个设置视不同的芯片而定,不过一般
<BR>来说修改/linux-2.4.x/driver/char/serial_XXX.c文件,这里不同的芯片,会
<BR>有不同的serial文件 <BR><BR>第二种方法:直接用原包来做
<BR>这种方法会比较烦一点,不过会让你对整个过程更加清晰 <BR>下面是一个网友写的文章我把它贴出来
<BR><BR><BR><BR>s3c44b 0x + uclinux2.4.19移植过程
<BR><BR>终于看到一点结果了... <BR><BR>首先很感谢tpu, coldwind等给的帮助.
<BR>第一次做这个,很多概念都是在这里得到各位的帮助. <BR>至今为止还有很多概念问题,没搞清楚,以后多多指教.
<BR><BR>附件里是,我参考过的两篇文档. <BR>但是tpu曾建议不要用dist来做,直接用纯的linux源码包来做,
<BR>我后来也是用linux源码包来做的. <BR>个人也倾向于直接用linux kernel源码包来做,这样更清晰,
<BR>就是Makefile也清楚很多倍. <BR>而,romfs我是用dist的包来做的.
<BR><BR>下面附带,我移植过程中的一些问题,有点象日志,呵呵
<BR>但愿对后面的初学者有点用吧,(总要回报点给论坛<IMG alt=Smile
src="Guangzhou Linux Consortium 阅读主题 - uclinux的移植三步曲(第二步).files/icon_smile.gif"
border=0>,就怕质量太差) <BR><BR>1. tar xvzf linux-2.4.19.tar.gz
<BR>2. patch uclinux <BR>3. patch s3c44b0x(from tpu) <BR>4.
修改$topdir/Makefile中使 <BR>arch:=armnommu
<BR>CROSS_COMPILE:=arm-elf- <BR>5.
修改$topdir/arch/armnommu/config.in
<BR>============修改=========== <BR>if [ "$CONFIG_ARCH_S3C44B0"
= "y" ]; then <BR>define_bool CONFIG_NO_PGT_CACHE y
<BR>define_bool CONFIG_CPU_32 y <BR>define_bool CONFIG_CPU_26
n <BR>define_bool CONFIG_CPU_ARM710 y <BR>define_bool
CONFIG_CPU_WITH_CACHE y <BR>define_bool
CONFIG_CPU_WITH_MCR_INSTRUCTION n <BR>define_hex DRAM_BASE
0x0c000000 <BR>define_hex DRAM_SIZE 0x00800000
要修改dram和flash的大小 <BR>define_hex FLASH_MEM_BASE 0x00000000
<BR>define_hex FLASH_SIZE 0x00200000 <BR>fi <BR>============
<BR>6.make menuconfig <BR>make dep <BR>make Image 注意关于Image
zImage的make选项并不在$TOPDIR/Makefile中 <BR><BR>而是这样
<BR>$TOPDIR/Makefile中 include arch/$(ARCH)/Makefile
<BR>而arch/$(ARCH)/Makefile中 <BR>由MAKEBOOT对Image zImage等进行处理
<BR>MAKEBOOT = $(MAKE) -C arch/$(ARCH)/boot LINUX=$(LINUX)
<BR><BR>所以,根本上是在arch/$(ARCH)/boot/Makefile中对make Image处理的
<BR><BR>7. <BR>ARCH/ARMNOMMU/MAKEFILE <BR>定义了
<BR>PROCESSOR为armv (32位的)。 <BR>定义了 <BR>HEAD :=
arch/armnommu/kernel/head-$(PROCESSOR).o \
<BR>arch/armnommu/kernel/init_task.o <BR><BR><BR>TEXTADDR
决定KERNEL起始运行地址,即IMAGE应DOWN到的位置
<BR><BR>ARCH/ARMNOMMU/BOOT/MAKEFILE <BR>ZREALADDR
决定KERNEL解压后数据输出的地址,同1 <BR>ZTEXTADDR
带BOOTLOADER的压缩内核文件烧入FLASH的起始地址,即从哪个位置开始执行
<BR>BOOTLOADER,若启动时直接执行,将其设为0,若自带BIOS可以跳到你想要的地址,可改为你要的位置。
<BR><BR>8.image的组成(其中HEAD见7中) <BR>$(LINUX):
include/linux/version.h $(CONFIGURATION) init/main.o
init/version.o init/do_mounts.o linuxsubdirs <BR>$(LD)
$(LINKFLAGS) $(HEAD) init/main.o init/version.o
init/do_mounts.o \ <BR>--start-group \ <BR>$(CORE_FILES) \
<BR>$(DRIVERS) \ <BR>$(NETWORKS) \ <BR>$(LIBS) \
<BR>--end-group \ <BR>-o $(LINUX)
<BR><BR>9.启动文件/arch/armnommu/kernel/head-armv.S
<BR><BR>ID检查问题。在head-armv.S应加入对MACH_TYPE的设定。在uClinux启动时,首先会检查CPU的ID和平台的TYPE,如果不对会陷入死循环。在TPU的Patch中,加入了对CPU
ID的设定,但没有加入对平台类型的设定。平台类型可能是应该从BootLoader中设好传进来,但对我们自已的BootLoader,没有完成此设定,所以应把MACH_TYPE(178)设到r1寄存器。否则,在系统调用lookup_architecture_type之后就没戏了。修改如下:
<BR>mov r1, #178 ;《==此句为新加的 <BR>mov r0, #F_BIT | I_BIT |
MODE_SVC @ make sure svc mode <BR>msr cpsr_c, r0 @ and all
irqs disabled <BR><BR>10.vectors_base
<BR>在include/asm-armnommu/proc-armv/system.h中定义
<BR>在arch/armnommu/kernel/traps.c fiq.c 和sys_arm.c使用
<BR><BR>fiq.c中 <BR>#define FIQ_VECTOR (vectors_base() + 0x1c)
<BR><BR>11.pc行为 <BR>(指令地址4) add pc,pc,0xc000000
<BR>结果会跳转到0xc00000c <BR>为什么不是8呢?
<BR>arm7用的是3级流水线,程序计数器pc必须在当前指令前计数.
<BR>所以指令在第一个周期必须为下一条指令取指pc+=4. <BR>所以在执行周期前,pc+=8了. <BR>所以add
pc,pc,0xc000000 在执行的时候是(4+8+0xc000000). <BR><BR>12.设计
<BR>bootloader 在flashrom中0x0-0x1000段 <BR>kernel
image在flashrom中0x1000-0x1fffff段 <BR>由bootloader把kernel
image从rom0x1000中拷到ram0xc000000处 <BR>irq vector 在ram 0xc7fff00
- 0xc7fffff段 <BR>在bootloader中_ISR_STARTADDRESS 指定. <BR>在kernel
中由vectors_base指定. <BR><BR>==修改 <BR>arch/armnommu/Makefile中
<BR>TEXTADDR 决定KERNEL起始运行地址,即IMAGE应DOWN到的位置0xc000000 <BR>==修改
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -