ARM开发(8)系统移植初步(kernel(linux-3.14)的移植,配置和编译)基于cortex-A9的fs4412

        依然先来一段引入,ubootloader的作用就是引导和kernel是没有必然关系的,内核是操作系统最基本的部分。它是为众多应用程序提供对计算机硬件的安全访问的一部分软件,这种访问是有限的,并且内核决定一个程序在什么时候对某部分硬件操作多长时间。内核的分类可分为单内核和双内核以及微内核。严格地说,内核并不是计算机系统中必要的组成部分。

一.kernel的主逻辑(uImage)

         完整的内核一般由五部分组成,它们分别是内存管理,进程管理,进程间通信,虚拟文件系统和网络接口组成

1.内存管理

        内存管理主要是如何有效地管理整个系统的物理内存,同时快速响应内核各个子系统对内存分配地请求。

2.进程管理

        进程管理主要控制系统进程对cpu地访问,当需要某个进程运行时,由进程调度器根据基于优先级地调度算法启动新的进程。

3.进程间通信

       进程间通信主要用于控制不同进程之间在用户空间的同步、数据共享和交换。 

4.虚拟文件系统

        Linux内核中的虚拟文件系统用一个通用的文件模型表示了各种不同的文件系统,这个文件模型屏蔽了很多具体文件系统的差异,使Linux内核支持很多不同的文件系统,这个文件系统可以分为逻辑文件系统和设备驱动程序:逻辑文件系统指Linux所支持的文件系统,例如ext2、ext3和fat等;设备驱动程序指为每一种硬件控制器所编写的设备驱动程序模块。

5.网络接口

        网络接口提供了对各种网络标准的实现和各种网络硬件的支持。网络接口一般分为网络协议和网络驱动程序。网络协议部分负责实现每一种可能的网络传输协议。网络设备驱动程序则主要负责与硬件设备进行通信,每一种可能的网络硬件设备都有相应的设备驱动程序    

 内核逻辑(uImage)+驱动(soc,外设)构成了我们操作系统的核心-----内核

二.kernel的配置         

内核逻辑(uImage)+驱动(soc,外设)构成了我们操作系统的核心-----内核

一.内核主逻辑uImage部分

第一步:将我们获取到的linux-3.14.tar.bz2拷贝到主目录下解压

第二步:修改顶层目录下的Makefile,修改体系架构和交叉编译器,代码如下:

ARCH    ?= $(SUBARCH)
      CROSS_COMPILE  ?=
      CROSS_COMPILE  ?= $(CONFIG_CROSS_COMPILE:"%"=%)
      修改以上代码为:

 # Note: Some architectures assign CROSS_COMPILE in their      arch/*/Makefile
ARCH        ?= arm    //体系架构是arm
CROSS_COMPILE   ?=arm-linux-   //交叉编译器是arm-linux-gcc

tips:这两个变量值会直接影响顶层Makefile的编译行为,即选择编译哪些代码,用什么编译器进行编译。

第三步:拷贝标准版配置文件,目的是得到跟我们开发板相关的配置信息

$ cp arch/arm/configs/exynos_defconfig    .config

这里拷贝arch/arm/configs/exynos_defconfig到  .config文件是选取跟我们开发板相关的代码。因为Linux支持的平台非常非常多,不仅仅是ARM处理器,当然我们编译的时候只需要编译跟我们平台相关的代码就可以了,平台相关的不需要编译,那么就有个问题,Linux系统中的源代码文件有一万多以个,面对这么庞大的文件数量,我们如何去选择呢?
       其实,我们担心的问题也是写操作系统的那哥们早就担心过的问题了,只不过人家已经把这个问题帮我们解决了,我们只需进行很简单的操作,就可以选择出我们要编译的代码,具体的方法就是把相应平台的_deconfig直接拷贝到顶层目录的.config文件中,这样.config文件中就记录了我们要移植平台的平台信息,因为在配置内核时,系统会把所有的配置信息都保存在顶层目录的.config文件中。注意在第一次,进行make menuconfig时,系统会根据我们选取的平台信息自动选取相关的代码和模块,因此我们只需要进入然后再退出,选择保存配置信息就行了,系统会把这些跟我们移植平台相关的所有配置信息全部保存在顶层目录的.config文件中

第四步:make menuconfig 组件的选择

注意:第一次进去,不做任何操作,直接推出,在推出时提示是否保存配置信息,一定要保存配置信息,点击“YES”。这样我们的.config中就已经保存了我们开发平台的信息。
       在这个环节,我们需要关心一个问题,make menuconfig时,系统到低都做了哪些事情?为什么会出现图形化的界面?图形化的界面中的相关内容是从哪里来的?
        图形化的界面当然是由一个特殊的图形库来实现的,还记得第一次make menuconfig时,系统并没有出现图形化的界面,而是报错了,并且提示我们缺少 ncurses-devel ,此时只需要按照要求安装一个libncurses5-dev就行了,sudo apt-get install libncurses5-dev,有了这个图形化库的支持,我们才能够正常显示图形化界面。
       好了,图形化界面的问题解决了,那还有另外一个问题就是图形化界面里面的内容是从哪里来的?要回答这个问题,我们就要提一下Linux内核的设计思想了,Linux 内核是以模块的方式来组织这个操作系统的,那么,为什么要用模块的方式来组织呢?模块的概念又是什么呢?在此来一一回答这个问题。
      Linux2.6内核的源码树目录下一般都会有两个文件:Kconfig和Makefile。分布在各目录下的Kconfig构成了一个分布式的内核配置数据库,每个Kconfig分别描述了所属目录源文件相关的内核配置菜单。每个目录都会存放功能相对独立的信息,在每个目录中会存放各个不同的模块信息,比如在/dev/char/目录下就存放了所有字符设备的驱动程序,而这些程序代码在内核中是以模块的形式存在的,也就是说当系统需要这个驱动的时候,会把这个驱动以模块的方式编译到系统的内核中,编译分为静态编译和动态编译,静态编译内核体积比动态编译的体积要大,前面已经说了每个目录下面都会有一个Kconfig的文件,我们还会问,这个文件中都存放了什么信息?前面说了,每个目录的Kconfig文件描述了所属目录源文件相关的内核配置菜单,有其特殊的语法格式,图形化界面的文字正是从这个文件中读取出来的,如果把这个文件中的相应目录文件的信息全部删除,那么在图形化界面中将看不到该模块的信息,因此也不能进行模块的配置。
       在内核配置make menuconfig(或xconfig等)时,系统会自动从Kconfig中读出配置菜单,用户配置完后保存到.config(在顶层目录下生成)中。在内核编译时,主Makefile调用这个.config,(.config的重要性就体现在,它保存了我们的所有的配置信息,是我们选取源代码并且进行编译源代码的最终依据!!!)就知道了用户对内核的配置情况。上面的内容说明:Kconfig就是对应着内核的配置菜单。假如要想添加新的驱动到内核的源码中,可以通过修改Kconfig来增加对我们驱动的配置菜单,这样就有途径选择我们的驱动,假如想使这个驱动被编译,还要修改该驱动所在目录下的Makefile。因此,一般添加新的驱动时需要修改的文件有两种,即:Kconfig 和相应目录的Makefile(注意不只是两个),系统移植的重要内容就是给内核添加和删除相应的模块,因此主要修改的内核文件就是Kconfig 和相应目录的Makefile这两个文件。

第五步:编译:make uImage  ----> uImage      mkimage  may uboot not built

二.内核纯硬件设备相关部分(dts)

1)arch/arm/boot/dts/   *.dts    

2)在主目录下,执行 make dtbs  ---》*.dtb

3)查找板子对应设备树  找不到 ---》新kernel找   厂家   找到芯片相同的板子的设备树---》fs4412.dts

4)修改 dts/Makefile  -->  fs4412.dtb 增加进去

5)编译 make dtbs  ----> fs4412.dtb  

### 增加网络功能

1、运行 网络命令  发现有问题 

2、设置网络 ifconfig eth0 192.168.x.x    no device 

3、在**设备树**里面去找,没有,去看其他设备树里面同型号的网卡  怎么配置的   借鉴过来 ,修改成自己硬件适配

```c
srom-cs1@5000000 {
    compatible = "simple-bus";
    #address-cells = <1>;
    #size-cells = <1>;
    reg = <0x5000000 0x1000000>;
    ranges;

    ethernet@5000000 {
        compatible = "davicom,dm9000";
        reg = <0x5000000 0x2 0x5000004 0x2>;
        interrupt-parent = <&gpx0>;
        interrupts = <6 IRQ_TYPE_LEVEL_HIGH>;
        davicom,no-eeprom;
    };  
};  
```

 
4、重新编译  make dtbs   , 拷贝到tftp目录  

5、在**内核配置**中去找网卡驱动  

1)make menuconfig --》 /  -->  dm9000 --> 没有 

2)找到路径   
 

```c
│   Location:                                                                                                                              │  
  │     -> Device Drivers                                                                                                                    │  
  │       -> Network device support (NETDEVICES [=y])                                                                                        │  
  │ (1)     -> Ethernet driver support (ETHERNET [=y])  
```

3)选中,保存退出

4)编译 uImage,拷贝

### 增加自动配置ip功能

Networking support  --->

Networking options  --->

[*] IP: kernel level autoconfiguration
bootargs  增加  ip=192.168.3.xx
### 增加网络文件系统,替代根文件系统

1、【服务端】ubuntu

1)nfs server 安装

2)根文件系统解压到用户目录下  例如: /home/lyx/mydd/rootfs

3)修改配置 /etc/exports  --->   把解压后的根目录添加进去。

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

2、【客户端】ubuntu编译,运行在板子上

make menuconfig  ---》nfs client 增加        rootfs on nfs 选中

编译  ---》uImage

3、启动参数:

之前的:bootargs  root=/dev/ram  rw console=ttySAC2,115200 clk_ignore_unused init=/linuxrc ip=192.168.3.xxx

现在的:bootargs  root=/dev/nfs nfsroot=192.168.3.11:/home/lyx/mydd/rootfs,v3 rw console=ttySAC2,115200 clk_ignore_unused init=/linuxrc ip=192.168.2.225

4、加载命令:

之前的:tftp 41000000 uImage;tftp 42000000 exynos4412-fs4412.dtb;tftp 43000000 ramdisk.img;bootm 41000000 43000000 42000000 

现在的:tftp 41000000 uImage;tftp 42000000 exynos4412-fs4412.dtb;bootm 41000000 - 42000000

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞赴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值