编译内核时的一些概念

Android 系统编译之内核编译 本来想超频自己的手机的,于是发现需要编译内核才能实现 作为Android开发者的我 没有任何内核编译经验,只是想试一下, 于是折腾了两天终于把内核成功编译出来了 现在分享下学习经验 我的是小米手机,其实我看了一下github, 其他手机的内核开源的目录结构几乎是一样的,所以应该是同一种编译方式 网上的文章实在太少了, 真的是太少了!!! 少到你只能找到几篇英文的国外文章… 但论坛上都... 阅读详情
一、编译

1.解压缩
①tar xvf linux-2.6.22.6.tar.bz2
②进入linux-2.6.22.6目录  
cd linux-2.6.22.6/
2.打补丁
patch -p1<../linux-2.6.22.6_jz2440.patch 
3.配置内核(具体来说就是:支持哪个架构的单板)
->生成.config
①make menuconfig
->选择你所需的东西,编进内核(①做为模块编进内核 ②静态编进内核built-in.o)
->这种方法很复杂.因为配置选项太多.
②使用默认的配置,在上面修改
->在内核目录(linux-2.6.22.6/)下查找
find -name "*defconfig*"   -->会搜索出很多文件
->进入 ./arch/arm/configs/ 目录看一下:
 cd ./arch/arm/configs/    ->>里面有很多配置文件 “ XXX_defconfig”  (XXX 代表很多类似的文件名       ->>我们找到和我们的2440开发板相似的配置文件 s3c2410_defconfig  
->返回 /work/system/linux-2.6.22.6$ 目录
执行:make s3c2410_defconfig   ->>生成了 .config文件 (也就是Linux内核的配置文件)
->>我们的 make menuconfig 命令也是去 读 .config文件,然后出现菜单.
->.config里面的内容就是我们所需的配置内容,不同的开发板需要去做相应的修改
③使用厂家提供的配置文件(如:config_ok)
->厂商给我们提供了配置文件config_ok  
那我们讲config_ok的内容拷贝到.config就可以了
cp config_ok .config
->执行make menuconfig 
出现配置菜单,配置它
4.编译
①编译uImage
->make uImage

二、配置
(1) 为什么我们在编译内核之前需要配置呢? 原因很简单:需要哪些东西(也就是支持哪些东西)就配置它,让内核支持它.从内核源码的角度来看的话,内核源码中出现了很多"判断语句"(官方的说法是:条件指示符),这样就会出现“动态编译”的情况,内核怎么知道需要把哪些"条件指示符"所包含的内容 编译进内核呢? 就必须依靠 配置文件(.config)了
总结:配置主要从两个方面出发
①从Makefile的角度
-> 静态编进内核(直接编进内核)
-> 动态编进内核(做为模块编进内核)
-> 在/include/config目录下自动生成auto.conf 给顶层Makefile使用
->>在顶层Makefile中搜索auto.conf : 可以看到 include/config/auto.conf     (当然,没有配置的内核代码是找不到 include/目录下的config目录的)
在auto.conf中可以看到类似于:              这样的配置选项,这是提供给顶层Makefile使用的.
| ONFIG_ROOT_NFS=y                  |
| CONFIG_TMPFS=y                    |
| CONFIG_LEDS_TRIGGER_HEARTBEAT=m   |
| CONFIG_GENERIC_GPIO=y             |
| CONFIG_S3C2410_PM=y               |
②从内核源码的角度
->“条件指示符”所指示的"代码"到底需不需要被编进内核.
->在include/linux目录下自动生成了autoconf.h这个头文件(当然,没有配置的内核代码是找不到 autoconf.h这个头文件的)       
在autoconf.h中可以看到类似于:                   这样的配置选项,这是提供给Linux源码使用.  
|  #define CONFIG_CPU_S3C2410_DMA 1        |
|  #define CONFIG_CRYPTO_ECB_MODULE 1      |
|  #define CONFIG_SMDK2440_CPU2440 1       |
 |  #define CONFIG_KGDB_PORT_NUM 0          |
 |  #define CONFIG_SERIAL_8250_SHARE_IRQ 1  |
(2) 为了更好的说明这种情况我们来看个例子: 让内核支持 网卡(DM9000)
①在/work/system/linux-2.6.22.6 目录下搜索 CONFIG_DM9000
-> grep "CONFIG_DM9000" * -nR (搜索出一堆东西,我们来看我们所需的信息)
->> config_ok:599:CONFIG_DM9000=y
->> drivers/net/Makefile:197:obj-$(CONFIG_DM9000) += dm9000.o
->> arch/arm/plat-s3c24xx/common-smdk.c:46:#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)            <注意:CONFIG_DM9000在原始的Linux内核源码可能找不到,要在打好补丁或者配置后的源码中才能找到,根据具体的厂商而定>
②我们看到config_ok 中有这么一句: CONFIG_DM9000 = y  (y 的含义是静态编进内核 M 是以模块编进内核) 然后drivers/net/目录下的 Makefile 文件会把 dm9000.o 静态编进内核: obj-y += dm9000.o 这是站在Makefile的角度来说的.
<当然它还会自动生成一个配置文件auto.conf(在/include/config目录下) 给 顶层Makefile使用>
③上面的例子不足以说明.config对源码层次的影响,我们再来看一个源码级别的例子.
-> 在s3c2410fb.c(driver/video)文件中找到了这么一段代码.
        
#ifdef CONFIG_FB_S3C2410_DEBUG
static int debug   = 1;     
#else                         
static int debug   = 0;     
#endif            
->我们看到 CONFIG_FB_S3C2410_DEBUG  这么个宏定义.我们在内核源码里面是搜索不到的.其实它被定义在.config当中
(当然,定义在.config当中是不能被内核代码使用的,需要被定义为宏才能被内核代码使用, 这样就必须自动生成 XXX.h文件)
->我们在内核源码目录下搜索CONFIG_FB_S3C2410_DEBUG :   grep "CONFIG_FB_S3C2410_DEBUG" * -nR
       arch/arm/configs/s3c2410_defconfig:929:# CONFIG_FB_S3C2410_DEBUG is not set
       config_ok:948:# CONFIG_FB_S3C2410_DEBUG is not set                         
       drivers/video/s3c2410fb.c:109:#ifdef CONFIG_FB_S3C2410_DEBUG               
       通过上面搜索的信息,我相信大家可以明白 .config(config_ok)的配置对 “源码”级别的影响了.
       
->注意:当然这个和“宏”还是有区别的,宏只能在 XX.h中定义, Linux中 include/linux/autoconfig.h 是自动生成的,
include/linux/autoconfig.h 中的内容就来源于 .config 换句话说,include/linux/autoconfig.h 中的内容是根据.config 中的内容而生成的.
(3)总结
  生成.config
-------------------------------------------------------------------------
  编译内核:make uImage
-------------------------------------------------------------------------
自动生成->
① auto.conf ②autoconf.h(宏)   
-------------------------------------------------------------------------
①提供给顶层Makefile使用 ②提供给内核C源码使用

举个例子:
1.我们需要在开机启动我们的应用程序(比如QT)我们需要使用到 LCD,触摸屏。所以我们就需要根据配置选项来
将LCD,触摸屏的驱动程序"静态"编进内核。那我们得来修改"相关的Makefile"文件,最后再是"编译内核"
2.当然,我们要使用触摸屏,首先我们得需要把"触摸屏驱动"静态编进内核.针对我自己的开发板TQ2440
我们需要改一下Linux内核的Makefile。以支持我们TQ2440的触摸屏。
具体修改一下文件:   obj-$(CONFIG_TOUCHSCREEN_S3C2410)       += s3c2410_ts.o
修改/work/system/linux-2.6.22.6/drivers/input/touchscreen/Makefile 中的
obj-$(CONFIG_TOUCHSCREEN_S3C2410)       += s3c2410_ts.o
改为我们自己的触摸屏驱动:
obj-$(CONFIG_TOUCHSCREEN_S3C2410)       += s3c_ts.o        //s3c_ts 该驱动为TQ2440触摸屏的驱动程序。
有时候可能看不到这个"选项",因为我们还没有"配置内核",也就是没有make menuconfig(没有选中对触摸屏的支持)
当生成.config之后,可以查看里面的选项。对于s3c2410 而言,是在执行 make s3c2410_defconfig 后 
obj-$(CONFIG_TOUCHSCREEN_S3C2410)选项才生成的,不信可以看.config文件
.config文件当中必须得有这么一句: CONFIG_TOUCHSCREEN_S3C2410=y  
当然我们得把s3c_ts.c文件放到  /work/system/linux-2.6.22.6/drivers/input/touchscreen/  目录下。
然后将内核重新编译。再烧写。   
               
如果你的LCD也是特殊的(也就是内核不支持的),你自己的LCD驱动代码也得静态编译进内核。
做如下修改:
修改/work/system/linux-2.6.22.6/drivers/video/目录下的 Makefile 
将 obj-$(CONFIG_FB_S3C2410)          += s3c2410fb.o  改为:  obj-$(CONFIG_FB_S3C2410)          += lcd.o //lcd.o为TQ2440的LCD驱动程序

    





Linux内核编译与安装 Linux内核是一个用C语言写成的,符合POSIX标准的类Unix操作系统。内核是操作系统中最基本的一部分,提供了众多应用程序访问计算机硬件的机制。Linux内核的一大特点就是采用了整体式结构,有很多过程组成,每个过程都可以独立编译,其模块机制又湿得内核保持独立而又易于扩充。Linux发行版实在Linux内核的基础之上,与外带的应用软件和工具打包配置之后发行的版本。 阅读详情

相关推荐

linux内核编译

前言 Linux内核是Linux操作系统的核心,也是整个Linux功能体现的核心,就如同发动机在汽车中的重要性。内核主要功能包括进程管理、内存管理、文件管理、设备管理、网络管理等。Linux内核是单内核设计,但却采用了微内核的模块化设计,支持内核线程以及动态装载内核模块的能力。 Linux作为一个自由软件,在广大爱好者的支持下,内核版本不断更新。新的内核修订了旧内核的bug,并增加了许多新的特性。如果用户想要使用这些新特性,或想根据自己的系统定制一个更高效、更稳定的内核,就需要手动编译Linux内核。那么如

manongxianfeng的博客 7415

linux8250驱动支持5路串口,linux 设备驱动之8250串口驱动分析

linux 设备驱动之 8250 串口驱动------------------------------------------本文系本站原创,欢迎转载!转载请注明出处:http://ericxiao.cublog.cn/------------------------------------------一:前言前一段时间自己实践了一下8250芯片串口驱动的编写。今天就在此基础上分析一下linux ...

weixin_42365422的博客 787

双传声器法测量吸声材料的吸声系数(公式推导与解释)

在双传声器法中,通过测量两个位置的声压 p1和 p2​,可以分离出入射波和反射波的声压分量。双传声器法一般在阻抗管中进行,阻抗管的一端为平面波声源,另一端放置待测材料。两个传声器放置在靠近材料的阻抗管内,用于测量管道内的声压。双传声器法是一种常用于测量材料吸声系数的实验方法,通过在管道内使用两个传声器测量声波的入射和反射,来计算出材料的吸声系数。当测试样品较少时,测试时,需要交换两个传声器的位置,目的是为了相位校准。

m0_57407372的博客 1875

rk3399启动过程中Serial: 8250/16550 driver, 6 ports, IRQ sharing disabled

内核启动过程中遇到的IRQ共享问题

weixin_45591821的博客 1224

BOM 数据模型设计

字段名数据类型必填说明物料编码 (Part Number)字符串是唯一标识,主键。建议包含分类前缀(如STD-GEN-CUS-物料名称 (Part Name)字符串是版本 (Revision)字符串是如AB1.0,与编码组合构成唯一实例。状态 (Status)枚举是设计中(Draft)已发布(Released)已归档(Archived)已作废(Obsoleted)类型 (Type)枚举是专用件(Custom)借用件(Borrowed)通用件(Generic)标准件(Standard)

Davina_yu的博客 1756

LoRa项目实战:手把手教你为ESP32选配和焊接天线(从PCB到信号测试)

本文详细介绍了为ESP32选配和焊接LoRa天线的全流程,包括天线选型、PCB布局设计、焊接工艺及信号测试。重点解析了PCB板载天线、导线天线和陶瓷贴片天线的适用场景与性能特点,并提供专业的焊接技巧和信号测试方案,帮助开发者优化LoRa模块的无线通信性能。

weixin_30470643的博客 393

Linux tips: allow more than 4 serial ports

搞嵌入式的经常要和串口通讯打交道,在开发的时候有可能同时使用十几个串口,这个时候一个PCI多串口卡就好用了。   但是很多Linux发行版的8250驱动默认限制检测的最大串口数量为4,例如在Ubuntu 8.10有如下配置:   cat /boot/config-`uname -r` | grep 8250     CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250_A...

Step Third 502

减小伺服电机共振的方法(以松下伺服为例)

嘿 ! 我是【小黄】 , 我们又见面啦 !!! 毕竟技术只有大家交流才会进步嘛 ! 这博客是对自己学习的一点点记录和总结 ,如果您对自动控制感兴趣的话 ,可以关注一下我的动态 , 我们一起学习呀 ! 我们都还年轻 ,我们还有无限可能 。 YES ! 减小伺服电机共振的方法(以松下伺服为例)1. 准备工作:1.1.1 如何推定共振点:1.1.2 测定实操:1.1.3 总结:2. 下期预告: 在我们调试完伺服参数以后机器人运动到某个特定位置会产生振动或异响,我们要做的就是消除这个异响保..

在下小黄的博客 1万+

调试tty发送的日志问题

tty调试时,在串口终端发送数据流程调用 printk会导致死机 解决办法 struct mid8250 { int line; int dma_index; struct pci_dev *dma_dev; struct uart_8250_dma dma; struct mid8250_board *board; struct hsu_d...

dp__mcu的专栏 1057

日志异常检测详细整理,看这一篇就够了(附各项目代码链接)

对于不用的日志键,用它们的参数值向量训练一个参数值异常检测模型来检测有这些参数值反映的系统性能异常。与标准的GAN框架一样,D和G的参数是基于D的输出来更新的,因此鉴别器D可以被训练为尽可能敏感地将正确的标签分配给真实和虚假序列,而生成器将被训练为尽可能聪明地在经过足够多轮的迭代后欺骗鉴别器,即误导D将真实标签分配给虚假序列。LR:逻辑回归是有监督的模型,将处理后的特征矩阵以及标记作为模型的输入,得到训练后的模型,用此模型预测新出现的特征向量,以此判断特征向量是否为异常的,进而判断日志异常。

qq_20368489的博客 1万+

Spring AI Alibaba 1.x 源码分析-架构设计

本文通过分析Spring AI Alibaba 框架的源码,分析出其原理和架构设计,无论是用于项目开发、技术评估还是团队培训都具有重要价值。

program哲学 490

Linux内核编译

一、编译1.解压缩①tar xvf linux-2.6.22.6.tar.bz2②进入linux-2.6.22.6目录  cd linux-2.6.22.6/2.打补丁patch -p1<../linux-2.6.22.6_jz2440.patch 3.配置内核(具体来说就是:支持哪个架构的单板)->生成.config①make menuconfig->选择你所需的东西,编进内核(①做为模块编进内核

快乐小蜘蛛 624

【虚幻引擎UE】UE5 阴影异常与优化

【虚幻引擎UE】UE5 阴影异常与优化解决方案合集

灵境引路人 3万+

linux交叉编译和内核编译

20181005记 一、交叉编译arm-linux-gcc 由于嵌入式系统资源匮乏,一般不能像 PC 一样安装本地编译器和调试器,不能在本地编写、编译和调试自身运行的程序,而需借助其它系统如 PC 来完成这些工作,这样的系统通常被称为宿主机。 宿主机通常是 Linux 系统,并安装交叉编译器、调试器等工具;宿主机也可以是 Windows系统,安装嵌入式 Linux 集成开发环境。在宿主机上编写和编...

Feng_8071的博客 1万+

问题解答:如何不通过修改底层数据库表的方式,给数据库对应的数据结构,增添新的字段?

现在需要将这张表里的内容读取到 ABAP 内表里,并且针对每个行项目,增加一个新的列字段,我随便举个例子,这个列字段名称叫 LENGTH,值为 OBJ_NAME 字段的长度,使用。最笨的办法就是下面这样定义一个新的类型,这个类型的每个字段名称,都来自数据库表 TADIR 的同名字段,在末尾再增添自定义字段 length.其实我们是做 ALV 输出,只需要 ABAP 内表变量的类型,包含 TADIR 数据库表的全部字段,再加上新的 LENGTH 字段即可。这相当于多了一个中间层,没办法直接被 ALV 处理。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 482

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【深入Linux内核驱动】【Linux设备驱动】驱动编译进内核和编译成模块有什么区别

该文阐述了驱动编译进内核和编译成模块有什么区别,主要通过Makefile文件进行深入

Tschome的博客 1095

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

linux内核编译基础知识,Linux内核模块的编译基础知识

读《嵌入式系统设计与应用开发》第7章linux2.6内核驱动原理关于内核驱动的东西网络上有很多,但网上的东西还是感觉有点笼统,读过之后就忘了,还是需要写下来,或者写到本子上,自己形成一个概念好一些。读了这本书上的东西,把觉得好的东西写下来,已备不时之用,也强化记忆。7。2。1内核模块的概念介绍内核模块的同时,也说明一下和应用程序的区别。虽然内容很多,但觉得都很有用。1、内核模块是一些可以让操作系统...

weixin_42298105的博客 212

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Linux内核编译概述

Linux内核编译概述 Linux 2.6内核编译概述 Linux 2.6内核使用kbuild机制——使用make menuconfig将配置信息保存在.config文件中,当该文件被改变后再重新编译内核,以保证最小化的编译。 Linux 2.6 编译系统 主要包括的文件有: 交互配置工具 Kconfig文件 .config文件 Makefile *.cmd文件 交互配置工具 编译生成的可执行文件,与用户交互,将用户配置保存在.config文件中 Kconfig文件 位于各个子目录,符合kcon

私のBookShelf 267

Ubuntu下编译内核

最详细编译内核2019年3月27日编译内核1.先去官网下载内核源码2.保存一下文件3.安装一下编译内核需要的一些程序4.解压内核到指定位置5.进入到解压位置6.净化源码7.对内核选项进行配置8.删除配置时留下的一些不用的文件9.编译内核10.编译模块11.安装模块12.将3个文件拷贝到boot目录下13.最后一步,更新grub14.小结 2019年3月27日 我在上一篇文章中提到要写一篇编译内核的...

qq_43688952的博客 1万+

Linux内核编译很简单,6步编译一个自己的内核

考虑离开在前面文章中我们反复提到过Linux内核,知道Linux内核才是Linux操作系统最为核心的内容。内核实现了对硬件的管理,为应用软件提供了使用硬件的接口。 对于Linux开发人员而言,内核的学习和开发才是终极目标。因此我们今天先介绍一下内核的编译。 需要知道的是,Linux内核的编译和安装并非想象的那么难,那么复杂,其实只需要几条命令就可以搞定。 本文,我们将一步一步地介绍如何从源代码编译和安装一个Linux内核。需要注意的是本指导基于Ubuntu 18.04版本编译安装,其它发行版可能会有差

资料qun832218493 3万+

Linux内核及内核编译

使用make menuconfig时,配置工具首先分析与体系结构对应的/arch/xxx/Kconfig文件,xxx为传入的ARCH参数,/arch/xxx/Kconfig文件中除本身包含一些与体系结构相关的配置项和配置菜单外,还通过source语句引入一系列Kconfig文件。如果需要几个并发执行的任务,可以启动内核线程,这些线程没有用户空间。内核空间和用户空间用来区分程序执行的两种不同的状态,他们使用不同的地址空间,Linux中只能通过系统调用和硬件中断完成从用户空间到内核空间的控制转移。

weixin_45241469的博客 4590

linux 内核编译

本文介绍了Linux内核编译的详细步骤,包括环境准备、配置选项、编译过程及安装方法,是学习和实践内核编译的指南。

mx_jun的博客 9557

linux内核编译详解

前言Linux内核是Linux操作系统的核心,也是整个Linux功能体现的核心,就如同发动机在汽车中的重要性。内核主要功能包括进程管理、内存管理、文件管理、设备管理、网络管理等。Linux内核是单内核设计,但却采用了微内核的模块化设计,支持内核线程以及动态装载内核模块的能力。Linux作为一个自由软件,在广大爱好者的支持下,内核版本不断更新。新的内核修订了旧内核的bug,并增加了许多新的特性。如果...

Hello,World 1万+

LINUX编译概念,linux内核编译

一:前言1:内核的概念:Kernel(内核)是操作系统的核心,掌控着所有硬件设备的控制权。计算机所要完成的各项工作,都需要通过内核的帮助才能完成。内核就是系统上的一个文件,这个文件包含了驱动主机各项硬件的检测程序与驱动模块。2:什么叫做编译?如果想要完成的某个功能是内核没有提供的,那我们就无法通过内核来控制计算机完成这项工作。如果我们想让内核去完成这个功能,那就必须将这个模块“添加”到内核中,这就...

weixin_28803437的博客 373
上一篇: C语言的平台相关性,编译器相关性
下一篇: C语言数组的dirty corner
芯片之美
博客等级 码龄10年 33粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值