zoukankan      html  css  js  c++  java
  • 根文件系统

    1:以s5pv210为例:

    irom-->uboot-->linux内核-->根文件系统

    irom是为了启动uboot而uboot是为了启动linux内核;只有linux内核开发板时不能工作的,需要配合根文件系统来工作;

    首先根文件系统为flash设备提供了一个挂载点/,在根文件下统下/目录下需要一个linuxrc文件,内核在执行linuxrc之前,一直处于内核态,直到执行根文件系统中

    的linuxrc这个应用程序,才由内核态转入用户态,这个linuxrc程序就是进程0,在由进程0,生1、2、3.。。。

    看下面程序

     1 static noinline int init_post(void)  
     2     __releases(kernel_lock)  
     3 {  
     4     /* need to finish all async __init code before freeing the memory */  
     5     async_synchronize_full();  
     6     free_initmem();  
     7     unlock_kernel();  
     8     mark_rodata_ro();  
     9     system_state = SYSTEM_RUNNING;  
    10     numa_default_policy();  
    11   
    12     if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0)  
    13         printk(KERN_WARNING "Warning: unable to open an initial console.
    ");  
    14   
    15     (void) sys_dup(0);  
    16     (void) sys_dup(0);  
    17   
    18     current->signal->flags |= SIGNAL_UNKILLABLE;  
    19   
    20     if (ramdisk_execute_command) {  
    21         run_init_process(ramdisk_execute_command);  
    22         printk(KERN_WARNING "Failed to execute %s
    ",  
    23                 ramdisk_execute_command);  
    24     }  
    25   
    26     /* 
    27      * We try each of these until one succeeds. 
    28      * 
    29      * The Bourne shell can be used instead of init if we are 
    30      * trying to recover a really broken machine. 
    31      */  
    32     if (execute_command) {  
    33         run_init_process(execute_command);  
    34         printk(KERN_WARNING "Failed to execute %s.  Attempting "  
    35                     "defaults...
    ", execute_command);  
    36     }  
    37     run_init_process("/sbin/init");  
    38     run_init_process("/etc/init");  
    39     run_init_process("/bin/init");  
    40     run_init_process("/bin/sh");  
    41   
    42     panic("No init found.  Try passing init= option to kernel.");  
    43 }  

    sys_open((const char __user *)首先开启控制台

    然后执行run_init_process(execute_command);命令 即执行linuxrc这个应用程序(execut_commant即/linuxrc),执行linuxrc就进入了一个死循环中,

    2:linuxrc程序的本质:我们用的linuxrc文件就是采用busybox代码来生成的一个二进制文件,busybox包含了/etc目录下的配置文件,/bin、/sbin目录下的命令文件,以及/lib目录下的

    当我们进入根文件系统,发现有很多命令,如ls、cp、rm等,这些都是应用程序,但这些都是通过链接到busybox实现的功能。如:

    /bin/ls -> busybox

    /bin/cp -> busybox

    /bin/rm -> busybox

    就连sbin/init进程也是链接到busybox的,所以busybox是很多命令程序和工具的集合。所以要分析init怎么运行,就要分析busybox。

    解压busybox源码,在/init/init.c。(这个就是编译busybox后就是被init链接的代码)

    函数调用流程:

    busybox -> init_main() -> parse_inittab() -> run_actions()

    解析inittab文件函数parse_inittab();

    在parse_inittab()函数里,首先打开/etc/inittab这个文件,接着解析inittab。inittab配置文件的格式说明和例子在busybox的源码里面有,搜索一下就能找到。

    这里参考http://blog.csdn.net/jianchi88/article/details/7682901博客;

    3:根文件系统的实质

    根文件系统其实是一套软件,一套代码,

    首先,存储设备(块设备,像硬盘、flash等)是分块(扇区)的,物理上底层去访问存储设备时是按照块号(扇区号)来访问的。这就很麻烦。

    其次,文件系统是一些代码,是一套软件,这套软件的功能就是对存储设备的扇区进行管理,将这些扇区的访问变成了对目录和文件名的访问。我们在上层按照特定的目录和文件名去访问一个文件时,文件系统会将这个目录+文件名转换成对扇区号的访问。
    最后,不同的文件系统的差异就在于对这些扇区的管理策略和方法不同,譬如坏块管理、碎片管理。

    4:根文件系统可以做成进行形式的烧录到flash中,也可以以文件夹的形式存在;

    镜像形式的话,就需要专门的制作工具来制作:

    如ext2、ext3、ext4格式的根文件系统需要 mke2fs这个工具来制作;可以参考这篇博客来制作ext2格式的根文件系统;

    http://blog.csdn.net/zhengmeifu/article/details/24174513

    制作最小的根文件系统:

    (1) mkdir rootfs (后面文件系统就挂载在这里)

    (2)dd if=/dev/zero of=rootfs.ext2 bs=1024 count=2408(2M大小)

    (3)losetup  /dev/loop1 rootfs.ext2 (如果loop0已被使用,可以使用loop1等。)

    (4)mke2fs -m 0 /dev/loop1 2048

    (5)mount -t ext2 /dev/loop1 ./rootfs/

    (6)我们向镜像中写入一个普通文件linuxrc。这个文件就会成为我们制作的镜像中的/linuxrc。内核挂载了这个镜像后就会尝试去执行/linuxrc。然后执行时必然会失败。我们将来实验看到的现象就应该是:挂载成功,执行/linuxrc失败。

    (7)将来真正去做有用的rootfs时,就要在这一步添加真正可以执行的linuxrc程序,然后还要添加别的/lib目录下的库文件,/etc目录下的配置文件等。
    (8)卸载掉,然后镜像就做好了。
    umount /dev/loop1
    losetup -d /dev/loop1

    进行试验:

    将制作好的rootfs.ext2 镜像烧录到iNand system分区中

    使用fastboot来烧录,

    打开开发板 在uboot、命令行下输入fastboot、进行分区;

    fastboot常用命令:
    fastboot devices 命令用来查看当前连接的设备。(我们开发板看到的是:SMDKC110-01)
    fastboot flash xxx 命令用来烧录的
    fastboot reboot 命令用来重启系统
    使用fastboot烧录android4.0.4镜像
    在cmd下使用以下三个命令来完成烧录
    fastboot flash bootloader android4.0/uboot.bin 烧uboot
    fastboot flash kernel android4.0/zImage-android 烧linux kernel
    fastboot flash system android4.0/x210.img 烧android rom

    fastboot flash system rootfs.ext2

    接下来修改bootargs环境变量;启动uboot 启动内核即可;

    bootargs为:set bootargs console=ttySAC2,115200 root=/dev/mmcblk0p2 rw init=/linuxrc rootfstype=ext2

    5:制作文件夹形式的根文件系统,文件夹根文件系统是通过nfs来链接的:

    为何要挂载NFS分区?

    答:可以将PC机的一个目录虚拟,通过网络共享给2410开发板载linux使用,省去了将程序烧入flash的烦恼

    介绍下如何挂载NFS分区

    准备工作

    首先要确定linux kernel在编译的时候是支持nfs功能的,

    make menuconfig

    networking support下面

    filesystem--->

      Network file systerms -->

        

    下面是支持的;

    1)安装nfs-kernel-server

    ubuntu下执行apt-get install nfs-kernel-server

    apt-get install nfs-utils

    2)在根目录建立nfs文件夹,也可以建立在其他地方

    3)Linux的IP为192.168.1.30

    4) 开发板的IP为192.168.1.10

     

    6)配置NFS服务器

    [root@localhost examples]# vi /etc/exports
    打开配置文件后,一般空空如也,自己写,写入以下配置信息:

    /usr/bhc/rootfs/rootfs *(rw,sync,no_root_squash,no_subtree_check)

    注意*与(之间没有空格,()里面也没有空格

    解析:

    /usr/bhc/rootfs/rootfs          -->共享的文件夹路径

    192.168.1.*                         -->允许访问的IP号,当然也可以具体指定一个,比如192.168.2.11

     (rw,sync,no_root_squash)  -->权限等,具体参数的意思可以百度

    所以配置信息还是比较简单。

    重启rpcbind 服务    /etc/init.d/rpcbind restart

    [ ok ] Restarting rpcbind (via systemctl): rpcbind.service.

    重启nfs服务  /etc/init.d/nfs-kernel-server restart

    [ ok ] Restarting nfs-kernel-server (via systemctl): nfs-kernel-server.service

    测试是否挂载成功 showmount localhost -e 

    Export list for localhost:
    /usr/bhc/rootfs/rootfs *

    挂载到/opt目录下看是否挂载成功

    mount -t nfs -o nolock localhost:/usr/bhc/rootfs/rootfs /opt 

    删除挂载

    umount /opt

  • 相关阅读:
    stm32 IO模式
    stm32的ADC
    bsp
    stm32的硬件调试设置
    RTC实时时钟
    快手2019笔试题 “回文子串" 解题思路
    C++内存修改器开源代码
    FC游戏修改教程(hack)小白文。
    GLFW+GLEW搭建opengl环境(备忘)
    8086 IO读写操作
  • 原文地址:https://www.cnblogs.com/biaohc/p/6542614.html
Copyright © 2011-2022 走看看