jz2440裸机,文件系统

来源:互联网 发布:淘宝qq群拉人 编辑:程序博客网 时间:2024/06/05 19:03

一、环境

1.nfs下载
开发板nfs(网络文件系统)远程挂载:
mount -t nfs -o nolock [serverip]:/dir /mnt/nfs

nfs下载文件到开发板:
nfs 30000000 [serverip]:/[dir]/[file]
eg:nfs 30000000 192.168.11.145:/work/nfs_root/tmp/fs.yaffs2
nand erase root
nand write.yaffs 3000000026000 $(filesize)

使用nfs作为根文件系统来启动:
(1)重启系统进入uboot 分别按 q print 开始改root=后的参数即可
(2)set bootargs noinitrd root=/dev/nfs nfsroot=192.168.11.145:/work/nfs_root/tmp/fs_mini_mdev ip=192.168.11.111:192.168.11.145:192.168.11.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0
(3)save

2.tftp服务器下载
pri 查看环境变量
setenv serverip [linuxip] 设置linux ip
setenv ipaddr 板子ip 设置开发板ip
saveenv 保存设置

tftp 30000000 [file.bin]
nand erase [quyu] //mtd查看分区
nand write 30000000 [quyu]
重新上电 或者:
nand read 30000000 [quyu]
go 30000000

3.制作yaffs映像文件
mkyaffs2image [dir] [image_file]

4./etc/exports下的目录显示了nfs可以挂载的目录

5.linux下dnw烧写kernel,file system
(1)把linux下的dnw应用程序放到/bin目录
sudo chmod +x /bin/dnw
sudo chmod +x /bin/dnw
(2)如果使用VMWARE,让VMWARE位于前台,然后再用USB线连接PC和开发板USB DEVICE接口,用lsusb命令确认VMWARE LINUX已经识别出UBOOT设备。
(3)在UBOOT界面输入k
然后再LINUX 下执行dnw [dir]uImage
(4)在UBOOT 界面输入y
然后再LINUX下执行 dnw [dir]fs_qtopia.yaff2

二、裸板

1.nand flash
由硬件完成部分:
(1)前4k -> sdram
(2)cpu从0地址执行

2.nor flash
nor可以像内存一样读,不能像内存一样写数据,有特殊方法规则

3.启动文件
(1)软件初始化
1>.设置栈 SP指向内存中某一块
2>.设置返回地址
3>.调用main
4>.清理工作
(2)硬件初始化
1>.关看门狗
2>.初始化时钟
3>.初始化SDRAM
4.位操作
(1).清零:位与 a = a & ( ~(1《 n) )
(2).置一:位或 a = a | (1《n)
操作IO需要先清零确保该位已知为0,再置1或0.
5.存储管理
2440启动方式:
1.nor启动:0地址-》nor-》bank0
2.nand启动:bank0无效
(1) 0地址-》sram-》stepping stone
(2) nand前4K-》片内sram
(3) 从0地址执行
程序执行过程:
(1)一上电,nand前4k-》片内RAM
(2)在sramz的0地址处执行,关看门狗,初始化存储器管脚,拷贝代码到SDRAM
(3)转到SDRAM,继续执行

makfile中链接地址:运行时,程序应该处于哪里。

6.mmu

虚拟地址《-》物理地址
(1)建表格
(2)表格地址告诉mmu
(3)启动mmu

三.uboot分析

bootloader最终目的:从flash读出内核,放到SDRAM,启动内核。

第一阶段:
a.设cpu为svc模式
b.关看门狗
c.屏蔽中断
d.sdram初始化
e.设置栈
f.初始化时钟
g.重定位,代码从flash->sdram
h.清bss段
i.调用start_armboot开始第二阶段

第二阶段:
(1)启动内核
s=getenv(“bootcmd”)
run_command( s….)
(2)u-boot界面:
readline(读入串口数据)
run_command

!!u-boot的核心:命令

do_bootm():
(1)根据头部移动到合适的地方
(2)启动内核:do_bootm_linux
1>.uboot告诉内核一些参数-》设置启动参数。
2>.跳到入口地址启动内核。
do_bootm_linuc():
启动内核
1>设置启动参数
setup_serial_tag (&params);
setup_memory_tags (bd);
setup_commandline_tag (bd, commandline);
setup_end_tag (bd);
2>跳到入口地址
void (*theKernel)(int zero, int arch, uint params);
theKernel = (void (*)(int, int, uint))ntohl(hdr->ih_ep);
theKernel (0, bd->bi_arch_number, bd->bi_boot_params);

!!!分析Makefile是掌握程序最好的方式
!!!根文件系统相当于pc的c盘

四、内核启动分析

1.编译内核镜像
(1)解压缩
(2)打补丁
(3)配置生成.config文件
三种方法
1>.直接执行make menuconfig
2>.使用默认配置,在上面修改
在arch/arm/configs找到相似的配置文件xxx_defconfig
make xxx_defconfig
make menuconfig
配置结果生成.config,配置结果保存在.config里面
3>使用厂家提供的配置文件
cp config_ok .config
make menuconfig
(4)编译make

make uImage时:
eg:配置项CONFIG_DM9000为例:
(1)c源码:
(2)子目录Makefile: drivers/net/Makefile
(3)..config=》/include/config/auto.conf: 定义CONFIG_DM9000为y或者m,这个头文件被顶层Makefile包含,子目录Makefile使用
(4)..config=》/include/linux/autoconf.h: CONFIG_DM9000定义为1,这个头文件被c源码使用决定是否编译进内核DM9000

2.Makefile分析

zImage Image xipImage bootpImage uImage: vmlinux
(uImage=头+真正的内核)

vmlinux: (vmlinuxlds)(vmlinux-init) (vmlinuxmain)(kallsyms.o) FORCE

vmlinux-init := (heady)(init-y)
head-y := arch/arm/kernel/head(MMUEXT).oarch/arm/kernel/inittask.oinity:=init/inity:=(patsubst %/, %/built-in.o, $(init-y))=init/built-in.o(!!!)

vmlinux-main := (corey)(libs-y) (driversy)(net-y)
core-y := usr/
core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/
core-y := (patsubst(core-y))
!!! =usr/built-in.o kernel/built-in.o mm/built-in.o fs/built-in.o ipc/built-in.o security/built-in.o crypto/built-in.o block/built-in.o

libs-y := lib/lib.a lib/built-in.o
drivers-y := drivers/ sound/
drivers-y := (patsubst(drivers-y))
drivers-y := drivers/built-in.o sound/built-in.o
net-y := net/built-in.o

vmlinux-all := (vmlinuxinit)(vmlinux-main)
vmlinux-lds := arch/$(ARCH)/kernel/vmlinux.lds

第一个文件:arch/arm/kernel/head.S
链接脚本:arch/arm/kernel/vmlinux.lds

五、根文件系统

每个命令ls,cd….都软链接到busybox

1.内核怎样启动第一个应用程序?
1》、open(/dev/console);//打开终端
sys_dup();
sys_dup();
2》、run_init_process();

2.构建根文件系统之init进程分析。
init程序=》1>.读取配置文件,制定后续执行的程序
2>.解析配置文件
3>.执行(用户程序)

busybox->init_main->parse_inittab->file=fopen(INITTAB,”r”);//打开配置文件/etc/inittab

new_init_action //1.创建一个init_action结构,填充
//2.把这个结构放入init_action_list链表

3.构建根文件系统之busybox

最小的根文件系统需要的项:
1>./dev/console /dev/null
2>.init->busybox
3>./etc/inittab
4>.配置文件制定的应用程序
5>.C库

0 0
原创粉丝点击