一、linux内核

$:'uname -a

$:'uanme -r

// 查看linux内核版本,开发板上进入linux后是一样的命令。

早起常常使用的版本:linux 2.6.x

开发板上使用的版本:linux 3.4.39

linux最新版本:linux 4.x

二、linux内核的5大功能

1)内存管理功能;2)进程管理及进程间通讯;3)虚拟文件子系统;4)设备驱动管理;5)网络子系统;

嵌入式平台有操做系统,优点在于:

1)编程简单,有库函数能够调用;

2)能够实现更加复杂的业务逻辑;// 多进程 多线程

三、linux内核的编译

env/kernel.tar.bz2

$:'cp /mnt/hgfs/porting/env/kernel.tar.bz2 .

$:'tar xvf *.bz2

$:'cd kernel/

$:'find ./ -type f | wc -l

// 26129

$:'cp arch/arm/configs/x6818_defconfig .config

$:'vi Makefile

// 195 ARCH ?= arm// 196 CROSS_COMPILE ?= arm-cortex_a9-linux-gnueabi-

$:'make uImage -j4

// arch/arm/boot/uImage  is  ready

$:'make menuconfig -j4

// 此项为内核功能配置,可删减(内核裁剪)

** 编译异常问题解决 **

问题1:

>>若是出现"mkuimage"command not find

解决办法:

$:'sudo cp ~/project/uboot/tools/mkimage /usr/bin/

$:'make uImage

问题2:

>>Your display is too small...

解决办法:

缩小字体显示比例。

验证uImage的有效性:

把uImage烧写0x800扇区开始的分区位置。

经过加载的方式:

cp arch/arm/boot/uImage /tftpboot/tftp 48000000 uImagebootm 48000000setenv bootcmd tftp 48000000 uImage \; bootm 48000000

3.1 内核的配置

【什么是配置?】

假设linux内核中提供了10000种功能,可是具体到开发板上只须要其中2000个功能。

1)裁剪掉内核中不须要的功能

不须要挂载U盘

// 内核中关于FAT32类型文件系统相关的代码的支持就不须要

2)驱动程序的裁剪

// 产品中没有键盘,裁剪掉内核中的键盘驱动

【总之】根据目标产品的须要,以及开发板的实际硬件,裁剪掉不须要的内核代码。

【如何完成配置?】

找一个相近的配置文件,在此基础上进行修改。

【去哪里找相近的配置?】

1)去内核源码目录  arch/arm/configs/xxx_defconfig

2)上游厂家提供

【如何修改配置?】

cp 相近的配置.config  kernel/.config

a)$:'  make menuconfig

// 模拟菜单显示界面

General setup  --->

System Type  --->

ARM system type (SLsiAP S5P6818)  --->

Boot options  --->

Device Drivers  ---> // 硬件驱动设备

File systems  ---> // 文件系统

b)$:'make config

// 纯文字提示,基本不用

c)$:'  make xconfig

// 真实图形显示菜单界面,基本不用

"make help" 查看内核make帮助命令。

内核本质也是一个裸板程序。

.o ... .o  ---> elf 文件 (vmlinux)

vmlinux  ---> Image(.bin)  --->  zImage  ---> uImage

zImage:解压缩代码 + 压缩后的Image数据

uImage:64Bytes + zImage

// 64Bytes:内核的加载地址、内核版本 ... 通常给uboot使用。

$:'du -h arch/arm/boot/Image

// 11M

$:'du -h arch/arm/boot/zImage

// 5.2M 5400688,压缩后的Image

$:'du -harch/arm/boot/uImage

// 5.2M 5400752

$:'du -h

// 以兆(M)显示文件大小 和 文件名

$:'du -b

// 以字节数显示文件大小 和 文件名

3.2 linux内核的启动过程

阅读代码,组织工程。

linux : vim + ctags

$:'rm arch/arm/mach-s5p6818/prototype/prototype

$:'ctags -R *

windows : source insight

入口点文件:

$:'rm vmlinux

$:'make uImage V=1

// V=1 显示详细的编译过程

$:'vi arch/arm/kernel/vmlinux.lds

.head.text : {

_text = .;

*(.head.text)

}

// 整个linux内核的入口点文件:arch/arm/kernel/head.S

head.S:

设置SVC模式

__lookup_processor_type  // 检查CPU的ID看内核的状态

bl  __create_page_tables  // 建立页表

ldr     r13, =__mmap_switched

b       __enable_mmu

。。。

。。。

b       __turn_mmu_on

450 ENTRY(__turn_mmu_on)

457         mov     r3, r13

458         mov     pc, r3//跳转到__mmap_switched

__mmap_switched:

b       start_kernel

start_kernel

-->rest_init

{

//建立一个新的内核线程

kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);

}

kernel_init( )

{

prepare_namespace( )

{

//根据bootargs的参数,挂载根文件系统

mount_root( );

}

init_post( )

{

//执行用户空间的1号进程

run_init_process("/sbin/init");

}

}

系统上电--->uboot完成硬件的初始化--->执行bootcmd中的命令--->加载操做系统到内存--->传递参数给内核,并启动内核--->检查CPU ID当前内核是否支持--->建立页表开启MMU--->start_kernel--->建立一个新的内核线程--->根据参数去挂载根文件系统--->从根文件系统中找到1号进程--->建立执行1号进程--->1号进程后续会建立子进程/bin/bash--->用户能够输入命令

移植内核的关键文件:arch\arm\mach-s5p6818\cpu.c

其中的关键代码信息:

static void __initcpu_init_machine ( void ) {

...

nxp_cpu_devs_register ( );

nxp_board_devs_register ( );

}

// 该函数是在 kernel_init 中被调用,即系统启动过程当中被调用。

kernel_init ( ) {

do_basic_setup ( ) {

do_initcalls ( ) {

...

cpu_init_machine ( ); // 移植的重点。要改的函数。

}

}

}

四、配置过程是如何影响编译过程的

$:'  make menuconfig

Device Drivers  --->

Character devices  --->

-*- LED Support  --->

// LED Support for GPIO connected LEDs ---> help

---> 变量:CONFIG_LEDS_GPIO

$:'vi .config

CONFIG_LEDS_GPIO=y    //

CONFIG_LEDS_GPIO=m  //

# CONFIG_LEDS_GPIO is not set  // < >

【结论1】配置的结果是以变量取不一样的值的形式保存在 .config 文件中。

【结论2】内核中几乎全部的目录下都有Makefile文件。

【结论3】各个子目录下的Makefile决定了当前目录下的文件(夹)是否参与编译过程。

$:'grep "CONFIG_LEDS_GPIO" * -nRw

// grep显示行号-递归-内容检索:

drivers/leds/Makefile:22行使用了该变量

obj-$(CONFIG_LEDS_GPIO) += leds-gpio.o

CONFIG_LEDS_GPIO=y  ' boj-y += leds-gpio.o

CONFIG_LEDS_GPIO=y  ' boj-m += leds-gpio.o

< >   CONFIG_LEDS_GPIO=y  ' boj-  += leds-gpio.o

【结论4】

在编译内核时 boj-y += xxx.o 表明 xxx.c 参与编译,并最终连接到内核uImage;在编译内核时 boj-m += xxx.o 表明 xxx.c 参与编译,但不会连接进内核uImage,生成一个独立的xxx.o;在编译内核时 boj-  += xxx.o 表明 xxx.c 不参与编译。

五、如何将一个.c文件编译进内核

// env/led_drv.c

$:'cp /mnt/hgfs/porting/env/led_drv.c drivers/char/

$:'vi drivers/char/Makefile

增长1行:obj-y               += led_drv.o

$:'make uImage

$:'cp arch/arm/boot/uImage  /tftpboot/

#:'tftp 48000000 uImage

#:'bootm 48000000

#:'dmesg >1.txt

#:'dmesg | grep "led_init"

修改linux编译配置文件,Porting:linux内核编译、配置、修改配置文件、添加.c文件到内核...相关推荐

  1. oracle监听 3个配置文件,Oracle 11g 监听 配置修改 说明

    这里我们看2个比较常用的操作. 1. 停止写listener log 在某些特定的场合可能会有这样的需求.控制这个功能的参数是LOG_STATUS. 官网对这个参数的说明:To turn listen ...

  2. 在linux服务器搭建函数,linux ftp服务器搭建

    ftp服务器安装设置 文章篇幅较长内容主要有可以对以下的内容进行搜索 ***************************************************************** ...

  3. linux内核编译,内核参数修改

    核心(kernel):/boot/vmlinuz-version version 带发行包版本,本地版本 内核模块(kernel object): /lib/modules/version/ 内核设计 ...

  4. Linux内核编译之修改内核版本号

    Linux内核编译--修改版本号 参考文章:https://blog.csdn.net/weixin_38180645/article/details/82856407 一.实验环境 Ubuntu18 ...

  5. 错误linux autocof.h,【技巧】一种提高 [ 定位Linux内核编译错误 ] 效率的方法

    前言:在编译一些非标准linux内核时,常会出现一些错误导致编译中止.这其中的大部分都能通过根据编译器报出的错误定位来查阅源码.找到相关的依赖配置,然后修正配置状态来解决.但也有时候从依赖逻辑中无法发 ...

  6. 嵌入式linux内核编译感想,嵌入式Linux内核的交叉编译编译-基于2.6.26

    测试环境:Fedora 9 Linux 2.6.26 / gcc 4.3.0 / arm-Linux-gcc 3.4.1 本 文主要介绍如何构建在x86平台上交叉编译各平台上的嵌入式Linux内核.要 ...

  7. linux 内核编译详解

    一.准备工作 准备工作如何做,这里就不详说了. a) 首先,你要有一台PC,装好了Linux. b) 安装好GCC(这个指的是host gcc,用于编译生成运行于pc机程序的).make.ncurse ...

  8. linux 内核 编译详解

    一.内核简介  内核,是一个操作系统的核心.它负责管理系统的进程.内存.设备驱动程序.文件和网络系统,决定着系统的性能和稳定性.  Linux的一个重要的特点就是其源代码的公开性,所有的内核源程序都可 ...

  9. Linux内核编译与管理

    我们说的Linux其实指的就是内核而已.这个核心控制你主机的所有硬件并提供系统所有的功能,我们开机的时候其实就是利用开机管理程序加载这个核心文件来侦测硬件,在核心加载适当的驱动程序后,你的系统才能够顺 ...

最新文章

  1. AI教父杰弗里辛顿:AI反学习可能揭开人类梦境的奥秘
  2. JEESZ分布式框架之技术介绍文档
  3. sysenter Hook
  4. ajax大数据导入的一系列问题处理
  5. 为什么需要做归一化或者标准化
  6. mysql容量性能测试_关于RDS for MySQL的各规格性能测试情况
  7. 加州无人车路测历史性变革!远程遥控,真正无人
  8. Access 数据库导入到SQL Server 2000
  9. nodejs 游戏框架_Pomelo:网易开源基于 Node.js 的游戏服务端框架
  10. websockets 断开问题解决方案
  11. OpenWrt旁路由设置教程
  12. TI高精度实验室-运算放大器-第六节-压摆率
  13. containers matlab,Matlab 中实用数据结构之 containers.Map
  14. 大文件分割工具,QT实现
  15. Kafka知识点概述
  16. java 求最大公因数_三种算法求最大公约数——Java实现 | 学步园
  17. Hive输出文件的间隔符
  18. PS查看设计图中文字大小,颜色
  19. python中一切可迭代对象都支持解包 - Iterable Unpacking
  20. 《第6讲 非线性优化 》读书笔记

热门文章

  1. 计算机视觉在农业领域中的应用
  2. 计算机模拟电子云密度,小知识:分子动力学基本原理及应用
  3. Android攻城狮 progressBarprogressDialog
  4. “50欧姆”特性阻抗的由来
  5. iOS面试题目及答案总结
  6. 《测量心理学》技能部分考题分析
  7. 如何写好科研论文(笔记)
  8. JAVA实现图片加水印及Base64图片字符串加水印
  9. 用函数统计各分数段人数c语言,如何使用Excel函数统计各分数段的人数(五种方法)...
  10. 实时数仓实践(一)之数据库实时增量同步工具-CDC(Change Data Capture)