Linux内核如何装载和启动一个可执行程序

徐晨 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

今天我们来看一下,Linux内核是如何装载和启动一个可执行程序的。

Linux下如何生成一个可执行程序

首先我们可以看一下,linux如何生成一个可执行程序。

chenxu@ ~/Code/kernel/lab7$ gcc -E -o test.cpp test.c -m32  //生成预处理中间文件,宏定义替换
chenxu@ ~/Code/kernel/lab7$ gcc -x cpp-output -S -o test.s test.cpp -m32 //编译过程,生成汇编代码
chenxu@ ~/Code/kernel/lab7$ gcc -x assembler -c test.s -o test.o -m32 //汇编器,将汇编文件生成目标文件
chenxu@ ~/Code/kernel/lab7$ gcc -o test test.o -m32  //链接成可执行文件,使用共享库
chenxu@ ~/Code/kernel/lab7$ gcc -o test.static test.o -m32 -static //执行静态链接 (libC)
chenxu@ ~/Code/kernel/lab7$ ls -lh
total 784K
-rwxrwxr-x 1 chenxu chenxu 7.3K  410 22:45 test
-rw-rw-r-- 1 chenxu chenxu  231  410 15:26 test.c
-rw-rw-r-- 1 chenxu chenxu  38K  410 22:43 test.cpp
-rw-rw-r-- 1 chenxu chenxu 1.3K  410 22:45 test.o
-rw-rw-r-- 1 chenxu chenxu 1.1K  410 22:44 test.s
-rwxrwxr-x 1 chenxu chenxu 723K  410 22:46 test.static

我们这里可以看到,在静态链接中,我们由于将libC的相关内容直接加入了可执行程序中,所以test.static的大小要远大于动态链接的可执行程序。

生成的可执行文件如果要运行,则需要操作系统将其加载到内存中去,为了搞明白其中的过程,我们可以先了解一下可执行文件的格式,可执行文件是一种目标文件,我们从目标文件开始分析。

目标文件的格式

目标代码(objectcode)指计算机科学中编译器或汇编器处理源代码后所生成的代码,它一般由机器代码或接近于机器语言的代码组成。目标文件(objectfile)即存放目标代码的计算机文件,它常被称作二进制文件(binaries),这种文件是体系结构相关的。Linux下的目标文件为ELF(Excutable and Linking Format)格式文件。格式如下:
ELF格式

Linux下存在三种类型的目标文件

1.可重定位目标文件(relocatable *.o)包含代码节和数据节。此文件适合与其他可重定位目标文件链接,从而创建动态可执行文件、共享目标文件或其他可重定位目标文件。

chenxu@ ~/Code/kernel/lab7$ file test.o // 可重定位目标文件不能直接执行
test.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped

2.动态可执行文件(executable)包含可随时执行的程序。此文件指定了 exec(2) 创建程序的进程映像的方式。此文件通常在运行时绑定到共享目标文件以创建进程映像。

chenxu@ ~/Code/kernel/lab7$ file test
test: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=8a7447dfa418772abf8f1935ceb4578c92769230, not stripped

3.共享目标文件文件(shared object *.so)包含适用于进行其他链接的代码和数据。链接编辑器可将此文件与其他可重定位目标文件和共享目标文件一起处理,以创建其他目标文件。运行时链接程序会将此文件与动态可执行文件和其他共享目标文件合并,以创建进程映像。

chenxu@ ~/Code/kernel/lab7$ gcc -shared shlibexample.c -o libshlibexample.so -m32
chenxu@ ~/Code/kernel/lab7$ file libshlibexample.so 
libshlibexample.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, BuildID[sha1]=40d94a7e998a3d529d5f7e0c40ecc99630dd1a21, not stripped
chenxu@ ~/Code/kernel/lab7$ gcc -shared dllibexample.c -o libdllibexample.so -m32
chenxu@ ~/Code/kernel/lab7$ file libdllibexample.so 
libdllibexample.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, BuildID[sha1]=65bac540b6848ca4ee86a27750ef8870fed3c06a, not stripped

我们看一下ELF头部的结构,这里存储了可执行文件的元数据。

typedef struct
{
        unsigned char e_ident[EI_NIDENT];     /* 魔数和相关信息 */
        Elf32_Half    e_type;                 /* 目标文件类型 */
        Elf32_Half    e_machine;              /* 硬件体系 */
        Elf32_Word    e_version;              /* 目标文件版本 */
        Elf32_Addr    e_entry;                /* 程序进入点 */
        Elf32_Off     e_phoff;                /* 程序头部偏移量 */
        Elf32_Off     e_shoff;                /* 节头部偏移量 */
        Elf32_Word    e_flags;                /* 处理器特定标志 */
        Elf32_Half    e_ehsize;               /* ELF头部长度 */
        Elf32_Half    e_phentsize;            /* 程序头部中一个条目的长度 */
        Elf32_Half    e_phnum;                /* 程序头部条目个数  */
        Elf32_Half    e_shentsize;            /* 节头部中一个条目的长度 */
        Elf32_Half    e_shnum;                /* 节头部条目个数 */
        Elf32_Half    e_shstrndx;             /* 节头部字符表索引 */
} Elf32_Ehdr;

如果使用readelf可以查看elf文件的各种信息,你可以使用-a查看全部信息,也可以使用-h只查看头部信息,我们可以对照上面的结构体分析一下刚才用来做测试的test文件的头部信息。

chenxu@ ~/Code/kernel/lab7$ readelf -h test
ELF Header:
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 /* 魔数和相关信息 */
  Class:                             ELF32 /* 目标文件类型 */
  Data:                              2's complement, little endian 
  Version:                           1 (current) 
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           Intel 80386 /* 硬件体系 */
  Version:                           0x1 /* 目标文件版本 */
  Entry point address:               0x80483a0 /* 程序进入点 */
  Start of program headers:          52 (bytes into file) /* 程序头部偏移量 */
  Start of section headers:          6188 (bytes into file) /* 节头部偏移量 */
  Flags:                             0x0 /* 处理器特定标志 */
  Size of this header:               52 (bytes) /* ELF头部长度 */
  Size of program headers:           32 (bytes) /* 程序头部中一个条目的长度 */
  Number of program headers:         9 /* 程序头部条目个数  */
  Size of section headers:           40 (bytes) /* 节头部中一个条目的长度 */
  Number of section headers:         30 /* 节头部条目个数 */
  Section header string table index: 27 /* 节头部字符表索引 */

对32位x86来说,进程的可用地址空间为4G,最上面的1G是内核空间,下面3G是用户空间(从0xc0000000开始),
当程序要加载到内存中运行时,将ELF文件的段(代码段、数据段)加载到进程的地址空间,ELF文件与进程虚拟空间有一个映射关系。默认从0x8048000开始加载,刚开始的地方为头部信息,头部大小略有不同。对于启动一个刚加载过可执行文件的进程来说,开始执行的入口点即为ELF头文件中的Entry point address。

对于ELF头更加详细的分析可以参考这里

动态链接的可执行程序编译方法

我们在前面仔细分析了目标文件的格式及类型,接下来我们就看一下Linux下是如何编译和使用shared object的。

动态链接分为可执行程序装载时动态链接(共享库)和运行时动态链接(动态加载共享库)。
这里我们用孟老师做的一个小例子来演示一下。编译共享库和动态加载共享库的方法在之前介绍shared object已经说过,不再赘述。

#include <stdio.h>

#include "shlibexample.h" 

#include <dlfcn.h>

/*
 * Main program
 * input    : none
 * output   : none
 * return   : SUCCESS(0)/FAILURE(-1)
 */
int main()
{
    printf("This is a Main program!\n");
    /* Use Shared Lib */
    printf("Calling SharedLibApi() function of libshlibexample.so!\n");
    SharedLibApi();   //使用共享库里面的函数
    /* Use Dynamical Loading Lib */
    void * handle = dlopen("libdllibexample.so",RTLD_NOW); //使用动态装载库的函数
    if(handle == NULL)
    {   
        printf("Open Lib libdllibexample.so Error:%s\n",dlerror());
        return   FAILURE;
    }   
    int (*func)(void);
    char * error;
    func = dlsym(handle,"DynamicalLoadingLibApi");
    if((error = dlerror()) != NULL)
    {   
        printf("DynamicalLoadingLibApi not found:%s\n",error);
        return   FAILURE;
    }    
    printf("Calling DynamicalLoadingLibApi() function of libdllibexample.so!\n");
    func();  
    dlclose(handle);    
    return SUCCESS;
}

我们看到,main函数中调用共享库的方法如下:

  1. 加入库的头文件
  2. 代码中调用该函数
  3. 编译时加入-L/path/to/your/dir -lshlibexample
  4. 运行之前指定路径 export LD_LIBRARY_PATH=$PWD 如果库文件不在当前路径,这里换成存放库文件的路径

而调用动态加载共享库时,方法则稍微复杂一些。

  1. 加入头文件dlfcn.h
  2. 编译时加入-ldl
  3. 需要搭配以下四个函数:
    1. dlopen函数,通过库名加载动态库,该函数返回一个动态库的句柄
    2. dlsym函数,该函数接受动态库句柄以及符号名称,返回装载入内存的符号地址。
    3. dlclose函数,该函数将会减少动态库的引用计数值,如果引用计数降到0的话且没有其他的动态库使用该库的符号,该动态库则被卸载
    4. dlerror函数,该函数返回一个可读字符串,用来描述最近一次调用其余三个函数所发生的错误。如果返回NULL则表示迄今没有错误发生
  4. 运行之前指定路径 export LD_LIBRARY_PATH=$PWD 如果库文件不在当前路径,这里换成存放库文件的路径

如果对这一点感兴趣的同学,可以参考man page继续了解(man 3 dlopen)。

实验截图如下所示。
编译运行

装载和启动一个可执行程序

我们一般是通过一个Shell程序来启动一个可执行程序的,一般来说Shell先fork出一个子进程,然后会调用execve将命令行参数和环境参数传递给可执行程序的main函数,库函数exec*都是execve的封装例程。

int execve(const char * filename,char * const argv[ ],char * const envp[ ]); //这里可以加入命令行参数和环境变量,但具体是否使用环境变量和参数,取决于main函数的写法。

比如ls -l列出当前目录下的文件,Shell本身不限制命令行参数的个数,命令行参数的个数受限于命令自身,也就是我们写的main函数是否愿意接收参数

int main(int argc, char *argv[], char *envp[])

可执行程序的装载过程

我们知道,创建子进程时,我们调用fork,实际上完全复制了父进程,然后在调用exec时,要加载的可执行程序把原来的进程给覆盖掉了,原来的用户态堆栈也被清空了,命令行和环境变量会压栈。这些其实是sys_execve内核处理函数帮我们做的工作,在创建一个新的用户态堆栈时,我们是将命令行参数和环境变量通过指针传递到内核处理函数,函数在创建新的用户态堆栈时,会帮我们把这些参数压到用户态堆栈中去。对于动态链接的情形,还要稍微复杂一些。我们在下面会继续分析。

动态链接的可执行程序的装载

我们在之前做了很多的铺垫工作,现在应该深入内核看一看sys_execve是如何加载可执行文件的。我们知道,程序装载exec*其实也是一个系统调用,只是这个系统调用有点特殊,进入系统调用前和出系统调用后是两个完全不同的进程。那么sys_execve一定做了一些修改工作,比如EIP和ESP,用户态堆栈等等。废话少说,let’s RTFSC.
首先sys_execve调用了do_execve,该函数将参数和环境变量的数据结构进行修改后调用了do_execve_common。

SYSCALL_DEFINE3(execve,
        const char __user *, filename,
        const char __user *const __user *, argv,
        const char __user *const __user *, envp)
{
    return do_execve(getname(filename), argv, envp);
}

int do_execve(struct filename *filename,
    const char __user *const __user *__argv,
    const char __user *const __user *__envp)
{
    struct user_arg_ptr argv = { .ptr.native = __argv };
    struct user_arg_ptr envp = { .ptr.native = __envp };
    return do_execve_common(filename, argv, envp);
}

在我们继续深入之前,我们先暂时休息一下,观察两个和被装载文件紧密关联的数据结构:
struct linux_binprm:parameter 用来在装载目标文件时存放参数,如文件名,文件信息,内存描述符信息,以及课上提到的interp(真正被执行的二进制文件的名字)

struct linux_binfmt:format 定义了一些函数指针,这些函数用来装载Linux可接受的目标文件格式,如load_binary,load_shlib,core_dump。注意:不同的格式对应了不同的结构体实例,这些结构体实例会通过注册的方式加入到一个链表中去,不同的格式采用不同的函数来进行目标文件的装载。如下图所示:

formats  -> |      lh      | -> |     lh       |
         <- |   module     | <- |    module    |
            | load_binary  |    | load_binary  |
            |   ........   |    |  ..........  |

有了这些铺垫,我们继续看,do_execve_common函数可以抽象为下面的结构:

int do_execve_common()
{
    file = do_open_exec(filename); //打开要加载的可执行文件
    ...
    各种初始化bprm
    ...
    exec_binprm(bprm); //加载程序
}

其中加载程序的exec_binprm函数中,调用了关键的search_binary_handler(bprm),该函数遍历链表来尝试加载目标文件,找到了则执行load_binary.

    list_for_each_entry(fmt, &formats, lh) {
        if (!try_module_get(fmt->module))
            continue;
        read_unlock(&binfmt_lock);
        bprm->recursion_depth++;
        retval = fmt->load_binary(bprm);
        read_lock(&binfmt_lock);
        put_binfmt(fmt);
        bprm->recursion_depth--;
        ...

这里我们知道,目标文件的格式应该是ELF,所以相应的load_binary实为load_elf_binary,该函数可以抽象如下:

load_elf_binary() 
{
    ...
    解析ELF文件
    ...
    elf_map(bprm->file, load_bias + vaddr,...) //把目标文件映射到地址空间中
    ...
    if (elf_interpreter) {把elf_entry设置为动态链接器ld的起点}
    else {目标文件的入口赋值给elf_entry}
    ...
    start_thread(..., elf_entry, ...);
}

可以看出,该函数的核心工作一是解析ELF文件,二是把目标文件映射到进程空间中,三是调用start_thread。

start_thread(struct pt_regs *regs, unsigned long new_ip, unsigned long new_sp)
{
    set_user_gs(regs, 0);
    regs->fs        = 0;
    regs->ds        = __USER_DS;
    regs->es        = __USER_DS;
    regs->ss        = __USER_DS;
    regs->cs        = __USER_CS;
    regs->ip        = new_ip;
    regs->sp        = new_sp;
    regs->flags     = X86_EFLAGS_IF;
    /*
     * force it to the iret return path by making it look as if there was
     * some work pending.
     */
    set_thread_flag(TIF_NOTIFY_RESUME);
}

start_thread实际上在修改了内核堆栈后调用iret返回用户态,把我们返回用户态的位置从int 0x80的下一条指令的位置变成新加载的可执行文件的entry位置(new_ip)。

GDB调试

分析了这么多,基本上我们基本上把sys_execve的来龙去脉搞清楚了,我们用mykernel来看一下
debug1
我们看下图可以知道,因为hello是个静态程序,start_thread中的new_ip正是我们在程序中设置的hello的入口地址。
debug2

这次就分析到这里。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本简明手册提供了对安装 SUSE Linux Enterprise Server 的快速介绍。它是对应 用程序各个字段以及 SUSE Linux Enterprise Server 支持的每个平台的安装类型 的概述,以及对安装过程的简短的说明。 SUSE Linux Enterprise Server 10 www.novell.com 2006 6 02 入门指南 入门指南 作者列表: Jörg Arndt, Steve Bearnson, Stefan Behlert, Frank Bodammer, James Branam, Volker Buzek, Klara Cihlarova, Catherine Craft, Olaf Dabrunz, Stefan Dirsch, Olaf Donjak, Roman Drahtmüller, Thorsten Dubiel, Torsten Duwe, Thomas Fehr, Stefan Fent, Werner Fink, Jakub Friedl, Kurt Garloff, Joachim Gleißner, Todd Grant, Carsten Groß, Andreas Grünbacher, Berthold Gunreben, Franz Hassels, Andreas Jaeger, Jana Jaeger, Denise Jewkes, Klaus Kämpf, Andi Kleen, Hubert Mantel, Lars Marowsky-Bree, Chris Mason, Johannes Meixner, Lars Müller, Matthias Nagorni, Anas Nashif, Siegfried Olschner, Edith Parzefall, Peter Pöml, Thomas Renninger, Hannes Reinecke, Scott Rhoades, Thomas Rölz, Heiko Rommel, Tanja Roth, Marcus Schäfer, Thomas Schraitle, Kay Sievers, Klaus Singvogel, Frank Sundermeyer, Elisabeth Tobiasson, Hendrik Vogelsang, Klaus G. Wagner, Rebecca Walter, Christian Zoz 本出版物属 Novell Inc. 的知识产权。 可以全部或部分复制本出版物的内容,只要在所有副本的显著位置能够见到版权标志。 本指南力求涵盖所有细节,但这不能确保本指南准确无误。无论是 SUSE LINUX GmbH、作 者还是翻译人员都不对任何可能的错误或因错误造成的任何影响负责。 Novell、Novell 徽标、N 徽标和 SUSE 是 Novell, Inc. 在美国和其他国家/地区的注册商标。* Linux 是 Linus Torvalds 的注册商标。所有其他第三方商标是其各自所有者的财产。 目录 前言v 部分 1 在 x86、AMD64、Intel EM64T 和 Itanium 处理器系列上安装1 1 安装注意事项3 1.1 安装类型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.2 引导方法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.3 安装源. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.4 安装目标. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.5 不同的安装方法. . . . . . . . . . . . . . . . . . . . . . . . . . 5 2 安装过程7 2.1 从本地可交换驱动器引导. . . . . . . . . . . . . . . . . . . . . . 7 2.2 通过网络安装. . . . . . . . . . . . . . . . . . . . . . . . . . . 7 2.3 远程控制安装. . . . . . . . . . . . . . . . . . . . . . . . . . . 8 部分 2 在 IBM POWER 上安装9 3 安装注意事项11 3.1 安装类型. . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 3.2 IPL 选项. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 3.3 安装源. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 3.4 安装目标. . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 3.5 连接到安装系统. . . . . . . . . . . . . . . . . . . . . . . . . 13 4 安装过程15 4.1 在整个系统中安装. . . . . . . . . . . . . . . . . . . . . . . . 15 4.2 在 LPAR 中安装. . . . . . . . . . . . . . . . . . . . . . . . . . 16 部分 3 在 IBM System z 上安装19 5 安装注意事项21 5.1 安装类型. . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 5.2 IPL 选项. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 5.3 安装源. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 5.4 启动到安装系统的连接. . . . . . . . . . . . . . . . . . . . . . 22 6 安装过程23 6.1 LPAR 安装. . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 6.2 z/VM 安装. . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 前言 本简明手册提供了对安装 SUSE Linux Enterprise Server 的快速介绍。它是对应 用程序各个字段以及 SUSE Linux Enterprise Server 支持的每个平台的安装类型 的概述,以及对安装过程的简短的说明。 另外还提供优质服务。专家可以回答关于安装或配置的问题、提供可靠的安全 更新和支持开发项目。 1 反馈 我们欢迎您对本手册和产品包含的其它文档提出意见和建议。请使用每页联机 文档底部的用户意见功能并发表您的意见。 2 附加文档 有关本产品的附加文档,请参阅 http://www.novell.com/documentation/ sles10/index.html: Architecture-Specific Information 准备 SUSE Linux Enterprise Server 安装目标所需要的特定于架构的信息。 安装与管理 SUSE Linux Enterprise Server 安装与管理的详细信息。 有关 SUSE® Linux Enterprise Desktop 产品文档概述,请参阅 http://www .novell.com/documentation/sled10/index.html。 3 文档约定 以下是本手册中使用的版式约定: • /etc/passwd:文件名和目录名 • placeholder:将 placeholder 替换为实际值 • PATH:环境变量 PATH • ls,--help:命令、选项和参数 • user:用户或组 • Alt , Alt + F1 :按键或组合键;这些键以大写形式显示,如在键盘上一样。 • 文件,文件→ 另存为:菜单项、按钮 • ►amd64 em64t ipf: 本段只与指定的体系结构有关。箭头标记文本块的开始 位置和结束位置。◄ ►ipseries s390 zseries: 本段只与指定的体系结构有关。箭头标记文本块的开 始位置和结束位置。◄ • Dancing Penguins(“Penguins”一章,↑参考):这是另一本书中某章的参考。 vi 入门指南 部分 1. 在 x86、AMD64、Intel EM64T 和 Itanium 处理器系列上 安装 1 安装注意事项 本章包含在 x86、AMD64、Intel EM64T 和 Itanium 硬件上安装 SUSE® Linux Enterprise Server 之前需要做的所有决策。请在 Architecture-Specific Information 手册中查找用于在 x86、AMD64、Intel EM64T 和 Itanium 上安装 SUSE Linux Enterprise Server 的最新硬件和软件要求,该手册作为一个可打印的 PDF 包含在 第一张 CD 或 DVD 上的 /docu 目录中。 1.1 安装类型 SUSE Linux Enterprise Server 通常作为独立的操作系统安装。通过引入 Xen,也 可能在同一硬件上运行 SUSE Linux Enterprise Server 的多个实例。但是,对 Xen 的 Domain-0 安装的控制类似于使用一些额外的包进行典型安装。Installation and Administration 中说明了 Xen 客户机的安装,该文档在已安装系统中以及第一张 CD 或 DVD 上提供。 1.2 引导方法 根据所使用的硬件,在安装 SUSE Linux Enterprise Server 之前的第一个引导过 程中,以下引导方法可用: 安装注意事项3 表 1.1 引导选项 引导选项用途 最简单的引导方法。此选项要求系统有本地可用的 CDROM 或 DVD-ROM 驱动器。 CD 或 DVD 驱动 器 在第一张 CD 或 DVD 的 /boot 目录中查找创建引导磁盘 所需的映象。另请参见同一目录中的 README。只有在计 软盘或 USB 磁盘 算机的 BIOS 支持从 USB 记忆棒引导的情况下才可进行此 引导。 必须由 BIOS 或所用系统的固件支持。此选项需要在网络 中有一台引导服务器。可以用另一个 SUSE Linux Enterprise Server 来执行此任务。 PXE 或 bootp SUSE Linux Enterprise Server 也可以从硬盘来进行引导。 为此,请将内核 (linux) 和安装系统 (initrd) 从第一张 硬盘 CD 或 DVD 上的 /boot/loader 目录中复制到硬盘,并 向引导装载程序中添加相应的项。 1.3 安装源 当安装 SUSE Linux Enterprise Server 时,必须在网络、硬盘分区或本地 CD-ROM 或 DVD 中提供实际安装数据。要从网络安装,则需要一台安装服务器。要提供 安装数据,请将任何 Unix 或 Linux 环境中的计算机设置为 NFS、HTTP 或 FTP 服务器。要从 Windows 计算机上提供安装数据,请使用 SMB 发布该数据。 如果在本地网络中配置了 SLP 服务器,则安装源尤其易于选择。有关详细信息, 请参见第 4.2 节 “设置存放安装源的服务器” (第 4 章 远程安装, ↑安装与管理)。 1.4 安装目标 多数安装是安装到本地硬盘上。因此,硬盘控制器需要对安装系统可用。如果 特殊的控制器(如 RAID 控制器)需要额外的内核模块,请向安装系统提供一 个内核模块更新磁盘。 4 入门指南 其他安装目标可能是提供运行操作系统所需的足够磁盘空间和速度的所有种类 的块设备。这包括网络块设备,如 iSCSI 或 SAN。也可以在提供标准 Unix 许 可权限的网络文件系统上安装。但是,引导这些网络文件系统可能会有问题, 因为在实际系统可以启动之前,它们必须得到 initramfs 的支持。如果需要 在其他位置启动同一系统,或如果希望使用 Xen 功能(如域迁移),则此类安 装非常有用。 1.5 不同的安装方法 SUSE Linux Enterprise Server 提供了若干种用于控制安装的不同方法。 • 在控制台上安装 • 通过串行控制台安装 • 使用 AutoYaST 安装 • 通过 SSH 安装 • 通过 VNC 进行安装 默认情况下,使用控制台。如果要安装大量类似的计算机,则建议创建一个 AutoYaST 配置文件,并使其可用于安装过程。另请参见第 5 章 自动安装 (↑安 装与管理)中有关 autoyast2 的文档。 安装注意事项5 2 安装过程 本章提供了以所需模式完整安装 SUSE® Linux Enterprise Server 所需的步骤的概 述。请在 Architecture-Specific Information 手册中查找用于准备在 x86、AMD64、 Intel EM64T 和 Itanium 上安装 SUSE Linux Enterprise Server 的详细信息,该手 册作为一个可打印的 PDF 在第一张 CD 或 DVD 上的 /docu 目录中提供。参考 包含对如何使用 YaST 安装和配置系统的完整说明。 2.1 从本地可交换驱动器引导 CD-ROM、软盘驱动器和 USB 记忆棒可以用于安装。请按需要调整计算机: 1. 确保该驱动器在 BIOS 中输入为可引导驱动器。 2. 将引导媒体插入驱动器并开始引导过程。 3. CD、DVD、软盘或 USB 磁盘的引导菜单允许向安装系统传递不同的参 数。另请参见第 4.4.3 节 “使用自定义引导选项” (第 4 章 远程安装, ↑安装 与管理)。如果安装通过网络执行,则请在此处指定安装源。 4. 如果安装期间发生意外问题,请使用安全设置引导。 2.2 通过网络安装 使用网络源执行安装需要有一台安装服务器。安装此服务器的过程在第 4.2 节 “设置存放安装源的服务器” (第 4 章 远程安装, ↑安装与管理)中描述。 安装过程7 如果有 SLP 服务器,请在第一个引导屏幕中选择 SLP 作为安装源。在引导期 间,选择使用哪个可用安装源。 如果网络中有 CD 或 DVD,请使用它们作为安装源。在这种情况下,请在引导 提示符处以适当的值指定参数 install=<URL>。请在第 4.4.3 节 “使用自定义 引导选项” (第 4 章 远程安装, ↑安装与管理)中查找关于此参数的更多详细说明。 2.3 远程控制安装 从远程计算机控制安装有三个选项:通过 SSH 安装、通过串行控制台安装和通 过 VNC 安装。Architecture-Specific Information 手册中说明了这些可能的选项。 请在第一张 CD 或 DVD 的 /docu 目录中查找作为可打印 PDF 提供此手册。 8 入门指南 部分 2. 在 IBM POWER 上安装 3 安装注意事项 本章总结了开始在 IBM POWER 硬件上安装 SUSE® Linux Enterprise Server 之前 需要做的所有决策。用于在 IBM POWER 设备上安装 SUSE Linux Enterprise Server 的最新硬件和软件要求在第 1 章 要求 (↑Architecture-Specific Information) 中列出,在第一张 CD 的目录 /docu 中提供为一个可打印的 PDF 文档。 3.1 安装类型 SUSE Linux Enterprise Server 提供了在 IBM POWER 上进行两种不同类型的安 装:在整个系统上安装和在逻辑分区 (LPAR) 中安装。 iSeries Linux 只可以安装在此类计算机的 LPAR 中。在 iSeries 上安装需要一个允许 全程控制安装过程的 telnet 连接。网络中的安装服务器应是好的安装源。 pSeries 此处 Linux 可以安装在整个系统上。在 IBM pSeries p630、p655、p670 和 p690 上,也可能在 LPAR 中安装 Linux。也可以在不分区的情况下启动这两 个系统,并在整个系统上(全系统分区)安装。CD-ROM 驱动器、DVD 驱 动器或网络中的安装服务器可以用作安装源。 eServer i5/p5、System i5/p5、OpenPower Linux 可以安装在整个系统(未管理模式)或 LPAR 上。CD-ROM 驱动器、 DVD 驱动器或网络中的安装服务器可以用作安装源。 安装注意事项11 JS20 Blade、JS21 Blade 在此类计算机上,Linux 只可以安装在整个系统(一个刀片)上。CD-ROM 驱动器、DVD 驱动器或网络中的安装服务器可以用作安装源。 IntelliStation、ATX 工作站和服务器 Linux 只可以安装在整个系统上。CD-ROM 驱动器、DVD 驱动器或网络中 的安装服务器可以用作安装源。 3.2 IPL 选项 根据使用的硬件和选择的安装类型,初始 IPL 的以下选项可用于安装 SUSE Linux Enterprise Server: 表 3.1 IPL 选项 IPL 选项用途 最简单的引导过程。此选项要求系统有本地可用的 CDROM 或 DVD 驱动器。 CD 或 DVD 驱动器 SUSE Linux Enterprise Server 也可以从网络来引导。这要 求将相应的内核(suseboot/inst64 或 ISERIES64) 网络 从第一张 CD 复制到引导服务器上。从网络引导可以在 固件中或使用 i5/OS 选择。 3.3 安装源 为了安装 SUSE Linux Enterprise Server,在本地网络中或本地提供的 CD-ROM 或 DVD 中必须提供安装文件。通过将一个 Linux 或 Unix 系统设置为 HTTP、 NFS 或 FTP 服务器而提供一个网络源。也可能从一个运行 Windows 的计算机通 过 SMB 共享安装文件。 在本地网络中配置 SLP 服务器可以简化安装源的选择。第 4.2.1 节 “使用 YaST 设置安装服务器” (第 4 章 远程安装, ↑安装与管理)中对此进行了描述。 12 入门指南 3.4 安装目标 SUSE Linux Enterprise Server 可以在 IBM Power 的不同类型的大容量储存媒体上 安装。 iSeries • DASD(硬盘) • IBM iSeries 虚拟磁盘 pSeries • DASD(硬盘) • 通过光纤通道的 SAN eServer i5/p5、System i5/p5、OpenPower • DASD(硬盘) • 虚拟 SCSI • 通过光纤通道的 SAN JS20 Blade、JS21 Blade • 本地硬盘 IntelliStation、ATX 工作站和服务器 • 本地硬盘 3.5 连接到安装系统 SUSE Linux Enterprise Server 使您可以从连接到安装系统的四种不同的方式中选 择:SSH、VNC、串行控制台和屏幕控制台。SSH、VNC 或终端软件的版本因 启动到安装系统的连接的工作站上运行的操作系统而异。 安装注意事项13 建议如果需要安装许多相同的分区或计算机,则创建一个 AutoYaST 配置文件。 然后它可以驱动安装过程。请参见第 5.2 节 “基于规则的自动安装” (第 5 章 自动 安装, ↑安装与管理)中 AutoYaST 的文档。 14 入门指南 4 安装过程 本章提供了以所选模式安装 SUSE® Linux Enterprise Server 所需步骤的概述。关 于准备在 IBM POWER 上安装 SUSE Linux Enterprise Server 的详细信息可以在 手册 Architecture-Specific Information 中找到,该手册作为可打印 PDF 文档在第 一张 CD 上的目录 /docu 中提供。关于使用 YaST 安装和配置的详细描述在 第 3 章 使用 YaST 进行安装 (↑安装与管理)和第 7 章 使用 YaST 进行系统配置 (↑ 安装与管理)中提供。 4.1 在整个系统中安装 当在整个系统中安装时,应完成以下步骤。在此上下文中,刀片中心的单个刀 片也算作整个系统。 1 验证硬件要求(另请参见第 1.1 节 “硬件要求” (第 1 章 要求, ↑Architecture- Specific Information))。 2 验证软件要求(另请参见第 1.2 节 “软件要求” (第 1 章 要求, ↑Architecture- Specific Information))。 3 正确设置系统以启用从 CD-ROM、DVD 或网络引导。 • 对于 pSeries,另请参见第 2.2 节 “Preparing for Installation on an IBM pSeries Models” (第 2 章 准备, ↑Architecture-Specific Information)。这也 适用于 ATX 工作站和 ATX 服务器(仅对于在整个系统上安装)。 安装过程15 • 对于 eServer i5/p5、System i5/p5 和 OpenPower,另请参见第 2.1 节 “Preparing for Installation on IBM eServer i5/p5, System i5/p5, and OpenPower Models” (第 2 章 准备, ↑Architecture-Specific Information)。 • 对于 JS20/JS21 Blade,另请参见第 2.3 节 “在 IBM JS20/JS21 刀片机上 准备安装” (第 2 章 准备, ↑Architecture-Specific Information)。 4 从 CD-ROM、DVD 或网络开始安装。另请参见第 2.2.3 节 “Setting Up the Installation Source” (第 2 章 准备, ↑Architecture-Specific Information)。 5 安装软件并执行基本网络配置。另请参见第 3 章 使用 YaST 进行安装 (↑安 装与管理)。 4.2 在 LPAR 中安装 1 验证硬件要求。另请参见第 1.1 节 “硬件要求” (第 1 章 要求, ↑Architecture- Specific Information)。 2 验证软件要求。另请参见第 1.2 节 “软件要求” (第 1 章 要求, ↑Architecture- Specific Information)。 3 准备一个用于安装过程的 VNC 客户机。另请参见第 4.1.1 节 “通过 VNC 进行简单远程安装 - 静态网络配置” (第 4 章 远程安装, ↑安装与管理)。 4 在系统固件或在 i5/OS 端准备系统: • 对于 iSeries,另请参见第 2.4 节 “Preparing an Installation on IBM iSeries Models” (第 2 章 准备, ↑Architecture-Specific Information) • 对于 pSeries p630、p655、p670 和 p690,另请参见第 2.2 节 “Preparing for Installation on an IBM pSeries Models” (第 2 章 准备, ↑Architecture- Specific Information) • 对于 eServer i5/p5、System i5/p5 和 OpenPower,另请参见第 2.1 节 “Preparing for Installation on IBM eServer i5/p5, System i5/p5, and OpenPower Models” (第 2 章 准备, ↑Architecture-Specific Information) 16 入门指南 5 配置一个用于在安装期间访问系统的客户机。另请参见第 2.4.3 节 “操作安 装软件的客户程序” (第 2 章 准备, ↑Architecture-Specific Information)。 6 对于 iSeries,在 i5/OS 端设置 IPL 源,另请参见第 2.4.5 节 “IPL:启动 NWSD(WRKCFGSTS *NWS)” (第 2 章 准备, ↑Architecture-Specific Information)。 7 安装软件并执行基本网络配置。另请参见第 3 章 使用 YaST 进行安装 (↑安 装与管理)。 安装过程17 部分 3. 在 IBM System z 上安装 5 安装注意事项 本章汇总了计划在 IBM System z 硬件上安装 SUSE® Linux Enterprise Server 时 必须做出的所有决策。手册 Architecture-Specific Information 中列出了在 IBM System z 上安装 SUSE Linux Enterprise Server 的最新硬件和软件要求,该手册作 为可打印的 PDF 文档包含在第一张 CD 上的目录 /docu 中。 5.1 安装类型 SUSE Linux Enterprise Server 允许在 IBM POWER 上进行两种不同类型的安装: LPAR 安装 在独立的逻辑分区 (LPAR) 上为 IBM System z 安装 SUSE Linux Enterprise Server 允许 SUSE Linux Enterprise Server 使用物理内存的特定部分。而且还 可以指定使用多少处理器。这种方式允许在一个系统上并行运行多个操作 系统。 在 z/VM 中安装 z/VM 方式将 IBM System z 的 SUSE Linux Enterprise Server 作为 z/VM(虚 拟机)中的托管系统运行。这种类型的优势是 z/VM 提供对 SUSE Linux Enterprise Server 的完全控制。这种安装经证明对于内核开发和基于内核的 调试非常有帮助。不仅如此,修改托管 Linux 系统的硬件配置也非常容易。 创建托管 SUSE Linux Enterprise Server 系统也非常容易,因为可以并行运行 几百个 Linux 实例。 安装注意事项21 从带有 FCP 功能的 CD-ROM 安装 带有 FCP 功能的 CD-ROM 可以用于以 LPAR 或 VM 方式的 IPL。安装数据 直接从 CD-ROM 读取。 5.2 IPL 选项 根据使用的硬件和选择的安装类型,在安装 SUSE Linux Enterprise Server 之前 以下 IPL 选项可用于初始 IPL: 表 5.1 IPL 选项 IPL 选项作用域 可以用于任何类型的安装。唯一的要求是磁带库单 元可用。 ESCON/FICON 挂接磁带 可以用于 VM 方式。必要的数据必须先前已传送到 z/VM 系统(例如,使用 FTP)。 VM 阅读器 可以用于在 LPAR 中 IPL。安装数据可以直接从 CD-ROM 读取或使用 FTP 装入安装系统。 CD-ROM 或服务器 5.3 安装源 如果是带有 FCP 功能的 CD-ROM,安装数据会从 CD-ROM 读取。对于所有其 他 IPL 选项,安装数据必须在内部网络中提供。在 Unix 或 Linux 环境中,安装 数据可以在设置为 NFS 或 FTP 服务器的工作站上提供。要从 Windows 工作站 上提供安装数据,请在 SMB 共享中发布该数据。有若干 Windows 版的 FTP 软 件包可作为备选,但是使用它们有时会有问题。 5.4 启动到安装系统的连接 SUSE Linux Enterprise Server 提供了三种用于启动到安装系统的连接的不同方 法。选择 SSH、X 或 VNC。根据在启动到安装系统的连接的工作站上运行的操 作系统,这些应用程序的版本有所不同。 22 入门指南 6 安装过程 本章提供了以所需方式完整安装 SUSE® Linux Enterprise Server 所需的各个步骤 的概述。关于准备在 IBM System z 上安装 SUSE Linux Enterprise Server 的详细 信息在手册 Architecture-Specific Information 中提供,该手册作为可打印 PDF 文 档在第一张 CD 上的目录 /docu 中提供。使用 YaST 安装和配置系统的详细说 明可以在参考中找到。 6.1 LPAR 安装 1 安装之前,请选择用于初始 IPL 的适当 IPL 选项。如果是 LPAR 安装,请 从 CD-ROM 或服务器或磁带中选择。 2 使用 FTP 或 SMB 在网络中提供安装媒体或其数据,并确保这些路径可以 由 YaST 访问。 3 选择下列操作之一: • 使用 HMC,从 CD-ROM 或服务器准备 IPL。 • 将磁带 IPL 内核、parmfile 和初始 RAM 磁盘使用 FTP 传送到磁带, 并通过 IOCDS 使磁带机可用。 4 执行安装系统的 IPL。 5 配置网络。 安装过程23 6 选择到安装系统的连接类型(SSH、X 或 VNC)并建立连接。 7 使用 YaST 开始基本安装。 8 执行已安装系统的第一次 IPL。 9 重新连接到安装系统,并启动 YaST 以继续安装过程和配置 SUSE Linux Enterprise Server。 6.2 z/VM 安装 1 安装之前,请选择用于初始 IPL 的适当 IPL 选项。对于在 z/VM 中安 装,请选择 VM 阅读器或磁带。 2 使用 FTP 或 SMB 在网络中提供安装媒体或其数据,并确保这些路径可 以由 YaST 访问。 3 在 z/VM 中创建一个 Linux 客户机,指派其内存限额和定义所需的网络 连接。 4 选择下列操作之一: • 将 VM 阅读器内核、parmfile 和初始 RAM 磁盘使用 FTP 传送到 z/VM 中的客户机可以访问的小型磁盘,并为该 VM 阅读器的 IPL 创建一个 REXX 启动脚本。 • 将磁带 IPL 内核、parmfile 和初始 RAM 磁盘使用 FTP 传送到 z/VM 中的客户机可以访问的小型磁盘,并将这些文件使用 REXX 脚本 (举例而言)传送到磁带。 5 执行安装系统的 IPL。 6 配置网络。 7 选择到安装系统的连接类型(SSH 或 VNC)并建立连接。 8 使用 YaST 开始基本安装。 24 入门指南 9 执行已安装系统的第一次 IPL。 10 重新连接到安装系统,并启动 YaST 以继续安装过程和配置 SUSE Linux Enterprise Server。 安装过程25
目 录 第一部分 前言...................................................................................................................................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 uboot 移植工作目录....................................................................................................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 tlinux. 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 armlinuxgcc 的使用.................................................................................................29 3.2.2 armlinuxar 和 armlinuxranlib 的使用..................................................................30 3.2.3 armlinuxobjdump 的使用.........................................................................................30 3.2.4 armlinuxreadelf 的使用............................................................................................31 3.2.6 armlinuxcopydump 的使用......................................................................................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 第四部分 uboot 的移植...................................................................................................................35 1 uboot 的介绍及系统结构.........................................................................................................35 1.1 uboot 介绍.........................................................................................................................35 1.2 获取uboot......................................................................................................................... 35 1.3 uboot 体系结构.................................................................................................................35 1.3.1 uboot 目录结构..........................................................................................................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 安装UBOOT 使的栈空间........................................................................................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重新编译uboot.......................................................................................................... 45 3.2.9 把uboot 烧入flash....................................................................................................45 4 UBOOT 命令的使用................................................................................................................46 4.1 UBOOT 命令的介绍.........................................................................................................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 <n>........................................................................................................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移植linux2.6.15.7.............................................................................................................. 62 3.2移植linux2.6.16.21............................................................................................................ 62 3.3 移植linux2.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 在UBOOT 对Nand Flash的支持............................................................................................82 3.1 UBOOT 对从Nand Flash启动的支持.............................................................................82 3.1.1 从Nand Flash启动UBOOT 的基本原理................................................................82 3.1.2 支持Nand Flash启动代码说明.................................................................................82 3.2 UBOOT 对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 在uboot 下cs8900a的支持......................................................................................................96 3.1 uboot 下cs8900a的驱动介绍...........................................................................................96 3.2 uboot 下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的朋友, 如有错误 之处,请大家多多指点. 同样, 我们也希望更多人能把自己的工作经验和体会加入该文档,让大家共同进步. 该文档是一份交流性文档, 只供个人学习与交流,不允许公司和企业用于商业行为.
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 的朋友, 如有错误 之处,请大家多多指点. 同样, 我们也希望更多人能把自己的工作经验和体会加入该文档,让大家共同进步. 该文档是一份交流性文档, 只供个人学习与交流,不允许公司和企业用于商业行为

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值