关闭

ASUS N14U 源码编译过程分析(上)

8259人阅读 评论(1) 收藏 举报
分类:

主要涉及到两个关键的Makfile,因为这些Makefile的自动化程度不高,所以代码显得很繁琐,但正因为如此,才相对显得比较简单。

首先是asuswrt/release/src-ra-mt7620目录下的Makefile

略去前面的变量定义部分,进入关键的部分:


image目标

image:
	@if [ -z "$(BUILD_NAME)" ]; then \
	    echo "No BUILD_NAME is assigned"; \
	    exit 1; \
	fi

	@rm -f image/$(BUILD_NAME)_$(KERNEL_VER).$(FS_VER)_$(SERIALNO).trx
	@$(MAKE) -C router image

ifeq ($(CONFIG_RALINK),y)
	#开始生成image
else
	#非ralink设备,只进行简单的打包
endif

生成image部分没有什么特别的编译行为,但是里面对文件进行相关的打包操作,很有技巧性,值得学习和研究。

内核打包

	@rm -rf $(PLATFORMDIR)/zImage.lzma ; \
	mipsel-linux-objcopy -O binary $(LINUXDIR)/vmlinux $(PLATFORMDIR)/vmlinus ; \
	asustools/lzma -9 -f -c $(PLATFORMDIR)/vmlinus > $(PLATFORMDIR)/zImage.lzma ; \
	cp -f $(PLATFORMDIR)/zImage.lzma $(PLATFORMDIR)/zImage.img ; \
首先生成kernel的bin目标文件vmlinus,然后调用lzma进行最高强度的压缩,生成zImage.lzma,最后将文件拷贝到$(PLATFORMDIR)目录,

通过前面的定义

export PLATFORM := mipsel-uclibc
export PLATFORMDIR := $(SRCBASE)/router/$(PLATFORM)
可知,该目录位于router/mipsel-uclibc

对内核进行字节填充

此部分的代码比较多,但是容易理解,用到了shell中的wc、awk、expr、dd、tr等命令,此处不详述,感兴趣的读者可以对照Makefile文件研究。

生成最终的刷机固件

核心代码是调用mkimage命令,生成trx刷机固件文件。

我们知道mkimage需要知道代码的入口点,这个入口点如何用程序获取呢?这个技巧值得我们去学习:

	@ENTRY=`LANG=en_US readelf -h $(ROOTDIR)/$(LINUXDIR)/vmlinux | grep "Entry" | awk '{print $$4}'` ; \
	ISIZE=`wc -c $(PLATFORMDIR)/zImage.img | awk '{print $$1}'` ; \
	KSIZE=`wc -c $(PLATFORMDIR)/zImage.lzma | awk '{print $$1}'` ; \
	RSIZE=`wc -c $(PLATFORMDIR)/target.image | awk '{print $$1}'` ; \
	PAD2=`expr $${ISIZE} - $${KSIZE} - $${RSIZE}` ; \
	RFSOFFSET=`expr 64 + $${KSIZE} + $${PAD2}` ; \
	echo "PAD2: $${PAD2}" ; \
	asustools/mkimage -A mips -O linux -T kernel -C lzma -a 80000000 -e $${ENTRY} -r $${RFSOFFSET} \
		-n $(BUILD_NAME) -V "$(KERNEL_VER)" "$(FS_VER)" "0" "0" "0" "0" "0" "0" "0" "0" \
		-d $(PLATFORMDIR)/zImage.img image/$(BUILD_NAME)_$(KERNEL_VER).$(FS_VER)_$(SERIALNO)_$(SWPJVER)$(EXTENDNO).trx ; \
它利用readelf -h,读出vmlinux的header部分信息:

  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           MIPS R3000
  Version:                           0x1
  Entry point address:               0x8000c150
  Start of program headers:          52 (bytes into file)
  Start of section headers:          3445604 (bytes into file)
  Flags:                             0x70001001, noreorder, o32, mips32r2
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         2
  Size of section headers:           40 (bytes)
  Number of section headers:         21
  Section header string table index: 18
利用grep "Entry" | awk '{print $$4}',就能获取到入口地址0x8000c150

通配符目标

利用通配符,实现了一些简化的操作,如:

mk-%:
	@$(MAKE) -C router $(shell echo $@ | sed s/mk-//)
和:

%: dummy
	@[ ! -d router/$* ] || $(MAKE) -C router $@


%-clean: dummy
	@-[ ! -d router/$* ] || $(MAKE) -C router $@

%-install: dummy
	@[ ! -d router/$* ] || $(MAKE) -C router $* $@

%-stage: dummy
	@[ ! -d router/$* ] || $(MAKE) -C router $* $@

%-build: dummy
	$(MAKE) $*-clean $*

%-tags: dummy
	@[ ! -d router/$* ] || ctags -a -R $(CTAGS_EXCLUDE_OPT) $(SRCBASE)/../src/router/$*

all目标

有意放在最后来介绍,因为此处就要跳转到router目录,进行下一个重要编译过程

all: rt_ver
	@echo ""
	@echo "Building $(BUILD_NAME)_$(KERNEL_VER).$(FS_VER)_$(SERIALNO).trx"
	@echo ""
	@echo ""

	@-mkdir image
	@$(MAKE) -C router all
	@$(MAKE) -C router install
	@$(MAKE) image
实际上是进入到router目录,对all和install目标进行编译。

我将在下一篇文章中,对router目录中的Makefile进行描述。



0
0
查看评论

编译华硕asuswrt固件时遇到的问题 configure not supporting AM_INIT_AUTOMAKE

Description Configure of icinga-reports-1.8.0 throws the following error: root@localhost:/usr/src/icinga-reports-1.8.0# ./configure --with-jasper-...
  • qianguozheng
  • qianguozheng
  • 2014-12-24 09:49
  • 1857

ASUS N14U 源码编译过程分析(下)

接下来,分析router中的Makefile,接上一篇文章,在转到router目录时,上一级Makefile有如下内容: @$(MAKE) -C router all @$(MAKE) -C router install router中这个Makefile看起很大(有两千多行),仔细...
  • manfeel
  • manfeel
  • 2013-11-01 21:21
  • 2911

内核源码学习:LILO的运行分析

  我们知道了LILO怎么安装,包含什么东西,有什么功能,但LILO到底是怎么运行的呢?下面是代码分析层次的LILO运行过程,通过介绍这个过程,希望你能对整个Boot Loader这部分内容有一个深入的认识。1.从软盘启动Linux内核可以存入一张1.44MB的软盘中,这样做的前...
  • eroswang
  • eroswang
  • 2008-10-07 23:47
  • 2245

ASUS PC Probe II不能正常运行解决方案

最近突然发现原来用着好好的ASUS PC Probe II(华硕针对自己的产品研发的一款硬件环境监控软件,能监控CPU当前温度/风扇转速/内核电压等关键信息),症状是运行和退出PC Probe II的主程序Probe2.exe的时候都报错(见图一),提示"Access viola...
  • lixianlin
  • lixianlin
  • 2009-02-23 10:40
  • 4759

ASUS TR-N14U固件中继小白教程

1、登录路由器设置界面 2、选择操作模式为路由模式 3、选择无线桥接然后进行下图配置
  • winux123
  • winux123
  • 2016-03-12 06:45
  • 722

ASUS EZ Installer v1.02.11

ASUS EZ Installer v1.02.11
  • tanaya
  • tanaya
  • 2016-11-13 00:50
  • 4266

Asus Music Now is not installed

前天干的事,终于解决Asus Music Now is not installed…的问题之前猜测是经由bios启动,在系统启动前预先加载一个小型操作系统,播放这个Music Now。由于我之前重装debian,洗掉了相应的内存区块,所以bios寻址找不到这个小型系统… 不得不说,这个版本的bio...
  • u010171444
  • u010171444
  • 2015-12-10 16:34
  • 1522

Asus Other Hardware\ Asus Support Device一直提醒更新问题

本帖针对升级win10后安装最新更新,却仍然出现提醒更新Asus Other Hardware\ Asus Support Device问题。楼主是华硕飞行堡垒FX50J本,曾经升级win10出现过这种问题。解决方法: 1.先按照提示下载Asus Other Hardware\ Asus Supp...
  • golden_dreams
  • golden_dreams
  • 2017-01-08 15:08
  • 2006

linux 应用程序的执行过程详解

1.父进程的行为: 复制,等待 执行应用程序的方式有很多,从shell中执行是一种常见的情况。交互式shell是一个进程(所有的进程都由pid号为1的init进程fork得到,关于这个话题涉及到Linux启动和初始化,以及idle进程等,有空再说),当在用户在shell中敲入./test执行程序时...
  • wu20093346
  • wu20093346
  • 2015-07-23 10:48
  • 460

破主板 ASUS P4S533MX

CPUSocket 478 Intel Pentium 4/ CeleronOn-die 512KB/256KB L2 全速缓存Cache with full speed支持Intel (Since PCB R 2.00 or later versions)芯片组SiS 651SiS 962L前端总...
  • kakaray
  • kakaray
  • 2005-04-06 04:08
  • 1192
    个人资料
    • 访问:366252次
    • 积分:4253
    • 等级:
    • 排名:第8494名
    • 原创:58篇
    • 转载:19篇
    • 译文:0篇
    • 评论:149条
    联系方式
    本博客所有标头为"原"的内容均为博主原创. 版权所有,严禁抄袭! 转载请保留出处,或联系QQ:179813134
    文章分类
    最新评论