2009年6月17日 星期三

kernel memory detect

arm linux中一般在cmdline或传递tag参数中设置, 个别板子在machine_desc.fixup函数中设置. 按顺序分别说明:

1, 出现顺序(内核版本2.6.25.20,下同)
start_kernel()
->setup_arch()
->mdesc->fixup()
->parse_tags()
->parse_tag_mem32()
->parse_cmdline()
->early_mem()

2, fixup()函数
这个函数arm平台用的很少. 我只找到eseries.c, mach-smdk2413.c, mach-vstms.c这几个arm板子有, smdk2413_fixup()是在bootloader传递tag地址与machine_desc预设tag地址(mem_PA+0x100)不同时设置memory的start和size. 如果fixup起作用, 会从tag中把mem tag改为ATAG_NONE, 后面的"parse_tag_mem32"就没用了.

3, parse_tag_mem32()
该函数定义在"arch\arm\kernel\setup.c". 把bootloader传入的mem tag(ATAG_MEM)的start和size参数通过"arm_add_memory()"加入到meminfo的最后一个bank中. start是memory物理起始地址.

4, early_mem()
该函数定义在"arch\arm\kernel\setup.c". 处理cmdline中的"mem=size@start".
如果没有定义mem起始地址, 使用PHYS_OFFSET(arm中应由arm开发板设置)作为start. early_mem()会覆盖前面设置的meminfo.

呵呵, 你为什么会想到找这个? 我当初是板级移植u-boot到s3c2410时分析的代码, 当时还不知道sourceinsight, 用grep查找的:(

"arch\arm\mm\init.c"文件和这个好像没关系, 里面的"bootmem_init()"会根据这里设置的meminfo计算出high_memory. 系统物理memory会1:1映射到"PAGE_OFFSET---high_memory-1".

2009年6月16日 星期二

[Linux Notes] - diff 、patch 使用方法
在Linux的编程过程中,经常会使用到补丁包Patch。实际上Patch就是diff的集合。

Diff 的使用 - 生成 Patch集合
diff -uNr old_dir new_dir > diff.patch

Patch 的使用 - 应用Patch集合
cd old_dir
patch -p1 < diff.patch
(忽略diff文件里的第一层目录信息,直接从第2层开始对文件打Patch)
patch -p1 -R < diff.patch
(反向打Patch,将new_dir变成old_dir)
Diff 输出文件格式解析
一个diff文件由补丁头和补丁差异的部分组成。
补丁头的表达如下:
补丁头是分别由—/+++开头的两行,用来表示要打补丁的文件。—开头表示旧文件,+++开头表示新文件。一个补丁文件中可能包含以—/+++开头的很多节,每一节用来打一个补丁。所以在一个补丁文件中可以包含好多个补丁。

diff -u 产生的patch 文件说明
— old.txt 标记源文件,说明old.txt是需要更改的文件
+++ new.txt 标记新文件,说明new.txt是新建立的文件
@@-1,5 +2,6@@ @@表示块的开始,@@表示块的结束
表示源文件的第1行以下的5行内容与目标文件的第2行以下的6行内容有不同。
-aasa
+asas 表示删除源文件中aasa的内容,修改为目标文件中asas的内容。
Diff 和Patch 命令使用小结
单个文件
diff –uN from-file to-file >to-file.patch
patch –p0 < to-file.patch
patch –RE –p0 < to-file.patch
多个文件
diff –uNr from-docu to-docu >to-docu.patch
patch –p1 < to-docu.patch
patch –R –p1

2009年6月9日 星期二

JFFS2 mount

http://elinux.org/File_Systems#YAFFS2