显示标签为“arm”的博文。显示所有博文
显示标签为“arm”的博文。显示所有博文

2015年11月22日星期日

ARM64从源码编译docker

在X86_64机器fedora系统下,不要使用官方编译的rpm包,交叉编译bootstrap会出现异常,使用源码编译的go.

1.编译X86_64的go binary

cd /root
git clone https://github.com/golang/go
git checkout go1.4.2
cd src/
./make.bash //先编译一个go x86_64
mv /root/go /root/go1.4//因为go1.5beta代码固定了go路径

2.下载go1.5.1,使用go1.4为arm64交叉编译bootstrap,或者直接checkout go1.5.1

cd go/src/
GOOS=linux GOARCH=arm64 ./bootstrap.bash

3. 拷贝go-linux-arm64-bootstrap.tbz到Arm64机器上继续编译其他模块

scp go-linux-arm64-bootstrap.tbz xxx //
//下载go1.5.1代码
git checkout go1.5.1
cd go/src
GOROOT=/path/to/go/bootstrap
GOROOT_BOOTSTRAP=$GOROOT ./all.bash

4. 下载docker源码并编译

git clone https://github.com/jefby/docker.git
git checkout jefby-v1.9.1 //找到最新的v1.9.1版本
AUTO_GOPATH=1 ./hack/make.sh dynbinary //编译动态版本
./hack/make.sh binary //静态版本,根据github docker社区的评论,似乎是用Redhat系列不能用静态版本的,\
因为默认使用了devicemapper,而不是ubuntu使用的aufs


5. 需要安装glibc-static
在docker v1.9.1版本中,hack/make.sh dynbinary中依然依赖libc.a和libpthread.a库,所以需要\
安装glibc-static rpm包,提供这两个库~

6..修改hack/make.sh增加set -x
添加调试选项,进行debug,查看到底是什么地方出现错误

7.安装必须的一些pkg

yum install -y device-mapper-devel
yum install -y btrfs-progs-devel

8.docker pull 的时候提示错误Server error: Status 0 while fetching image layer
解决方法:
在/etc/hosts后面添加对docker网站的dns解析
162.242.195.84 index.docker.io
162.242.195.84 registry-1.docker.io

2015年7月19日星期日

Fedora 22 for arndale octa

Hello,everynoe.

I have made an image based Fedora 22 for arndale octa board.

Offical arndale octa board just provides the linaro ubuntu linux release , but i'm more familiar RHEL/Fedora/CentOS series,,so i take some time to port the fedora 22 to this board, and it works very good.

The image file is very easy to use,and supposes that you use the linux/mac osx ,you just insert your tf card, open the terminal and input follow commands:

dd if=Fedora22-arndale-octa-1G.img of=/dev/sdX bs=1M

when it dones,poll out the tf card and insert it to the board,boot it and it will work ok .Maybe you should upgrade the kernel and dtb files because the new 4.1-rc8 kernel is more efficient and good.please command follow:

  mount /dev/mmcblk1p2 /media
  cp uImage /media/
  cp board.dtb /media/



Besides:

2. uImage



2014年8月25日星期一

arm linux内核源码中关于何时开启MMU的思考

   今天再次阅读arm linux内核源码,看MMU启动部分发现了一个问题,就是在常规的__enable_mmu和__turn_mmu_on部分我没有找到真正使能MMU标志的代码,但是它到底是什么时候将MMU的最低位置1的呢??怀着这个疑问我在google上搜索了好多,但是对于这个问题的解答都是模凌两可,说的特别含糊,千篇一律,不能让人信服。

__enable_mmu代码如下:

__enable_mmu:
#if defined(CONFIG_ALIGNMENT_TRAP) && __LINUX_ARM_ARCH__ < 6
orr r0, r0, #CR_A
#else
bic r0, r0, #CR_A
#endif
#ifdef CONFIG_CPU_DCACHE_DISABLE
bic r0, r0, #CR_C
#endif
#ifdef CONFIG_CPU_BPREDICT_DISABLE
bic r0, r0, #CR_Z
#endif
#ifdef CONFIG_CPU_ICACHE_DISABLE
bic r0, r0, #CR_I
#endif
#ifndef CONFIG_ARM_LPAE
mov r5, #(domain_val(DOMAIN_USER, DOMAIN_MANAGER) | \
domain_val(DOMAIN_KERNEL, DOMAIN_MANAGER) | \
domain_val(DOMAIN_TABLE, DOMAIN_MANAGER) | \
domain_val(DOMAIN_IO, DOMAIN_CLIENT))
mcr p15, 0, r5, c3, c0, 0 @ load domain access register
mcr p15, 0, r4, c2, c0, 0 @ load page table pointer
#endif
b __turn_mmu_on
ENDPROC(__enable_mmu)

__turn_mmu_on源码如下:
ENTRY(__turn_mmu_on)
mov r0, r0
instr_sync
mcr p15, 0, r0, c1, c0, 0 @ write control reg(启用MMU)
mrc p15, 0, r3, c0, c0, 0 @ read id reg
instr_sync
mov r3, r3
mov r3, r13 @r3中转入最后要跳入的虚拟地址
mov pc, r3 @跳转到__mmap_switched
__turn_mmu_on_end:

在__turn_mmu_on中将r0的值写入协处理CP15的C1寄存器中,但是r0的bit0什么时候被置位了呢??__enable_mmu没有置位,那就肯定是在__enable_mmu之前,搜索代码找到了答案:

::arch/arm/mm/proc-v6.S

其实在__v6_setup中设置的,有一段代码如下:
adr r5,v6_crval @将v6_crval的实际运行地址加载到r5处
ldmia r5,{r5,r6}@将r5地址处的两个字内容保存到r5和r6处,根据v6_crval定义可知,值为clear和mmuset,mmmuset的最后一个比特值为1,也就是CR_M=1
orr r0,r0,r6 @在此处将设置r0的bit0为1。随后在__turn_mmu_on中将MMU的值写入CP15的C1寄存器,真正使能MMU。

v6_crval的定义如下:
.type v6_crval, #object
v6_crval: crval clear=0x01e0fb7f, mmuset=0x00c0387d, ucset=0x00c0187c
其中crval是定义的宏,根据配置CONFIG_MMU不同存放不同的值.
.macro crval, clear, mmuset, ucset
#ifdef CONFIG_MMU
 .word \clear
 .word \mmuset
#else
 .word \clear
 .word \ucset
#endif                                                                                                                  .endm  
至此就非常清楚了,在__v6_setup中设置了r0的bit0,然后调用__enable_mmu和__turn_mmu_on真正开启MMU。