Linux 根文件系统的挂载分析

在介绍根文件系统挂载之前先介绍一些基础知识

initramfs

当linux内核启动后,会找到并执行第一个用户程序,一般是init。这个程序存在于文件系统当中,文件系统存在于设备上,但不知道init存在哪个设备上,于是有了内核命令列选项root=,用来指定root文件系统存在于哪个设备上。

然后由于后来的设备类型越来越来多,比如可能在scsi,sata,flash这些设备,还有的存在于网络设备上,不可能把这些设备的驱动编译进内核,这样内核就会越来越来大。为了解决这些问题,出现了基于ram的文件系统,initramfs,这个文件系统可以包含多个目录和程序init,然后通过这个程序,内核再用这个程序去挂载真正的要文件系统。如果没有这个程序,内核可以来寻找和挂载一个根分区,接着执行一些/sbin/init的变种。

ramfs

ramf是一个小型的基于内存的文件系统,由于linux中页的数据被缓存在内存中,然后标识为可用,为防止别用,ramfs就是基于这种机制产生的。只是放在ramfs中的目录和页的缓存,不在写回。

rootfs

rootfs是一种特定的ramfs的实例,它一直存在于系统中,不能卸载。大部分其他的文件系统安装于rootfs之上。

initramfs和rootfs之间的关系

当内核启动的时候,会先注册和挂载一个虚拟的根文件系统,也就是rootfs,然后会把做好的initramfs(这个可以自己制作)中的文件解压到rootfs中。然后系统会挂载真的根文件系统,rootfs隐藏之后。

我的开发板上的u-boot传送的参数为noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0,115200 mem=64M。

noinitrd的含义

(仅当内核配置了选项 CONFIG_BLK_DEV_RAM和CONFIG_BLK_DEV_INITRD)现在的内核都可以支持initrd了,引导进程首先装载内核和一个初始化的ramdisk,然后内核将initrd转换成普通的ramdisk,也就是读写模式的根文件系统设备。然后linuxrc执行,然后装载真正的根文件系统,之后ramdisk被卸载,最后执行启动序列,比如/sbin/init。

选项noinitrd告诉内核不执行上面的步骤,即使内核编译了initrd,而是把initrd的数据写到 /dev/initrd,只是这是一个一次性的设备。

01void __init vfs_caches_init(unsigned long mempages)

02{

03    unsigned long reserve;

04

05    /* Base hash sizes on available memory, with a reserve equal to

06           150% of current kernel size */

07

08    reserve = min((mempages - nr_free_pages()) * 3/2, mempages - 1);

09    mempages -= reserve;

10

11    names_cachep = kmem_cache_create("names_cache", PATH_MAX, 0,

12                  SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL);

13

14    dcache_init();

15    inode_init();

16    files_init(mempages);

17    mnt_init();

18    bdev_cache_init();

19    chrdev_init();

20}

第14行为页目录缓存的初始化

第15行索引结点缓存的初始化

第16行文件的初始化

第17行虚拟文件系统挂载的初始化

第18行块设备缓存初始化。

第19行字符设备初始化

01void __init mnt_init(void)

02{

03    unsigned u;

04    int err;

05

06    init_rwsem(&namespace_sem);

07

08    mnt_cache = kmem_cache_create("mnt_cache", sizeof(struct vfsmount),

09                  0, SLAB_HWCACHE_ALIGN | SLAB_PANIC, NULL);

10

11    mount_hashtable = (struct list_head *)__get_free_page(GFP_ATOMIC);

12

13    if (!mount_hashtable)

14           panic("Failed to allocate mount hash table\n");

15

16    printk("Mount-cache hash table entries: %lu\n", HASH_SIZE);

17

18    for (u = 0; u < HASH_SIZE; u++)

19           INIT_LIST_HEAD(&mount_hashtable[u]);

20

21    err = sysfs_init();

22    if (err)

23           printk(KERN_WARNING "%s: sysfs_init error: %d\n",

24                  __func__, err);

25    fs_kobj = kobject_create_and_add("fs", NULL);

26    if (!fs_kobj)

27           printk(KERN_WARNING "%s: kobj create error\n", __func__);

28    init_rootfs();

29    init_mount_tree();

30}

第6行命明空间信号量的初始化

第8行分配空间

第11行挂载点哈希表分配空间

第18行初始化所有的挂载点哈希表。

第25行生成名为fs的kobject对象。

第28行初始化rootfs文件系统

第29行初始化mount树

第一部分 rootfs文件系统的注册

01int __init init_rootfs(void)

02{

03    int err;

04

05    err = bdi_init(&ramfs_backing_dev_info);

06    if (err)

07           return err;

08

09    err = register_filesystem(&rootfs_fs_type);

10    if (err)

11           bdi_destroy(&ramfs_backing_dev_info);

12

13    return err;

14}

第5行初始化

第9行注册rootfs文件系统

1static struct file_system_type rootfs_fs_type = {

2     .name             = "rootfs",

3     .get_sb           = rootfs_get_sb,

4     .kill_sb    = kill_litter_super,

5};

第二部分挂载rootfs文件和创建根目录

01static void __init init_mount_tree(void)

02{

03    struct vfsmount *mnt;

04    struct mnt_namespace *ns;

05    struct path root;

06

07    mnt = do_kern_mount("rootfs", 0, "rootfs", NULL);

08    if (IS_ERR(mnt))

09           panic("Can't create rootfs");

10    ns = kmalloc(sizeof(*ns), GFP_KERNEL);

11    if (!ns)

12           panic("Can't allocate initial namespace");

13    atomic_set(&ns->count, 1);

14    INIT_LIST_HEAD(&ns->list);

15    init_waitqueue_head(&ns->poll);

16    ns->event = 0;

17    list_add(&mnt->mnt_list, &ns->list);

18    ns->root = mnt;

19    mnt->mnt_ns = ns;

20

21    init_task.nsproxy->mnt_ns = ns;

22    get_mnt_ns(ns);

23

24    root.mnt = ns->root;

25    root.dentry = ns->root->mnt_root;

26    set_fs_pwd(current->fs, &root);

27    set_fs_root(current->fs, &root);

28}

这个函数的主要作用是是生成/目录的。

第3行定义一个挂载点

第4行定义一个命名空间

第5行定义一个根路径

第7行挂载rootfs文件系统,返回挂载点

第10行为命名空间分配空间

第13行设定命名空间的引用数为1

第14行初始化命名空间链表

第15行初始化等待对列

第18行命名空间的根结点指向挂载点

第19行挂载点指向命名空间

第21行第一个进程的命名空间第向刚才初始化的。

第24行路径的挂载点为命名空间的根结点

第25行路径的目录为命名空间所指向的挂载点的根目录

第26行设置/目录为当前的目录

第27行设置/目录为根目录

01struct vfsmount * do_kern_mount(const char *fstype, int flags, const char *name, void *data)

02{

03    struct file_system_type *type = get_fs_type(fstype);

04    struct vfsmount *mnt;

05

06    if (!type)

07           return ERR_PTR(-ENODEV);

08    mnt = vfs_kern_mount(type, flags, name, data);

09

10    if (!IS_ERR(mnt) && (type->fs_flags & FS_HAS_SUBTYPE) &&

11        !mnt->mnt_sb->s_subtype)

12           mnt = fs_set_subtype(mnt, fstype);

13    put_filesystem(type);

14    return mnt;

15}

do_kern_mount的参数介绍

fstype 要安装的文件系统的类型名

flag   安装的标志

name  存放文件系统的块设备的路径名

data    指向传递给文件系统中read_super方法的附加指针

第3行得到文件系统的类型,这里是rootfs,当然也会有其它的文件系统,比如proc,pipefs等

第8行返回挂载点

第13行增加对文件系统的引用

01struct vfsmount *

02vfs_kern_mount(struct file_system_type *type, int flags, const char *name, void *data)

03{

04    struct vfsmount *mnt;

05    char *secdata = NULL;

06    int error;

07

08    if (!type)

09           return ERR_PTR(-ENODEV);

10

11    error = -ENOMEM;

12    mnt = alloc_vfsmnt(name);

13    if (!mnt)

14           goto out;

15

16    if (data && !(type->fs_flags & FS_BINARY_MOUNTDATA)) {

17           secdata = alloc_secdata();

18           if (!secdata)

19                  goto out_mnt;

20

21           error = security_sb_copy_data(data, secdata);

22           if (error)

23                  goto out_free_secdata;

24    }

25

26    error = type->get_sb(type, flags, name, data, mnt);

27    if (error < 0)

28           goto out_free_secdata;

29    BUG_ON(!mnt->mnt_sb);

30

31   error = security_sb_kern_mount(mnt->mnt_sb, flags, secdata);

32   if (error)

33          goto out_sb;

34

35    mnt->mnt_mountpoint = mnt->mnt_root;

36    mnt->mnt_parent = mnt;

37    up_write(&mnt->mnt_sb->s_umount);

38    free_secdata(secdata);

39    return mnt;

40out_sb:

41    dput(mnt->mnt_root);

42    deactivate_locked_super(mnt->mnt_sb);

43out_free_secdata:

44    free_secdata(secdata);

45out_mnt:

46    free_vfsmnt(mnt);

47out:

48    return ERR_PTR(error);

49}

第4行定义挂载点

第12行分配一个新的已安装文件系统的描述符,存放在局部变量mnt中

第26行调用文件系统get_sb回调函数,这里是rootfs_get_sb,来初始化一个新的超级块,同时会创建/目录.后面会单独介绍

第35行挂载点根目录指向与文件系统根目录对应的目录项对象的地址

第36行挂载点父目录指向自己

第39行返回局部变量mnt


第三部分解压initramfs文件系统中的内容到rootfs

01static int __init populate_rootfs(void)

02{

03    char *err = unpack_to_rootfs(__initramfs_start,

04                  __initramfs_end - __initramfs_start);

05    if (err)

06           panic(err);      /* Failed to decompress INTERNAL initramfs */

07    if (initrd_start) {

08#ifdef CONFIG_BLK_DEV_RAM

09           int fd;

10           printk(KERN_INFO "Trying to unpack rootfs image as initramfs...\n");

11           err = unpack_to_rootfs((char *)initrd_start,

12                  initrd_end - initrd_start);

13           if (!err) {

14                  free_initrd();

15                  return 0;

16           } else {

17                  clean_rootfs();

18                  unpack_to_rootfs(__initramfs_start,

19                         __initramfs_end - __initramfs_start);

20           }

21           printk(KERN_INFO "rootfs image is not initramfs (%s)"

22                         "; looks like an initrd\n", err);

23           fd = sys_open("/initrd.image", O_WRONLY|O_CREAT, 0700);

24           if (fd >= 0) {

25                  sys_write(fd, (char *)initrd_start,

26                                initrd_end - initrd_start);

27                  sys_close(fd);

28                  free_initrd();

29           }

30#else

31           err = unpack_to_rootfs((char *)initrd_start,

32                  initrd_end - initrd_start);

33           if (err)

34                  printk(KERN_EMERG "Initramfs unpacking failed: %s\n", err);

35           free_initrd();

36#endif

37    }

38    return 0;

39}

第3行解压initramfs文件到rootfs文件系统中,第一个参数为开始位置,第二个参数为长度。

第7行initrd_start值为0,下面不执行

01static int __init kernel_init(void * unused)

02{

03    ............

04    do_basic_setup();

05    /*

06    * check if there is an early userspace init.  If yes, let it do all

07    * the work

08    */

09

10    if (!ramdisk_execute_command)

11           ramdisk_execute_command = "/init";

12

13    if (sys_access((const char __user *) ramdisk_execute_command, 0) != 0) {

14           ramdisk_execute_command = NULL;

15   

16    prepare_namespace();

17    }

18

19    /*

20    * Ok, we have completed the initial bootup, and

21    * we're essentially up and running. Get rid of the

22    * initmem segments and start the user-mode stuff..

23    */

24

25    init_post();

26    return 0;

27}

第4行初始化init段里面的函数

第10行判断ramdisk_execute_command的值,如果为空,就给它赋于/init,这个也是启动是第一个进程。

第13行如果这个init个程序,访问它,其实也就是initramfs里面解压出来有这个程序的话,就不用再执行下面的函数,用这个init进程可以挂载真正的根文件系统。

第16行为进程0准备命名空间

第25行进行真正根文件系统中的init进程运行

第四部分准备命名空间,挂载flash上的根文件系统

01void __init prepare_namespace(void)

02{

03    int is_floppy;

04    if (root_delay) {

05           printk(KERN_INFO "Waiting %dsec before mounting root device...\n",

06                  root_delay);

07           ssleep(root_delay);

08    }

09

10    /*

11    * wait for the known devices to complete their probing

12    *

13    * Note: this is a potential source of long boot delays.

14    * For example, it is not atypical to wait 5 seconds here

15    * for the touchpad of a laptop to initialize.

16    */

17    wait_for_device_probe();

18

19    md_run_setup();

20

21    if (saved_root_name[0]) {

22           root_device_name = saved_root_name;

23           if (!strncmp(root_device_name, "mtd", 3) ||

24               !strncmp(root_device_name, "ubi", 3)) {

25                  mount_block_root(root_device_name, root_mountflags);

26                  goto out;

27           }

28           ROOT_DEV = name_to_dev_t(root_device_name);

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

30                  root_device_name += 5;

31}

32

33    if (initrd_load())

34                  goto out;

35

36    /* wait for any asynchronous scanning to complete */

37    if ((ROOT_DEV == 0) && root_wait) {

38           printk(KERN_INFO "Waiting for root device %s...\n",

39                  saved_root_name);

40           while (driver_probe_done() != 0 ||

41                  (ROOT_DEV = name_to_dev_t(saved_root_name)) == 0)

42                  msleep(100);

43           async_synchronize_full();

44    }

45

46    is_floppy = MAJOR(ROOT_DEV) == FLOPPY_MAJOR;

47

48    if (is_floppy && rd_doload && rd_load_disk(0))

49           ROOT_DEV = Root_RAM0;

50

51    mount_root();

52out:

53    sys_mount(".", "/", NULL, MS_MOVE, NULL);

54    sys_chroot(".");

55}

第21行检查saved_root_name是否为真,这里是有值的。

第22行把它赋给root_device_name,此时为/dev/mtdblock3

第23-27行不执行

第25行挂载根文件系统

第28行名字到设备号的转变,这个设备号是设备的设备号,下面会用到的。我这里是flash的第三个分区

第29行/dev/mtdblock3的前5个字符与/dev/比较,这里是相等的。

第30行root_device_name加5,所以此时root_device_name为mtdblock3.

第37-44行由于设备号不为0,所以这里面没有执行。

第53行移动根文件系统的根目录为/

01void __init mount_block_root(char *name, int flags)

02{

03    char *fs_names = __getname();

04    char *p;

05#ifdef CONFIG_BLOCK

06    char b[BDEVNAME_SIZE];

07#else

08    const char *b = name;

09#endif

10

11    get_fs_names(fs_names);

12retry:

13    for (p = fs_names; *p; p += strlen(p)+1) {

14           int err = do_mount_root(name, p, flags, root_mount_data);

15           switch (err) {

16                  case 0:

17                         goto out;

18                  case -EACCES:

19                         flags |= MS_RDONLY;

20                         goto retry;

21                  case -EINVAL:

22                         continue;

23           }

24            /*

25           * Allow the user to distinguish between failed sys_open

26           * and bad superblock on root device.

27           * and give them a list of the available devices

28           */

29#ifdef CONFIG_BLOCK

30           __bdevname(ROOT_DEV, b);

31#endif

32           printk("VFS: Cannot open root device \"%s\" or %s\n",

33                         root_device_name, b);

34           printk("Please append a correct \"root=\" boot option; here are the available partitions:\n");

35

36           printk_all_partitions();

37#ifdef CONFIG_DEBUG_BLOCK_EXT_DEVT

38           printk("DEBUG_BLOCK_EXT_DEVT is enabled, you need to specify "

39                  "explicit textual name for \"root=\" boot option.\n");

40#endif

41           panic("VFS: Unable to mount root fs on %s", b);

42    }

43

44    printk("List of all partitions:\n");

45    printk_all_partitions();

46    printk("No filesystem could mount root, tried: ");

47    for (p = fs_names; *p; p += strlen(p)+1)

48           printk(" %s", p);

49    printk("\n");

50#ifdef CONFIG_BLOCK

51    __bdevname(ROOT_DEV, b);

52#endif

53    panic("VFS: Unable to mount root fs on %s", b);

54out:

55    putname(fs_names);

56}

第3行申请空间

第11行fs_name指向内核里面编译文件系统的第一个

第13行循环把这些文件系统挂到根目录下,我的内核里面分别有,ext3,ext3,vfat等,这里用到的是yaffs文件系统

第14行调用do_mount_root函数进行挂载

第15行返回的结果0

第17行增加对文件系统的引用

01static int __init do_mount_root(char *name, char *fs, int flags, void *data)

02{

03    int err = sys_mount(name, "/root", fs, flags, data);

04    if (err)

05           return err;

06

07    sys_chdir("/root");

08    ROOT_DEV = current->fs->pwd.mnt->mnt_sb->s_dev;

09    printk("VFS: Mounted root (%s filesystem)%s on device %u:%u.\n",

10           current->fs->pwd.mnt->mnt_sb->s_type->name,

11           current->fs->pwd.mnt->mnt_sb->s_flags & MS_RDONLY ?

12           " readonly" : "", MAJOR(ROOT_DEV), MINOR(ROOT_DEV));

13    return 0;

14}

第3行挂载文件系统,这里的name为/dev/root,fs为文件的类型,这里是yaffs2,文件类型当然还是ext3,ext2等。

第7行改变到/root目录下

第9行分别显示出挂载出根文件系统和主次设备号,这里是yaffs文件系统,主:次31:3

01void __init mount_root(void)

02{

03#ifdef CONFIG_ROOT_NFS

04    if (MAJOR(ROOT_DEV) == UNNAMED_MAJOR) {

05           if (mount_nfs_root())

06                  return;

07

08           printk(KERN_ERR "VFS: Unable to mount root fs via NFS, trying floppy.\n");

09           ROOT_DEV = Root_FD0;

10    }

11#endif

12#ifdef CONFIG_BLK_DEV_FD

13    if (MAJOR(ROOT_DEV) == FLOPPY_MAJOR) {

14           /* rd_doload is 2 for a dual initrd/ramload setup */

15           if (rd_doload==2) {

16                  if (rd_load_disk(1)) {

17                         ROOT_DEV = Root_RAM1;

18                         root_device_name = NULL;

19                  }

20           } else

21                  change_floppy("root floppy");

22    }

23#endif

24#ifdef CONFIG_BLOCK

25    create_dev("/dev/root", ROOT_DEV);

26    mount_block_root("/dev/root", root_mountflags);

27#endif

28}

这里只执行了CONFI_BLOCK宏开关

第25行创建设备结点,这里我在ubutu上测试了一下,/dev/root是的连接是hda1

第26行挂载根文件系统

第五部分运行真正根目录中的init程序

01static noinline int init_post(void)

02    __releases(kernel_lock)

03{

04    /* need to finish all async __init code before freeing the memory */

05    async_synchronize_full();

06    free_initmem();

07    unlock_kernel();

08    mark_rodata_ro();

09    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.\n");

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\n",

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...\n", 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}

第12行打开/dev/console设备文件

第15-16行将文件描述符0复制给文件描述符1和2。

第20-24行ramdisk_execute_command变量中如果指定了要运行的程序,就开始运行这个程序,在u-boot的命令行参数中会指定rdinit=…,这个时候ramdisk_execute_command等于这个参数指定的程序。也可能/init程序存在,哪么ramdisk_execute_command就等于/init,或者为空。本程序没有指定,所以这里为空。

第37行执行/sbin/init程序,这个程序存在于根文件系统,如果存在,执行它,系统的控制权交给/sbin/init,不再返回init_post函数


http://www.linuxidc.com/Linux/2011-10/45448.htm


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux系统移植 目 录 第一部分 前言....................................................................................................................................8 1 硬件环境......................................................................................................................................8 1.1 主机硬件环境.......................................................................................................................8 1.2 目标板硬件环境...................................................................................................................8 1.3 工具介绍...............................................................................................................................8 2 软件环境.......................................................................................................................................8 2.1 主机软件环境.......................................................................................................................8 2.1.1 Windows 操作系统.......................................................................................................8 2.1.2 Linux 操作系统 .......................................................................................................8 2.1.3 目标板最后运行的环境...............................................................................................9 2.2 Linux 下工作用户及环境....................................................................................................9 2.2.1 交叉工具的安装...........................................................................................................9 2.2.2 u­boot移植工作目录....................................................................................................9 2.2.3 内核及应用程序移植工作...........................................................................................9 2.3 配置系统服务.....................................................................................................................10 2.3.1 tftp 服务器的配置.......................................................................................................10 2.4 工具使用.............................................................................................................................12 2.4.1 minicom的使用..........................................................................................................12 3 作者介绍....................................................................................................................................13 3.1 策划, 组织, 指导, 发布者...................................................................................................13 3.2 ADS bootloader部分..........................................................................................................13 3.3 交叉工具部分.....................................................................................................................13 3.4 uboot 部分...........................................................................................................................13 3.5 内核部分.............................................................................................................................13 3.6 应用程序部分.....................................................................................................................13 3.7 网卡驱动部分.....................................................................................................................13 3.8 Nand Flash 驱动部分.........................................................................................................13 第二部分 系统启动bootloader 的编写(ADS).................................................................................14 1 工具介绍....................................................................................................................................14 1.1 ADS 命令行命令介绍........................................................................................................14 1.1.1 armasm........................................................................................................................14 1.1.2 armcc, armcpp.............................................................................................................14 1.1.3 armlink.........................................................................................................................14 2 基本原理....................................................................................................................................15 2.1 可执行文件组成及内存映射.............................................................................................15 2.1.1 可执行文件的组成.....................................................................................................15 2.1.2 装载过程.....................................................................................................................16 2.1.3 启动过程的汇编部分.................................................................................................17 2.1.4 启动过程的 C部分.....................................................................................................17 3 AXD的使用以及源代码说明...................................................................................................18 3.1 源代码说明.........................................................................................................................18 3.1.1 汇编源代码说明.........................................................................................................18 3.1.2 C语言源代码说明......................................................................................................23 3.1.3 源代码下载.................................................................................................................23 3.2 AXD的使用.......................................................................................................................23 3.2.1 配置仿真器.................................................................................................................23 3.2.2 启动 AXD 配置开发板...............................................................................................23 第三部分 GNU交叉工具链.............................................................................................................25 1  设置环境变量,准备源码及相关补丁...................................................................................25 1.1 设置环境变量.....................................................................................................................25 1. 2 准备源码包............................................................................................................................25 1.2.1 binuils..........................................................................................................................25 1.2.2 gcc...............................................................................................................................25 1.2.3 glibc.............................................................................................................................25 1.2.4 linux kernel..................................................................................................................26 1.3 准备补丁.............................................................................................................................26 1.3.1 ioperm.c.diff................................................................................................................26 1.3.2 flow.c.diff....................................................................................................................26 1.3.3 t­linux.diff....................................................................................................................26 1.4   编译 GNU binutils...........................................................................................................26 1.5 准备内核头文件.................................................................................................................26 1.5.1 使用当前平台的 gcc编译内核头文件......................................................................26 1.5.2 复制内核头文件.........................................................................................................27 1.6   译编glibc头文件.............................................................................................................27 1.7   编译gcc第一阶段............................................................................................................27 1.8   编译完整的glibc..............................................................................................................27 1.9  编译完整的gcc.................................................................................................................28 2 GNU 交叉工具链的下载...........................................................................................................28 2.1 ARM 官方网站...................................................................................................................28 2.2 本文档提供的下载.............................................................................................................28 3 GNU 交叉工具链的介绍与使用...............................................................................................29 3.1 常用工具介绍.....................................................................................................................29 3.2.1 arm­linux­gcc的使用.................................................................................................29 3.2.2 arm­linux­ar 和 arm­linux­ranlib 的使用..................................................................30 3.2.3 arm­linux­objdump 的使用.........................................................................................30 3.2.4 arm­linux­readelf 的使用............................................................................................31 3.2.6 arm­linux­copydump 的使用......................................................................................32 4 ARM GNU 常用汇编语言介绍.................................................................................................32 4.1 ARM GNU常用汇编伪指令介绍.....................................................................................32 4.2 ARM GNU专有符号.........................................................................................................33 4.3 操作码.................................................................................................................................33 5 可执行生成说明........................................................................................................................33 5.1 lds文件说明.......................................................................................................................33 5.1.1 主要符号说明.............................................................................................................33 5.1.2 段定义说明.................................................................................................................34 第四部分 u­boot 的移植...................................................................................................................35 1 u­boot的介绍及系统结构.........................................................................................................35 1.1 u­boot 介绍.........................................................................................................................35 1.2 获取u­boot.........................................................................................................................35 1.3 u­boot 体系结构.................................................................................................................35 1.3.1 u­boot目录结构..........................................................................................................35 2 uboot的启动过程及工作原理...................................................................................................36 2.1 启动模式介绍.....................................................................................................................36 2.2 阶段1 介绍.........................................................................................................................36 2.2.1 定义入口.....................................................................................................................36 2.2.2 设置异常向量.............................................................................................................37 2.2.3 设置 CPU的模式为SVC模式..................................................................................37 2.2.4 关闭看门狗.................................................................................................................37 2.2.5 禁掉所有中断.............................................................................................................37 2.2.6 设置以 CPU的频率....................................................................................................37 2.2.7 设置 CP15...................................................................................................................37 2.2.8 配置内存区控制寄存器.............................................................................................38 2.2.9 安装 U­BOOT 使的栈空间........................................................................................38 2.2.10 BSS 段清 0................................................................................................................38 2.2.11 搬移 Nand Flash 代码...............................................................................................39 2.2.12 进入 C代码部分.......................................................................................................39 2.3 阶段2 的C语言代码部分 .............................................................................................39 2.3.1 调用一系列的初始化函数.........................................................................................39 2.3.2 初始化网络设备.........................................................................................................41 2.3.3 进入主 UBOOT 命令行..............................................................................................41 2.4 代码搬运.............................................................................................................................41 3 uboot的移植过程.......................................................................................................................42 3.1 环境.....................................................................................................................................42 3.2 步骤.....................................................................................................................................42 3.2.1 修改 Makefile..............................................................................................................42 3.2.2 在 board 子目录中建立 crane2410.............................................................................42 3.2.3 在 include/configs/中建立配置头文件......................................................................42 3.2.4 指定交叉编译工具的路径.........................................................................................42 3.2.5 测试编译能否成功.....................................................................................................42 3.2.6 修改 lowlevel_init.S 文件...........................................................................................43 3.2.9 UBOOT 的 Nand Flash 移植......................................................................................45 3.2.8 重新编译u­boot..........................................................................................................45 3.2.9 把 u­boot烧入flash....................................................................................................45 4  U­BOOT 命令的使用................................................................................................................46 4.1 U­BOOT命令的介绍.........................................................................................................46 4.1.1 获得帮助信息.............................................................................................................46 4.2 常用命令使用说明.............................................................................................................47 4.2.1 askenv(F).....................................................................................................................47 4.2.2 autoscr.........................................................................................................................47 4.2.3 base   ...........................................................................................................................47 4.2.4 bdinfo...........................................................................................................................47 4.2.5 bootp............................................................................................................................47 4.2.8 tftp(tftpboot)................................................................................................................48 4.2.9 bootm...........................................................................................................................48 4.2.10 go...............................................................................................................................48 4.2.11 cmp   .........................................................................................................................48 4.2.12 coninfo  .....................................................................................................................48 4.2.13 cp...............................................................................................................................48 4.2.14 date............................................................................................................................49 4.2.15 erase(F)......................................................................................................................49 4.2.16 flinfo(F).....................................................................................................................49 4.2.17 iminfo........................................................................................................................49 4.2.18 loadb..........................................................................................................................49 4.2.19 md..............................................................................................................................49 4.2.20 mm ............................................................................................................................50 4.2.21 mtest   .......................................................................................................................50 4.2.22 mw.............................................................................................................................50 4.2.23 nm   ...........................................................................................................................50 4.2.24 printenv......................................................................................................................50 4.2.25 ping  ..........................................................................................................................51 4.2.26 reset...........................................................................................................................51 4.2.27 run   ...........................................................................................................................51 4.2.28 saveenv(F).................................................................................................................51 4.2.29 setenv.........................................................................................................................51 4.2.30 sleep...........................................................................................................................51 4.2.31 version.......................................................................................................................51 4.2.32 nand info....................................................................................................................51 4.2.33 nand device ........................................................................................................51 4.2.34 nand bad....................................................................................................................51 4.2.35 nand read...................................................................................................................52 4.2.36 nand erease................................................................................................................52 4.2.37 nand write..................................................................................................................52 4.3 命令简写说明.....................................................................................................................52 4.4 把文件写入NandFlash.......................................................................................................53 4.5 下载提供.............................................................................................................................53 5 参考资料....................................................................................................................................53 第五部分 linux 2.6 内核的移植.......................................................................................................53 1 内核移植过程............................................................................................................................53 1.1 下载linux 内核...................................................................................................................53 1.2 修改Makefile.....................................................................................................................53 1.3 设置flash 分区...................................................................................................................54 1.3.1 指明分区信息.............................................................................................................54 1.3.2 指定启动时初始化.....................................................................................................56 1.3.3 禁止 Flash ECC校验 ................................................................................................56 1.4 配置内核.............................................................................................................................56 1.4.1 支持启动时挂载 devfs................................................................................................56 1.4.2 配置内核产生.config 文件.........................................................................................57 1.4.3 编译内核.....................................................................................................................58 1.4.4 下载 zImage到开发板................................................................................................58 2 创建 uImage................................................................................................................................61 2.1 相关技术背景介绍.............................................................................................................61 2.2 在内核中创建uImage 的方法...........................................................................................61 2.2.1 获取 mkimage工具.....................................................................................................61 2.2.2 修改内核的 Makefile文件.........................................................................................61 3 追加实验记录.............................................................................................................................62 3.1 移植 linux­2.6.15.7..............................................................................................................62 3.2 移植 linux­2.6.16.21............................................................................................................62 3.3 移植linux­2.6.17................................................................................................................62 4 参考资料....................................................................................................................................62 第六部分 应用程序的移植..............................................................................................................63 1 构造目标板的目录及文件系统.............................................................................................63 1.1 建立一个目标板的空目录.............................................................................................63 1.2 在 my_rootfs 中建立Linux 目录树...................................................................................63 1.3 创建linuxrc文件................................................................................................................63 2 移植 Busybox.............................................................................................................................64 2.1 下载busybox......................................................................................................................64 2.3 编译并安装Busybox..........................................................................................................65 3 移植 TinyLogin...........................................................................................................................66 3.1 下载.....................................................................................................................................66 3.2 修改tinyLogin 的 Makefile................................................................................................66 3.3 编译并安装.........................................................................................................................66 4 相关配置文件的创建................................................................................................................66 4.1 创建帐号及密码文件.........................................................................................................66 4.2 创建profile文件................................................................................................................67 4.4 创建fstab 文件...................................................................................................................67 4.5 创建inetd.conf 配置文件...................................................................................................67 5 移植 inetd....................................................................................................................................67 5.1 inetd 的选择及获取............................................................................................................67 5.1.1 获取 inetd....................................................................................................................67 5.2 编译inetd............................................................................................................................67 5.2.1 修改 configure文件....................................................................................................67 5.2.2 编译 ...........................................................................................................................68 5.3 配置inetd............................................................................................................................68 5.3.1 拷贝 inetd 到文件系统的usr/sbin 目录中.............................................................68 6 移植 thttpd Web 服务器.............................................................................................................69 6.1 下载.....................................................................................................................................69 6.2 编译thttpd...........................................................................................................................69 6.3 配置.....................................................................................................................................69 6.3.1 拷贝 thttpd 二进制可执行文件到文件系统/usr/sbin/目录中...............................69 6.3.2 修改 thttpd 配置文件..................................................................................................69 6.3.3 转移到文件系统目录,创建相应的文件.............................................................69 7 建立目录文件系统包............................................................................................................70 7.1 建立CRAMFS 包...............................................................................................................70 7.1.1 下载 cramfs 工具........................................................................................................70 7.1.2 制作 cramfs 包............................................................................................................70 7.1.3 写 cramfs 包到Nand Flash.........................................................................................70 8 参考资料....................................................................................................................................70 第七部分 Nand flash 驱动的编写与移植........................................................................................71 1 Nand flash 工作原理..................................................................................................................71 1.1 Nand flash 芯片工作原理..................................................................................................71 1.1.1 芯片内部存储布局及存储操作特点.........................................................................71 1.1.2 重要芯片引脚功能.....................................................................................................71 1.1.3 寻址方式.....................................................................................................................71 1.1.4 Nand flash 主要内设命令详细介绍...........................................................................72 1.2 Nand Flash 控制器工作原理.............................................................................................72 1.2.1 Nand Flash 控制器特性..............................................................................................72 1.2.2 Nand Flash 控制器工作原理......................................................................................72 1.3 Nand flash 控制器中特殊功能寄存器详细介绍 ............................................................72 1.4 Nand Flash 控制器中的硬件ECC介绍............................................................................73 1.4.1 ECC产生方法............................................................................................................73 1.4.2 ECC生成器工作过程................................................................................................74 1.4.3 ECC的运用................................................................................................................74 2 在 ADS下flash 烧写程序.........................................................................................................74 2.1 ADS 下 flash 烧写程序原理及结构...................................................................................74 2.2 第三层实现说明.................................................................................................................74 2.1.1 特殊功能寄存器定义.................................................................................................74 2.1.2 操作的函数实现.........................................................................................................74 2.3 第二层实现说明.................................................................................................................75 2.3.1 Nand Flash 初始化......................................................................................................75 2.3.3 获取 Nand flash ID......................................................................................................75 2.3.4 Nand flash 写入...........................................................................................................76 2.3.5 Nand flash 读取...........................................................................................................77 2.3.6 Nand flash 标记坏块...................................................................................................78 2.3.7 Nand Flash 检查坏块..................................................................................................79 2.3.8 擦除指定块中数据.....................................................................................................79 2.4  第一层的实现....................................................................................................................80 3 在 U­BOOT 对Nand Flash 的支持............................................................................................82 3.1 U­BOOT对从 Nand Flash 启动的支持.............................................................................82 3.1.1 从 Nand Flash 启动U­BOOT 的基本原理................................................................82 3.1.2 支持 Nand Flash 启动代码说明.................................................................................82 3.2 U­BOOT对 Nand Flash 命令的支持.................................................................................84 3.2.1 主要数据结构介绍.....................................................................................................84 3.2.2 支持的命令函数说明.................................................................................................85 4 在 Linux 对Nand Flash 的支持.................................................................................................87 4.1 Linux 下Nand Flash 调用关系..........................................................................................87 4.1.1 Nand Flash 设备添加时数据结构包含关系..............................................................87 4.1.2 Nand Flash 设备注册时数据结构包含关系..............................................................87 4.2 Linux 下Nand Flash 驱动主要数据结构说明..................................................................88 4.2.1 s3c2410 专有数据结构...............................................................................................88 4.2.2 Linux 通用数据结构说明..........................................................................................89 4.3.1 注册 driver_register....................................................................................................94 4.3.2 探测设备 probe...........................................................................................................94 4.3.3 初始化 Nand Flash 控制器.........................................................................................94 4.3.4 移除设备.....................................................................................................................94 4.3.5 Nand Flash 芯片初始化..............................................................................................94 4.3.6  读 Nand  Flash............................................................................................................95 4.3.7  写 Nand Flash.............................................................................................................95 第八部分 Cs8900a网卡驱动的编写与移植...................................................................................95 1 Cs8900a工作原理......................................................................................................................95 2 在 ADS下cs8900a的实现........................................................................................................95 2.1 在 cs8900a下实现的ping 工具.........................................................................................95 3 在 u­boot下cs8900a的支持......................................................................................................96 3.1 u­boot 下cs8900a的驱动介绍...........................................................................................96 3.2 u­boot 下cs8900a的移植说明...........................................................................................96 4 在 linux 下cs8900a驱动的编写与移植....................................................................................96 4.1 Linux 下cs8900a的驱动说明............................................................................................96 4.2 Linux 下 cs8900a的移植说明...........................................................................................96 4.2.1 为 cs8900a建立编译菜单..........................................................................................96 4.2.2 修改 S3C2410相关信息............................................................................................97 序 该文档的目的是总结我们在工作中的一些经验,并把它们分享给喜欢 ARM 和 Linux 的朋友, 如有错误 之处,请大家多多指点. 同样, 我们也希望更多人能把自己的工作经验和体会加入该文档,让大家共同进步. 该文档是一份交流性文档, 只供个人学习与交流,不允许公司和企业用于商业行为
### 回答1: 抱歉,我无法提供PPT文档。但是,我可以为您提供关于嵌入式Linux操作系统的一些基本信息。 嵌入式Linux操作系统是一种适用于嵌入式设备的操作系统。它具有轻量级、可定制、模块化等特点,可以在各种不同的硬件平台上使用。 嵌入式Linux操作系统通常包括以下组成部分: - 内核:嵌入式Linux操作系统的核心部分,负责管理硬件设备和提供基本的系统功能。 - 文件系统:包含操作系统所需的所有文件和目录,通常以只读方式挂载在系统中。 - 应用程序:嵌入式Linux操作系统可以运行各种应用程序,例如网络服务、媒体播放器、传感器控制等。 开发嵌入式Linux操作系统需要具备以下技能: - 熟悉Linux操作系统和命令行工具。 - 掌握C/C++编程语言。 - 熟悉嵌入式系统开发中的硬件和软件交互。 - 了解嵌入式Linux操作系统的构建和定制方法。 总之,嵌入式Linux操作系统是嵌入式系统开发中非常重要的一部分,掌握相关知识可以帮助开发者更好地实现自己的嵌入式设备。 ### 回答2: 嵌入式Linux操作系统是一种能够在嵌入式设备上运行的操作系统。它具有轻巧、高效、灵活等特点,适用于各种嵌入式系统,如智能手机、平板电脑、数字电视、智能家居等。 嵌入式Linux操作系统的PPT主要包括以下内容: 1. 嵌入式Linux操作系统的概述:介绍嵌入式Linux操作系统的定义、特点、应用领域,以及与传统的桌面Linux操作系统的区别。 2. 嵌入式Linux操作系统的架构:介绍嵌入式Linux操作系统的基本架构,包括内核、设备驱动、文件系统等核心组件,以及应用程序开发的相关工具和技术。 3. 嵌入式Linux操作系统的开发流程:介绍嵌入式Linux操作系统的开发过程,包括系统需求分析、硬件平台选择、内核配置、驱动开发、应用程序开发等环节。 4. 嵌入式Linux操作系统的移植与定制:介绍如何将Linux操作系统移植到不同的硬件平台上,并据具体应用需求进行定制,包括内核裁剪、模块添加、驱动支持等内容。 5. 嵌入式Linux操作系统的性能优化与调优:介绍如何对嵌入式Linux操作系统进行性能优化和调优,包括资源管理、功耗管理、实时性能提升等方面。 此外,PPT可以结合案例分析、实例演示等方式,具体展示嵌入式Linux操作系统在不同嵌入式设备上的应用实例,以及相关的开发工具、框架和技术。 通过这样的PPT,可以让听众了解嵌入式Linux操作系统的基本概念和原理,了解其在嵌入式设备中的应用范围和开发流程,以及相关的开发工具和技术,进一步提升其对嵌入式Linux操作系统的理解和应用能力。 ### 回答3: 嵌入式Linux操作系统是一种在嵌入式系统中使用的操作系统,它可以运行在各种嵌入式设备上,如智能手机、平板电脑、智能家居设备等。相比于其他操作系统,嵌入式Linux具有以下几个特点。 首先,嵌入式Linux操作系统具有开源性。开源意味着用户可以自由地查看、修改和分发软件代码。这使得开发人员能够据具体需求进行定制和优化,提高系统性能和功能。 其次,嵌入式Linux操作系统具有可裁剪性。它允许用户据实际需求选择和配置需要的软件组件,从而减小系统占用资源和提高系统运行效率。这种可裁剪性可以满足不同嵌入式设备的特殊需求。 此外,嵌入式Linux操作系统具有高度的可扩展性。它提供了许多开放性的接口和调试工具,方便开发人员进行应用程序的开发和调试。同时,嵌入式Linux支持各种外围设备的驱动程序,使得开发人员可以方便地将系统与其他硬件设备进行连接和交互。 另外,嵌入式Linux操作系统具有强大的网络功能。它支持各种网络协议和通信接口,如以太网、Wi-Fi、蓝牙等,可以实现设备之间的互相通信和数据传输。 总体而言,嵌入式Linux操作系统具有开源性、可裁剪性、可扩展性和网络功能等特点,使得它成为嵌入式系统开发的首选操作系统。通过灵活的定制和优化,它能够满足不同类型的嵌入式设备的需求,并为开发人员提供方便的开发和调试环境。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值