只是找到了比较一点点的线索, 如下:

首先要有的概念是,内核在挂载文件系统之前,自己会做一个虚拟fs。

1. Uboot:
从flash启动
set bootcmd nand read 0x30000000 0x60000 0x200000\;bootm 0x30000000
set bootargs noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0

2.1 Kernel-mountfs
//Do_mounts.c
void __init prepare_namespace(void)
{
ROOT_DEV = name_to_dev_t(root_device_name)

if (strncmp(root_device_name, "/dev/", 5) == 0)
root_device_name += 5;

mount_root();//根据ROOT_DEV创建/dev/root节点并挂载。

}
|||
|||
|||
dev_t name_to_dev_t(char *name)
{
strcpy(s, name);//mtdblock3
part = simple_strtoul(p, NULL, 10); // 3
res = try_name(s, part); // mtdblock3, 3
}

void __init mount_root(void)
{
create_dev("/dev/root", ROOT_DEV);
mount_block_root("/dev/root", root_mountflags);
}
||
||
||
static dev_t try_name(char *name, int part)
{
sprintf(path, "/sys/block/%s/dev", name);
fd = sys_open(path, 0, 0); //open sys/block/mtdblock3/dev
if (fd < 0)
goto fail;

//# cat sys/block/mtdblock3/dev
// 31:3
sscanf(buf, "%u:%u", &maj, &min) ;
res = MKDEV(maj, min);

//# cat sys/block/mtdblock3/range
//1
sprintf(path, "/sys/block/%s/range", name); // sys/block/mtdblock3/range
fd = sys_open(path, 0, 0);
if (fd < 0)
goto fail;
len = sys_read(fd, buf, 32);
range = simple_strtoul(buf, &s, 10); // 1
if (part < range)
return res + part;

}

void __init mount_block_root(char *name, int flags)
{
char *fs_names = __getname();
get_fs_names(fs_names);
retry:
for (p = fs_names; *p; p += strlen(p)+1) {
do_mount_root(name, p, flags, root_mount_data);
switch (err) {
case 0:
goto out;
}
}
out:
putname(fs_names);
}

static int __init do_mount_root(char *name, char *fs, int flags, void *data)
{
sys_mount(name, "/root", fs, flags, data);
sys_chdir("/root");
ROOT_DEV = current->fs->pwdmnt->mnt_sb->s_dev;
}

2.2 Kernel-driver
//linux/arch/arm/plat-s3c24xx/common-smdk.c

static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "bootloader",
.size = 0x00040000,
.offset = 0,
},
[1] = {
.name = "params",
.offset = MTDPART_OFS_APPEND,
.size = 0x00020000,
},
[2] = {
.name = "kernel",
.offset = MTDPART_OFS_APPEND,
.size = 0x00200000,
},
[3] = {
.name = "root",
.offset = MTDPART_OFS_APPEND,
.size = MTDPART_SIZ_FULL,
}
};

static struct s3c2410_nand_set smdk_nand_sets[] = {
[0] = {
.name = "NAND",
.nr_chips = 1,
.nr_partitions = ARRAY_SIZE(smdk_default_nand_part),
.partitions = smdk_default_nand_part,
},
};

static struct s3c2410_platform_nand smdk_nand_info = {
.tacls = 20,
.twrph0 = 60,
.twrph1 = 20,
.nr_sets = ARRAY_SIZE(smdk_nand_sets),
.sets = smdk_nand_sets,
};

void __init smdk_machine_init(void)
{
s3c_device_nand.dev.platform_data = &smdk_nand_info; //平台设备信息

}

//mtdblock_ro.c
static struct mtd_blktrans_ops mtdblock_tr = {
.name = "mtdblock",
.major = 31, //mtdblock主设备号
.part_bits = 0,
.blksize = 512,
.readsect = mtdblock_readsect,
.writesect = mtdblock_writesect,
.add_mtd = mtdblock_add_mtd,
.remove_dev = mtdblock_remove_dev,
.owner = THIS_MODULE,
};

梳理一下uboot是如何从nandflash挂载文件系统的的更多相关文章

  1. 转载]OK6410之tftp下载内核,nfs挂载文件系统全过程详解[转]

    原文地址:OK6410之tftp下载内核,nfs挂载文件系统全过程详解[转]作者:千山我独行 由于工作的平台也是嵌入式,差不多的平台,所以一直就没有把自己买过来的ok6410板子好好玩玩.以前一直都是 ...

  2. 关于UBOOT,LINUX内核编译,根文件系统的15个小问题

    (1)内核默认运行地址和加载地址在哪里设置? 由 arch/arm/kernel/vmlinux.lds.S 生成的 arch/armkernel/vmlinux.lds决定   (2)从FLASH什 ...

  3. 文件系统管理 之 Linux 创建文件系统及挂载文件系统流程详解

    阅读此文,必须具备知识点:<Linux 查看磁盘分区.文件系统.使用情况的命令和相关工具介绍><实例解说 fdisk 使用方法><合理规划您的硬盘分区><Fe ...

  4. Linux下使用fdisk发现磁盘空间和使用mount挂载文件系统

    若在安装Linux系统时没有想好怎么使用服务器,开始时只分了一部分给根目录.后面需要再使用时,可以通过几下一步进行分区和挂载文件系统. 看磁柱数使用情况 fdisk -l Disk /dev/sda: ...

  5. linux下使用NFS挂载文件系统

    转自linux如何使用NFS挂载文件系统 设备:一台服务器和一台客户端,这里我们把装在PC机上的RedHat作为服务器,而客户端则是嵌入式linux开发板. 环境:开发板已启动,连接好串口和网线,串口 ...

  6. linux下fdisk分区管理、文件系统管理、挂载文件系统等

    分区管理工具有:fdisk, parted, sfdisk fdisk:对于一块硬盘来讲,最多只能管理15分区: # fdisk -l [-u] [device...]  查看硬盘设备分区信息 # f ...

  7. Linux 创建文件系统及挂载文件系统流程详解(转)

    作者:北南南北 来自: LinuxSir.Org 摘要:本文对新增硬盘,切割硬盘,创建硬盘分区,为硬盘分区创建文件系统,以及加载文件系统的流程做总结性论述:主要是为初学者弄清楚这一操作过程:本文涉及f ...

  8. linux 文件系统管理三部曲之三:挂载文件系统

    linux 文件系统管理三部曲之一:磁盘分区 linux 文件系统管理三部曲之二:创建文件系统 上面说明了,硬盘的划分和格式化,那么怎么使用,还没说,这里说一下,怎么使用创建好的文件系统. 使用文件系 ...

  9. u-boot分析1:Nandflash、Norflash启动

    了解u-boot之前首先了解下Bootloader,简单说Bootloader就是一段小程序,它在系统上电时开始运行,初始化硬件设备,准备好软件环境,最后调用操作系统内核. u-boot全称:Univ ...

随机推荐

  1. 使用phpQuery实现批量文件处理

    能够将置顶文夹下的指定类型文件进行处理 <?php header('Content-Type:text/html;Charset=utf-8'); include './phpQuery/php ...

  2. [LeetCode]题解(python):011-Container With Most Water

    题目来源: https://leetcode.com/problems/container-with-most-water/ 题意分析: 给出一个n长度的非0数组,a1,a2,……,an,ai代表在坐 ...

  3. MVC3 Razor @RenderSection

    Mvc3的Razor视图引擎还提供了@RenderSection @RenderSection在母版页中占个位,然后让使用此母版页的子页自己去呈现他们的Section. 在母版页_Layout.csh ...

  4. Apache的Mod_rewrite学习(RewriteRule重写规则的语法)

    URL:http://www.tenwe.com/tech/web/server/200705/content_1548.shtml 今天学习重写规则的语法.RewriteRuleSyntax: Re ...

  5. java 利用java运行时的方法得到当前屏幕截图的方法(转)

    将截屏图片保存到本地路径: package com.test; import java.awt.AWTException; import java.awt.Dimension; import java ...

  6. ThinkPHP 3.1.2 模板的使用技巧

    本节课大纲: 一.模板包含 <include file="完整模板文件名" /> <include file="./Tpl/default/Public ...

  7. IT第五天 - 循环的使用、本周总结 ★★★

    IT第五天 上午 循环 1.while循环.do-while循环.switch语句块的使用 下午 编程 1.编程注释的编写 2.编程力求代码的精简,算法的优化 3.变量的优化使用 小项目 1.swit ...

  8. IT第四天 - 运算符、随机数、Math类

    IT第四天 上午 运算符 1.%运算符的应用 2.运算符优先级:小括号 ! 算数运算符 关系运算符 && ||   赋值运算符 3.三元运算符:?表示条件为true的结果,:表示条件为 ...

  9. java学习之url

    package com.gh.URL; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import ...

  10. idea 使用问题总结

    tomcat     edit configurations配置问题:         在deployment选项卡内增加artifact到server,在Application context选择应 ...