2019独角兽企业重金招聘Python工程师标准>>>

ARM Linux的系统调用实现原理是采用swi软中断从用户(usr)模式陷入管理模式(svc)。

内核空间和用户空间这两个名词用来区分程序执行的两种不同状态, 它们使用不同的地址空间。
Linux只能通过系统调用和硬件中断完成从用户空间到内核空间的控制转移。

Linux驱动开发者需要牢固地掌握Linux内核的编译方法以为嵌入式系统构建可运行的Linux操作系统
映像。在编译内核时,需要配置内核,可以使用下面命令中的一个:

#make config( 基于文本的最为传统的配置界面, 不推荐使用)
#make menuconfig( 基于文本菜单的配置界面)
#make xconfig( 要求QT被安装)
#make gconfig( 要求GTK+被安装)
在配置Linux内核所使用的make config、make menuconfig、make xconfig和make gconfig这4种方式中,最值得推荐的是make menuconfig,它不依赖于QT或GTK+,且非常直观,对/home/baohua/develop/linux中的Linux 4.0-rc1内核运行make ARCH=arm menuconfig后的界面如图3.9所示。

内核配置包含的条目相当多, arch/arm/configs/xxx_defconfig文件包含了许多电路板的默认配置。只需
要运行make ARCH=arm xxx_defconfig就可以为xxx开发板配置内核。
编译内核和模块的方法是:
make ARCH=arm zImage
make ARCH=arm modules
上述命令中,如果ARCH=arm已经作为环境变量导出,则不再需要在make命令后书写该选项。执行完
上述命令后,在源代码的根目录下会得到未压缩的内核映像vmlinux和内核符号表文件System.map, 在
arch/arm/boot/目录下会得到压缩的内核映像zImage,在内核各对应目录内得到选中的内核模块。
Linux内核的配置系统由以下3个部分组成:

·Makefile: 分布在Linux内核源代码中, 定义Linux内核的编译规则。
.配置文件( Kconfig) : 给用户提供配置选择的功能。
.配置工具: 包括配置命令解释器( 对配置脚本中使用的配置命令进行解释) 和配置用户界面( 提供
字符界面和图形界面) 。 这些配置工具使用的都是脚本语言, 如用Tcl/TK、 Perl等。

使用make config、 make menuconfig等命令后, 会生成一个.config配置文件, 记录哪些部分被编译入内核、 哪些部分被编译为内核模块。
运行make menuconfig等时, 配置工具首先分析与体系结构对应的/arch/xxx/Kconfig文件( xxx即为传入
的ARCH参数) , /arch/xxx/Kconfig文件中除本身包含一些与体系结构相关的配置项和配置菜单以外, 还通过source语句引入了一系列Kconfig文件, 而这些Kconfig又可能再次通过source引入下一层的Kconfig。

在Linux内核中增加程序需要完成以下3项工作。
·将编写的源代码复制到Linux内核源代码的相应目录中。
·在目录的Kconfig文件中增加关于新源代码对应项目的编译配置选项。
·在目录的Makefile文件中增加对新源代码的编译条目。
1.实例引导: TTY_PRINTK字符设备
在讲解Kconfig和Makefile的语法之前, 我们先利用两个简单的实例引导读者对其建立对具初步的认
识。
首先, 在drivers/char目录中包含了TTY_PRINTK设备驱动的源代码drivers/char/ttyprintk.c。 而在该目录
的Kconfig文件中包含关于TTY_PRINTK的配置项:

上述Kconfig文件的这段脚本意味着只有在EXPERT和TTY被配置的情况下, 才会出现TTY_PRINTK配
置项, 这个配置项为三态(可编译入内核,可不编译,也可编译为内核模块,选项分别为“Y”、 “N”和“M”) , 菜单上显示的字符串为“TTY driver to output user messages via printk”, “help”后面的内容为帮助信息。 图3.10显示了TTY_PRINTK菜单以及help在运行make menuconfig时的情况。

除了布尔( bool) 配置项外, 还存在一种布尔配置选项, 它意味着要么编译入内核, 要么不编译, 选
项为“Y”或“N”。

在目录的Makefile中关于TTY_PRINTK的编译项为:

obj-$(CONfiG_TTY_PRINTK) += ttyprintk.o

上述脚本意味着如果TTY_PRINTK配置选项被选择为“Y”或“M”, 即obj-$(CONFIG_TTY_PRINTK)
等同于obj-y或obj-m,则编译ttyprintk.c,选“Y”时会直接将生成的目标代码连接到内核, 选“M”时则会生成模块ttyprintk.ko;如果TTY_PRINTK配置选项被选择为“N”,即obj-$(CONFIG_TTY_PRINTK) 等同于obj-n, 则不编译ttyprintk.c。
一般而言, 驱动开发者会在内核源代码的drivers目录内的相应子目录中增加新设备驱动的源代码或者
在arch/arm/mach-xxx下新增加板级支持的代码, 同时增加或修改Kconfig配置脚本和Makefile脚本, 具体执
行完全仿照上述过程即可。

以上内容摘自《Linux设备驱动开发详解:基于最新的Linux4.0内核》

转载于:https://my.oschina.net/cht2000/blog/983549

Linux内核的编译方法及如何往内核中增加程序相关推荐

  1. arm linux打印机驱动编译方法,嵌入式linux驱动打印机HP系列

    arm linux打印机驱动编译方法和过程记录(2017.03.15): 改动添加概述: 添加foo2zjs工具(用于发送数据到打印机进行打印): 添加gohstscript工具(用于转换文档格式到打 ...

  2. Linux编译soci库,Soci库linux下的编译方法

    Soci库的linux编译方法 1.下载soci库源码 2.在目标机器上配置数据库环境 以oracle为例:(其他数据库只需要简单安装客户端即可) A)下载oracle客户端安装包 oracle-in ...

  3. Linux基础命令学习——方法二(给swap分区增加500M)

    在之前的博客中也有相关介绍,将Swap分区扩展500M,当然有很多方法,今天来记录第二种方法. 上篇介绍swap分区扩展500M的方法: Linux基础命令学习--实战篇(给swap分区增加500M) ...

  4. OKL4 linux kernel的编译方法

    一.下载OKL4 linux kernel:oklinux_2.6.24.9-patch.4.tar.gz 地址:http://wiki.ok-labs.com/Microkernel 二.将okli ...

  5. Linux fwrite 什么时候刷新,linux的fwrite()使用方法,当前时间写入文本的程序

    1.函数功能 用来读写一个数据块. 2.一般调用形式 fwrite(buffer,size,count,fp); 3.说明 (1)buffer:是一个指针,对fread来说,它是读入数据的存放地址.对 ...

  6. C#中获取程序当前路径的方法[转]2011-10-25 15:40C#中获取程序当前路径的方法

    System.Diagnostics命名空间 string str1 =Process.GetCurrentProcess().MainModule.FileName;//可获得当前执行的exe的文件 ...

  7. TL138-EVMLinux内核编译方法

    Revision History Draft Date Revision No. Description 2017/06/16 V1.2 1.增加编译模块modules的方法. 2016/03/02 ...

  8. Linux内核开发之将驱动程序添加到内核

    一 . 概述: 在 linux 内核中增加程序需要完成以下三项工作: 1. 将编写的源代码复制到 Linux 内核源代码的相应目录 2. 在目录的 Kconfig 文件中增加新源代码对应项目的编译配置 ...

  9. AM5728 linux内核编译方法

    一.编译 Linux 内核 在 Linux 内核源码安装目录下,执行如下命令编译 Linux 内核: Host# make ARCH=arm CROSS_COMPILE=arm-linux-gnuea ...

最新文章

  1. Github高级搜索技巧
  2. 我的爸爸是xiang目经理.....
  3. dnastar拼接反向互补序列_一起看流畅的python:序列构成的数组
  4. 给定年月日计算是一年的第几天
  5. tmemo 选择消除行_Divi模块,行和部分加入高级动画选项
  6. 【15】docker
  7. 12.13记录//QQDemo示例程序源代码
  8. centos gcc 版本安装9.3 c++17
  9. 如何看待0.5元可买到身份匹配的人脸数据?
  10. ppt生成器_#PPT素材神器#在线卡通头像生成器: avataaars generator
  11. 用于查询当前数据库中所有表格的记录条数的脚本
  12. STM32串口通讯初步学习
  13. yolov5-6.0 出现Arial.ttf无法下载问题解决办法
  14. ubantu下安装搜狗输入法
  15. Bip44确定性算法的Java实现库(Android和java平台都可以使用)
  16. Python开发资源速查表
  17. js实现活动时间倒计时
  18. 【监控】Prometheus(普罗米修斯)监控概述
  19. GitHub Pages + Hexo搭建个人博客网站,史上最全教程
  20. SQL Server 2005系列教学(11) 约束

热门文章

  1. 【SpringBoot】SpringBoot最精简的设置
  2. Linux下MySQL表名区分大小写
  3. 静态路由的不通配置方式
  4. 可替代的C语言开发环境
  5. Webpack入门——使用Webpack打包Angular项目的一个例子
  6. 微信支付 支付成功后不跳转 ecshop微信支付 如下操作即可
  7. SQL基本操作(三):存储过程和触发器
  8. 布线规划要点-开始设计前必须考虑的几个问题
  9. PhoneGap对比html5写android应用程序【android进化三十八】
  10. JAVA-SWING:生成透明JTable