本文转载自:http://blog.csdn.net/fengyuwuzu0519/article/details/73772109

为了弄清内核的组织结构,我们先来实现下面这个简单的例子。

一、增加内核启动Hello World

任务:

内核启动的时候加载Hello驱动,并打印出Hello World

步骤:

(1)在drivers目录下新建hello文件夹,在里面实现相应的hello.c、Makefile、Kconfig

(2)修改上一级(Linux-3.4.2/drivers下)的Makefile、Kconfig

(3)make menuconfig 进行配置

(4)编译、烧写、运行

实现:

(1)实现驱动程序hello.c

最简单的驱动程序

  1. #include <linux/module.h>
  2. #include <linux/kernel.h>
  3. #include <linux/init.h>
  4. #include <linux/delay.h>
  5. static int first_drv_init(void)
  6. {
  7. printk("------------------hello world !--------------------");
  8. return 0;
  9. }
  10. static void first_drv_exit(void)
  11. {
  12. printk("------------------exit hello world !--------------------");
  13. }
  14. module_init(first_drv_init);
  15. module_exit(first_drv_exit);
  16. MODULE_LICENSE("GPL");

(2)实现hello/Makefile

  1. # LED Core
  2. obj-$(CONFIG_HELLO)         += hello.o

注意这里的CONFIG_HELLO,是在.config中定义的,如果配置编译进内核,则在.config中出现CONFIG_HELLO=y,那么hello.o就会被编译进内核。

(3)实现hello/Kconfig

  1. config HELLO
  2. tristate "Hello World for fengyuwuzu"
  3. help
  4. Hello  for fengyuwuzu

config HELLO决定了CONFIG_HELLO这个名字

Hello World for fengyuwuzu:决定了在make menuconfig时的GUI名字

(4)修改drivers/Makefile,增加:

  1. obj-y                           += myled/

(5)修改drivers/Kconfig,增加:

  1. source "drivers/myled/Kconfig"

(6)make menuconfig配置相应项进内核

(7)make uImage

(8)烧写新内核启动

看到"------------------hello world !--------------------"被打印,及相应的驱动被加载。

二、linux内核中Makefile、Kconfig、.config的关系

(1)三者的作用

简单来说就是去饭店点菜:Kconfig是菜单,Makefile是做法,.config就是你点的菜

Makefile:一个文本形式的文件,编译源文件的方法。

Kconfig:一个文本形式的文件,内核的配置菜单。

.config:编译所依据的配置。

(2)三者的语法

1、Makefile

目标定义:目标定义就是用来定义哪些内容要做为模块编译,哪些要编译链接进内核。

直接编译:

obj-y      += hello.o

表示要由hello.c或者hello.s文件编译得到hello.o并链接进内核

而更常见的做法是根据.config文件的CONFIG_ 变量来决定文件的编译方式 :

条件编译:

obj-$(CONFIG_HELLO) += hello.o

obj-m则表示该文件要作为模块编译。

除了y,m以外的obj-x形式的目标都不会被编译。

2、Kconfig

类型定义:

每个config菜单项都要有类型定义: bool布尔类型、 tristate三态(内建、模块、移除)、string字符串、 hex十六进制、integer整型。 
例如: 
config HELLO_MODULE 
bool "hello test module" 
bool 类型的只能选中或不选中,显示为[ ];

tristate类型的菜单项多了编译成内核模块的选项,显示为< > , 假如选择编译成内核模块,则会在.config中生成一个 CONFIG_HELLO_MODULE=m的配置,假如选择内建,就是直接编译成内核影响,就会在.config中生成一个 CONFIG_HELLO_MODULE=y的配置. hex十六进制类型显示为( )。

目录层次迭代 
在Kconfig中有类似语句:source"drivers/usb/Kconfig" 
用来包含(或嵌套)新的Kconfig文件,这样便可以使各个目录管理各自的配置内容,使不必把那些配置都写在同一个文件里,方便修改和管理。

配置选项之间的依赖关系:
 depend on:某选项依赖于另外一个选项生成
 select   :反向依赖关系,该选项选中时,同时选中select后面定义的那一项
 requie
 默认值: default(默认y/n/m等值)
 输入提示:prompt
 帮助信息:help

3、.config

内核编译参考文件。

修改方式:

(1)    make menuconfig

(2)    make xxx_defconfig

(3)    直接修改

!注意如果直接修改,不一定会生效,因为一些配置可能存在依赖关系,make的时候会根据依赖关系,进行规则的检查,不推荐直接在.config进行修改。

【总结】嵌入式linux内核中Makefile、Kconfig、.config的关系及增加开机Hello World【转】的更多相关文章

  1. Linux内核中Makefile、Kconfig和.config的关系(转)

    我们在编译Linux内核时,往往在Linux内核的顶层目录会执行一些命令,这里我以RK3288举例,比如:make firefly-rk3288-linux_defconfig.make menuco ...

  2. Linux内核中的Kconfig、xx.defconfig、xx.config、Makefile

    什么是Kconfig.xx.defconfig.xx.config.Makefile Kconfig: 一个文本形式的文件,其中主要作用是在内核配置时候,作为配置选项. xx.deconfig: Li ...

  3. 24小时学通Linux内核总结篇(kconfig和Makefile & 讲不出再见)

    非常开心能够和大家一起分享这些,让我受益匪浅,感激之情也溢于言表,,code monkey的话少,没办法煽情了,,,,,,,冬天的风,吹得伤怀,倒叙往事,褪成空白~学校的人越来越少了,就像那年我们小年 ...

  4. 嵌入式C语言自我修养 01:Linux 内核中的GNU C语言语法扩展

    1.1 Linux 内核驱动中的奇怪语法 大家在看一些 GNU 开源软件,或者阅读 Linux 内核.驱动源码时会发现,在 Linux 内核源码中,有大量的 C 程序看起来“怪怪的”.说它是C语言吧, ...

  5. 向linux内核中添加外部中断驱动模块

    本文主要介绍外部中断驱动模块的编写,包括:1.linux模块的框架及混杂设备的注册.卸载.操作函数集.2.中断的申请及释放.3.等待队列的使用.4.工作队列的使用.5.定时器的使用.6.向linux内 ...

  6. 35、在编译Linux内核中增加程序需要完成以下3项工作

    在编译Linux内核中增加程序需要完成以下3项工作: 将编写的源代码拷入Linux内核源代码的相应目录. 在目录的Kconfig文件中增加关于新源代码对应项目的编译配置选项 在目录的Makefile文 ...

  7. Linux内核中的GPIO系统之(3):pin controller driver代码分析

    一.前言 对于一个嵌入式软件工程师,我们的软件模块经常和硬件打交道,pin control subsystem也不例外,被它驱动的硬件叫做pin controller(一般ARM soc的datash ...

  8. Linux 内核的 Makefile

    Linux内核的配置系统的基本结构 Linux内核的配置系统由三个部分组成,分别是: 1.Makefile:分布在 Linux 内核源代码根目录及各层目录中,定义 Linux 内核的编译规则: 2.配 ...

  9. Linux内核中的GPIO系统之(3):pin controller driver代码分析--devm_kzalloc使用【转】

    转自:http://www.wowotech.net/linux_kenrel/pin-controller-driver.html 一.前言 对于一个嵌入式软件工程师,我们的软件模块经常和硬件打交道 ...

随机推荐

  1. SQlite数据库框架:LitePal

    常用的数据库框架Android的发展的速度是难以置信的,Android出来哪一年我还在小学上学很,还能很清楚的记得,那年一切,但是那个时候的我怎么可能也不会想到自己将来会要去做Android.Andr ...

  2. Django框架 之基础入门

    django是一款MVT的框架 一.基本过程 1.创建项目:django-admin startproject 项目名称 2.编写配置文件settings.py(数据库配置.时区.后台管理中英文等) ...

  3. 取得数据库中数据 查询条件where使用规则

    string where = string.Format("DnX < {0} and DnD > {0} and Types = '{1}' and Type1 = '{2}' ...

  4. 03Oracle Database 物理结构,逻辑结构

    Oracle Database 物理结构,逻辑结构 Oracle Database 物理结构 数据文件 Oracle数据库有一个或多个物理的数据文件.数据库的数据文件包含全部数据库数据.逻辑数据物理地 ...

  5. eBPF监控工具bcc系列五工具funccount

    eBPF监控工具bcc系列五工具funccount funccount函数可以通过匹配来跟踪函数,tracepoints 或USDT探针.例如所有以vfs_ 开头的内核函数. ./funccount ...

  6. Python之list、tuple、dict、set

    参考原文 廖雪峰Python PS:来看看Python中比较特殊的几种数据类型list.tuple.dict.set list list(列表)是Python内置的一种数据类型,它是一种有序.可变的集 ...

  7. java基础学习日志--Stirng内存案例

    案例一: public class test1 { public static void mb_swap(String Str1,String Str2) { String temp=Str1; St ...

  8. 编写函数,第一个参数指定今天是星期几(1 ~ 7),第二个参数指定天数n,返回n天后是星期几

    def week(today, n): s = n % 7 + today return "n天后是星期:{}".format(s) print(week(1, 3))

  9. 【15】AngularJS 输入验证

    AngularJS 输入验证 AngularJS 表单和控件可以验证输入的数据. 输入验证 AngularJS 表单和控件可以提供验证功能,并对用户输入的非法数据进行警告.   客户端的验证不能确保用 ...

  10. 【Codeforces 264B】Good Sequences

    [链接] 我是链接,点我呀:) [题意] 让你在一个递增数组中选择一个最长子序列使得gcd(a[i],a[i+1])>1 [题解] 设f[i]表示以一个"含有素因子i的数字" ...