梳理一下uboot是如何从nandflash挂载文件系统的

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

首先要有的概念是,内核在挂载文件系统之前,自己会做一个虚拟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,
};

时间: 2024-10-25 08:24:12

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

debian下为stm32f429i-discovery编译uboot、linux内核和根文件系统

交叉编译器:arm-uclinuxeabi-2010q1 交叉编译器下载下来后解压,然后将其中bin文件夹路径加入到PATH变量中. 根据<debian下烧写stm32f429I discovery裸机程序>安装openocd. 安装genromfs,使用下面命令: sudo apt-get install genromfs 已经有人提供好脚本,只要执行几条命令即可.使用git下载文件并进行编译: git clone https://github.com/jserv/stm32f429-lin

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

阅读此文,必须具备知识点:<Linux 查看磁盘分区.文件系统.使用情况的命令和相关工具介绍><实例解说 fdisk 使用方法><合理规划您的硬盘分区><Fedora / Redhat 软件包管理指南> 如果您想加载一个分区(文件系统),首先您得确认文件系统的类型,然后才能挂载使用,比如通过mount 加载,或者通过修改 /etc/fstab来开机自动加载:如果您想添加一个新的分区,或者增加一个新的硬盘,您要通过分区工具来添加分区,然后要创建分区的文件系统,

linux如何使用NFS挂载文件系统

设备:一台服务器和一台客户端,这里我们把装在PC机上的RedHat作为服务器,而客户端则是嵌入式linux开发板. 环境:开发板已启动,连接好串口和网线,串口用于下发命令控制开发板,网线则用于NFS 1.确认Redhat上装好了NFS软件包,在终端输入 [[email protected] examples]# rpm -q nfs-utilsnfs-utils-1.0.9-24.el5如果出现以上结果,表示已经安装好了NFS,否则,请先安装nfs-utils软件包. 2.配置NFS服务器 [[

磁盘管理—挂载文件系统

挂载:将新的文件系统关联至新的文件系统 卸载:降某文件系统与当前根文件系统的关系移除 mount:挂载 mount 设备  挂载点 设备:    :设备文件:/dev/sda5 UUID: UUID=" " 卷标: LABEL=" " 目录: 1,此目录没有被其他进程使用 2,目录得事先存在 3,目录中原有文件,将会被暂时隐藏: mount:显示当前系统已经挂载的设备及挂载点 mount [options]  [-o options] 设备   挂载点 -a:表示挂

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

了解u-boot之前首先了解下Bootloader,简单说Bootloader就是一段小程序,它在系统上电时开始运行,初始化硬件设备,准备好软件环境,最后调用操作系统内核. u-boot全称:Universal Boot Loader,即通用Bootloader,遵循GPL条款,开放源码. 支持多种嵌入式操作系统内核:Linux.NetBSD.VxWorks等 支持多个处理器系列:如PowerPC.ARM.x86.MIPS等 u-boot的核心最终目的就是从Flash上读出内核,然后启动内核.如

NFS挂载文件系统出现nfs is not responding,still trying

采用NFS挂载根文件系统启动开发板出现: 1 nfs xxx is not responding,still trying 2 nfs xxx is OK 3 nfs xxx is not responding,still trying 4 ............... 不断的出现没有回应..成功..要很长时间才能启动开发板 解决办法: 修改uboot启动配置 uboot之前的启动配置: 1 setenv bootargs noinitrd console=ttySAC0,115200 ini

[TQ210] 网络挂载文件系统

流程 片内os起来后,从SDCARD加载uboot,然后使用 tftp 从 PC 下载 kernel,然后使用 nfs 挂载 PC 上的文件系统. 搭建 TFTP 和 NFS server TFTP sudo apt-get install tftp-hpa  tftpd-hpa xinetd sudo vim /etc/xinetd.d/tftp service tftp { socket_type = dgram protocol = udp wait = yes user = root s

linux基础篇-25,如何永久挂载文件系统

mount挂载后,重启挂载失效 os系统启动时,会自动挂载文件中的文件系统 /etc/fstab 文件内的配置 mount -a挂载/etc/fstab内的所有文件系统 永久挂载/dev/sda7 [[email protected] ~]# vim /etc/fstab # # /etc/fstab # Created by anaconda on Wed Jul 20 00:21:54 2016 # # Accessible filesystems, by reference, are ma

/etc/fstab自动挂载文件系统

打开 /etc/fstab 文件 1 [[email protected] ~]# vi /etc/fstab 默认情况下,fstab中已经有了当前的分区配置,内容可能类似: # <file system> <mount point> <type> <options> <dump> <pass> proc /proc proc defaults 0 0 /dev/hda1 / ext3 errors=remount-ro 0 1 /s