git:版本管理工具
源代码用C语言和汇编实现
2、Linux内核支持多种硬件架构平台
3. Linux内核采用模块化方式编写,具有分层的方式。
4. Linux内核是使用C和汇编代码实现的。
内核中最好不要使用C++
5、Linux内核具有良好的移植和剪裁特性
通过图形界面的配置方法可以完成裁剪
2. 获取linux内核源码
1. linux官方获取
2.从芯片厂家获取
3.从开发板厂家获取
4、公司高管获得
由于三星没有将S5p6818芯片硬件支持开源到linux内核官方
本次实验不使用linux内核官方的源码。
本次使用使用:kernel-3.4.39-ok.tar.bz2
3.Linux内核版本命名方法
主版本号.次版本号.修订号
主版本号:内核源码有较大的改动才会更新主版本号
次版本号:修订版本号用完升级次版本号
偶数:稳定版
奇数:测试版
修订版本号:内核代码只要有更新就会修改修订版本号
4.Linux内核版本的选择
1、不要选择太新的
2、不要选择太旧的
3.选择稳定版本
5.linux内核的配置与编译
1.将linux内核源码压缩包复制到
1)将内核源码复制到该目录下
2)解压内核源码
tar -vxf -3.4.39-ok.tar.xz
3)进入内核源码目录
光盘-3.4.39
2.分析内核源码的目录结构
平台相关代码:与硬件相关的代码
拱
平台无关代码:与硬件无关的代码
库
网
FS
……
3.配置并编译内核
:
clean
mrproper
distclean
:
menuconfig - Update current config utilising a menu based program
modules - Build all modules
uImage - U-Boot wrapped zImage
fs6818_defconfig - Build for fs6818
“赚${}”
一个./。文件通过使用
从
拱门/$ARCH//${}.
使用“make help”获取所有内容的列表
你的。
4、linux内核详细配置及编译过程
1)修改文件并配置交叉编译工具链
195 ARCH ?=
196 CROSS_COMPILE ?=
修改为:
195 ARCH ?= arm
196 CROSS_COMPILE ?= arm-none-linux-gnueabi-
2)清除内核的中间文件
make(仅在第一次编译源代码时执行一次)
3)配置内核源码支持硬件平台
制作
(仅在第一次编译源代码时执行一次,
如果执行make后,
需要重新执行make)
4)通过图形界面配置(剪切)内核
制作
注:制作
第一次使用make需要安装图形界面工具。
配置前需要安装图形图(make):
sudo apt-get -dev
须藤 apt-get
注意:出现此错误
//mconf
你的太小了,跑不了!
它必须至少为 19 行 x 80 行。
make[1]: *** [] 错误 1
制作:***[]错误2
终端字体太大,减小终端字体
5.编译内核
制作
注:制作
编译过程中可能会出现以下错误:
"" 未找到 - U-Boot 将不会被构建
make[1]: *** [arch/arm/boot/] 错误 1
制作:***[]错误2
错误原因:未找到命令,
根据提示分析,应该是存放在uboot源码目录下。
uboot源代码必须编译后才会有可执行程序。
如何解决问题:
在uboot源码的tools目录下,
复制到/usr/bin目录:
sudo cp ~/uboot源代码目录/tools/ /usr/bin
再次make并重新编译内核即可。
打印以下信息表示编译成功:
Image Name: Linux-3.4.39-farsight
Created: Mon Jul 20 15:09:28 2020
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 5391608 Bytes = 5265.24 kB = 5.14 MB
Load Address: 40008000
Entry Point: 40008000
uImage内核镜像在一下目录中:
Image arch/arm/boot/uImage is ready
6、make{}流程详细分析。
1、打开Linux内核源码顶层目录下的文件,搜索“%”
491 %config: scripts_basic outputmakefile FORCE
492 @mkdir -p include/linux include/config
493 @$(MAKE) $(build)=scripts/kconfig $@
去掉命令前的@,重新执行make fs6818_defconfig
mkdir -p include/linux include/config
make -f scripts/Makefile.build obj=scripts/kconfig fs6818_defconfig
进入scripts/kconfig目录继续执行make fs6818_defconfig
2、打开/目录下的文件,搜索“”
95 %_defconfig: $(obj)/conf
96 $(Q)$< --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)
去掉命令前的@,重新执行make fs6818_defconfig
scripts/kconfig/conf --defconfig=arch/arm/configs/fs6818_defconfig Kconfig
使用file命令查看conf文件的属性:
作用:根据arch/arm/configs/fs6818_defconfig
和内核源码顶层目录下的Kconfig文件,
生成默认的.config配置文件
7.详细分析make过程。
1、打开Linux内核源码顶层目录下的文件,搜索“%”
491 %config: scripts_basic outputmakefile FORCE
492 @mkdir -p include/linux include/config
493 @$(MAKE) $(build)=scripts/kconfig $@
去掉命令前的@,重新执行make menuconfig
mkdir -p include/linux include/config
make -f scripts/Makefile.build obj=scripts/kconfig menuconfig
进入scripts/kconfig目录继续执行make menuconfig
2、打开/目录下的文件,搜索“”
//obj = scripts/kconfig
20 menuconfig: $(obj)/mconf
21 $< $(Kconfig)
展开后
menuconfig: scripts/kconfig/mconf
scripts/kconfig/mconf Kconfig
mconf作用:根据Kconfig文件中的信息,生成图形化界面。
mconf中调用了图形化界面的库:ncurses
3.打开内核源码顶层目录
5 mainmenu "Linux/$ARCH $KERNELVERSION Kernel Configuration"
6
7 config SRCARCH
8 string
9 option env="SRCARCH"
10
11 source "arch/$SRCARCH/Kconfig"
mainmenu: 主菜单
语法格式:mainmenu "主菜单的名字"
source :引入下一级菜单
语法格式: source "下一级菜单的Kconfig的路径"
4.打开arch/arm/目录下的文件
菜单…:菜单
格式:
菜单“菜单名称”
菜单选项
“下一级菜单”
256 config MMU
257 bool "MMU-based Paged Memory Management Support"
258 default y
259 help
260 Select if you want MMU-based virtualised addressing space
261 support by paged memory management. If unsure, say 'Y'.
布尔值:菜单选项
语法格式:bool“菜单选项名称”
: 默认
帮助:帮助信息
分析的作用是什么?
/字符//
.:最终在将它们编译到内核中起着决定性的作用,
哪些驱动没有编译进内核
内核工程的管理是通过. 。
打开/char//文件
1 menu "FS6818 board device driver support"
3 config FS_ADC
4 bool "adc driver for farsight FS6818 all platform"
5 default y
6 help
7 different sensor select different channel
....
endmenu
打开/char//文件
3 obj-$(CONFIG_FS_ADC) += adc_driver.o
如果=y则对应的驱动被编译到内核镜像中
如果该变量为空,则相应的驱动程序不会被编译到内核映像中。
那么变量是在哪里定义的呢?
在 .file 中进行定义。
要点:.这三个文件之间有什么关系呢?
:进行项目管理,配置和编译内核
。 :存储默认配置信息
对于文件使用,该文件基于
****=y,对应的驱动编译成
#****没有设置,对应的驱动没有编译进
根据足弓/手臂//制作
和文件生成.file
制作时,根据菜单选项的配置
.将被修改
:生成图形界面的菜单选项的配置文件
大多数目录下都有一个文件和多个文件。
7. 模块化编译内核
以模块化的方式编译内核驱动
布尔:[]
[*]:驱动程序被编译到内核映像中
[ ]: 驱动程序未编译到内核映像中
: 三态
:驱动程序被编译到内核映像中
< >:驱动程序未编译到内核映像中
:驱动程序采用模块化方式编译
使用make命令编译驱动程序,
***.c文件将被编译生成***.ko驱动文件。
当需要使用驱动时,使用命令将驱动加载到内核中:
insmod ***.ko
当不再需要该驱动程序时,使用 rmmod 命令从内核中卸载该驱动程序:
rmmod *** # 卸载时只需要指定驱动的名字
使用 lsmod 命令查看所有动态加载的驱动程序。
8. 内核启动过程做了什么?
1> uboot通过tftp命令下载到内存
2> 需要完成自解压
3> 获取CPU的ID号并创建页表。
初始化MMU,完成物理地址到虚拟地址的映射
4> 清除BSS段
5> 完成大部分硬件的初始化,进一步初始化硬件
内存、时钟、串口、EMMC、nfs客户端……
5> 从u-boot环境变量的内存分区获取参数,
根据参数决定根文件系统的挂载位置。
6> 挂载根文件系统,
7> 执行根文件系统中的1号进程,程序
8> 本开发板的Linux系统已启动成功。
扫一扫在手机端查看
-
Tags : linux 低内核驱动怎么移植到高内存
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。