0. 嵌入式系统

以应用为中心,软硬件可裁剪,对功耗、对体积、对成本等都有严格要求的专用计算机系统。

1.  linux体系结构

2. 为什么 划分为 用户空间 和 内核控件 ? 

分两级,内核和应用程序,使操作系统本身得到充分保护。

通过 系统调用 和 硬件中断 能从用户空间 --> 内核空间。

3. 内核架构

4.内核代码

5. 内核配置与编译  (以 ../arch/xx/configs 里的配置做参考 .config)

A:  清除:清除临时文件、中间文件和配置文件.

• make clean

remove most generated files but keep the config

• make mrproper

remove all generated files + config files 

• make distclean

mrproper + remove editor backup and patch files

B: 确定目标系统的软硬件配置情况,比如CPU的类型、网卡的型号,所需支持的网络协议等。

C: 命令配置内核

make config:基于文本模式的交互式配置。

make menuconfig:基于文本模式的菜单型配置。(推荐使用)

在括号中按“y”将这个项目编译进内核中,按“m”编译为模块,按“n”为不选择(按空格键也可在编译进内核、编译为模块和不编译三者间进行切换),按“h”将显示这个选项的帮助信息,按“Esc”键将返回到上层选单。

(*) A.c ----> A.o -----> image   (编译连接)

(Y)B.c ---->B.o ------>image

(M)C.c----->C.o       (编译不连接)

(N)D.c------>             (不编译)

( ) E.c ------>

make oldconfig:使用已有的配置文件(.config),但是会询问新增的配置选项。

make xconfig:图形化的配置(需安装图形化系统)。

D:编译内核

make zImage

make bzImage

区别:在X86平台,zImage只能用于小于512K的内核

如需获取详细编译信息,可使用:

make zImage V=1

make bzImage V=1

编译好的内核位于arch/<cpu>/boot/目录下 **

E: 编译内核模块

make modules

F:  安装内核模块

make modules_install

将编译好的内核模块从内核源代码目录copy至/lib/modules下

G: 制作init ramdisk

mkinitrd initrd-$version $version

例:

mkinitrd initrd-2.6.29  2.6.29

$version 可以通过查询/lib/modules下的目录得到

H: 内核安装(X86)

1、cp arch/x86/boot/bzImage    /boot/vmlinuz-$version

2、cp $initrd /boot/

3、修改/etc/grub.conf 或者 /etc/lilo.conf

** $version 为所编译的内核版本号**

6. 内核模块开发

内核模块具有如下特点:

• 模块本身并不被编译进内核文件(zImage或者bzImage)

• 可以根据需求,在内核运行期间动态的安装或卸载。

实例: hello

#include<linux/init.h>
#include<linux/module.h> MODULE_LICENSE("GPL");
MODULE_AUTHOR("lisi");
MODULE_DESCRIPTION("hello world module");
MODULE_ALIAS("a simple module"); static char *name = "wangwu";
static int age = 23;
module_param(age, int, S_IRUGO);
module_param(name, charp, S_IRUGO); static int hello_init(void)
{
printk("Hello world! \n");
printk("Name: %s, Age: %d \n", name, age);
return 0;
} static void hello_exit(void)
{
printk("Goodbye world! \n");
} module_init(hello_init);
module_exit(hello_exit);

模块编译 Makefile

ifneq ($(KERNELRELEASE),)
obj-m :=hello.o
else
KDIR := /lib/modules/3.5.0-17-generic/build
all:
make -C $(KDIR) M=$(PWD) modules
clean:
rm -f *.ok *.o *.mod.o *.mod.c *.symvers
endif

与应用程序的区别

对比应用程序,内核模块具有以下不同:应用程序是从头(main)到尾执行任务,执行结束后从内存中消失。内核模块则是先在内核中注册自己以便服务于将来的某个请求,然后它的初始化函数结束,此时模块仍然存在于内核中,直到卸载函数被调用,模块才从内核中消失。

模块安装与卸载

加载 insmod (insmod hello.ko)

卸载 rmmod (rmmod hello)

查看 lsmod 

加载 modprobe (modprobe hello)

modprobe 如同 insmod, 也是加载一个模块到内核。它的不同之处在于它会根据文件/lib/modules/<$version>/modules.dep来查看要加载的模块, 看它是否还依赖于其他模块,如果是,modprobe 会首先找到这些模块, 把它们先加载到内核。

模块参数

通过宏module_param指定模块参数,模块参数用于在加载模块时传递参数给模块。

module_param(name,type,perm)

name是模块参数的名称,type是这个参数的类型, perm是模块参数的访问权限。

type常见值:

bool:布尔型 int:整型 charp:字符串型

perm 常见值:

S_IRUGO:任何用户都对/sys/module中出现的该参数具有读权限

S_IWUSR:允许root用户修改/sys/module中出现的该参数

内核符号的导出使用:

EXPORT_SYMBOL(符号名)

EXPORT_SYMBOL_GPL(符号名)

其中EXPORT_SYMBOL_GPL只能用于包含GPL许可证的模块。

常见问题: 版本不匹配

解决方法:

1、使用 modprobe  --force-modversion 强行插入

2、确保编译内核模块时,所依赖的内核代码本等同于当前正在运行的内核。

**可通过uname –r 察看当前运行的内核版本**

Printk允许根据严重程度,通过附加不同的“优先级”来对消息分类。

优先级递减的顺序分别是:

KERN_EMERG                   “<0>” 用于紧急消息,常常是那些崩溃前的消息。

KERN_ALERT                 “<1>”  需要立刻行动的消息。

KERN_CRIT                “<2>” 严重情况。

KERN_ERR                   “<3>”  错误情况。

KERN_WARNING              “<4>” 有问题的警告

 KERN_NOTICE             “<5>” 正常情况,但是仍然值得注意

 KERN_INFO                 “<6>” 信息型消息

 KERN_DEBUG                “<7>”用作调试消息

没有指定优先级的printk默认使用DEFAULT_MESSAGE_LOGLEVEL优先级,它是一个在kernel/printk.c中定义的整数。

#define DEFAULT_MESSAGE_LOGLEVEL 4 

/* KERN_WARNING */

Linux嵌入式 -- 内核简介(x86)的更多相关文章

  1. Linux嵌入式 -- 内核 (arm) & 文件系统

    1. make distclean 2. 配置内核  ----> 生成 .config文件 make menuconfig ARCH=arm Makefile文件分析: 3.  编译内核 mak ...

  2. Linux嵌入式 -- 内核 - 内核定时器

    1.  度量时间差 时钟中断由系统的定时硬件以周期性的时间间隔产生,这个间隔(即频率)由内核根据HZ来确定,HZ是一个与体系结构无关的常数,可配置(50-1200),在X86平台,默认值为1000(每 ...

  3. Linux嵌入式 -- 内核 - proc文件系统

    1. 什么是proc文件系统? 实例:通过 /proc/meminfo,查询当前内存使用情况. 结论:proc文件系统是一种在用户态检查内核状态的机制. 2.Proc文件分类 特点  每个文件都规定了 ...

  4. Linux嵌入式 -- 内核 - 系统调用

    1. 系统调用 定义 Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用.用户可以通过系统调用命令在自己的应用程序中调用它们. 系统调用和普通的函数调用非常相似,区别仅仅在于,系统调 ...

  5. Linux嵌入式 -- 内核 - 进程控制 和 调度

    1. 进程四要素 1. 有一段程序供其执行.这段程序不一定是某个进程所专有,可以与其他进程共用. 2. 有进程专用的内核空间堆栈. 3. 在内核中有一个task_struct数据结构,即通常所说的&q ...

  6. Linux嵌入式 -- 内核 - 内核链表

    1. linux内核链表 链表数据结构的定义: struct list_head  {  struct list_head *next, *prev;  };  list_head结构包含两个指向li ...

  7. Linux嵌入式 -- 内核 - 内存管理

    1.  逻辑地址 线性地址 物理地址 段式管理: 16位CPU,20根地址总线,可寻址1M内存,但是只有16位的寄存器,64K. 逻辑地址  =  段基地址 + 段内偏移地址 物理地址 PA  = 段 ...

  8. Linux 内核简介

    Linux内核简介 一.系统架构 (1). Linux系统架构 ##用户空间: 文件系统 C库 ##内核空间: 接口 内核 (2). Linux内核架构 二.Linux内核源代码 下载地址 www.k ...

  9. 【课程分享】深入浅出嵌入式linux系统移植开发 (环境搭建、uboot的移植、嵌入式内核的配置与编译)

    深入浅出嵌入式linux系统移植开发 (环境搭建.uboot的移植.嵌入式内核的配置与编译) 亲爱的网友,我这里有套课程想和大家分享,假设对这个课程有兴趣的,能够加我的QQ2059055336和我联系 ...

随机推荐

  1. Python基础——原生数据类型(字典,列表,元组,字符串)

    字典Dictionary 字典定义了键值对的1对1管理. 1.定义字典 请看下面的栗子,我们先创建了一个具有两个元素的字典,每对都是key:value的形式. 我们能通过key得到value,但是不能 ...

  2. jQuery.ajax jQuery.post

    $.ajax()函数依赖服务器提供的信息来处理返回的数据.如果服务器报告说返回的数据是XML,那么返回的结果就可以用普通的XML方法或者jQuery的选择器来遍历.如果见得到其他类型,比如HTML,则 ...

  3. Pycharm如何取消自动换行

    1.只对当前文件有效的操作是: 菜单栏->View -> Active Editor -> Use Soft Wraps (不选中) 2.要是想对所有文件都起到效果,就要在setti ...

  4. As of Flume 1.4.0, Avro is the default RPC protocol.

    Flume 1.8.0 Developer Guide — Apache Flume http://flume.apache.org/FlumeDeveloperGuide.html The remo ...

  5. ArcGIS runtime sdk for wpf 授权

    这两天由于runtime sdk for wpf的授权和runtime sdk 其他产品的授权的不一样导致自己混乱不堪. 总结下吧. sdk 简介 当前ArcGIS runtime sdk 包括一系列 ...

  6. lombok插件使用

    1.1 lombok介绍 lombok 是一个可以帮助我们简化java代码编写的工具类,尤其是简化javabean的编写,可以通过采用注解的方式,消除代码中的构造方法,getter/setter等代码 ...

  7. python imageio 图片生成gif

    #!/bin/python3 import matplotlib.pyplot as plt import imageio,os TIME_GAP=0.075 #两帧之间的时间间隔,秒为单位 FILE ...

  8. 配置 Docker 镜像下载的本地 mirror 服务

    Docker registry 工具如今已经非常好的支持了 mirror 功能,使用它能够配置一个本地的 mirror 服务.将 pull 过的镜像 cache 在本地.这样其他主机再次 pull 的 ...

  9. ubuntu16.04 tomcat7安装和编码修改(转发:https://blog.csdn.net/zl544434558/article/details/76735564)

    有直接通过命令安装的,但是我还是喜欢把文件下载下来,然后自己配置. 1,下载tomcat7二进制文件 https://tomcat.apache.org/download-70.cgi 2,解压tom ...

  10. NHibernate应用开发

    第一章:NHibernate入门       第一讲:NHibernate架构剖析       第二讲:搭建第一个NHibernate应用程序       第三讲:nhibernate.cfg.xml ...