linux 编译指cpu内核,linux内核编译与配置

linux是如何组成的?

答:linux是由用户空间和内核空间组成的

为什么要划分用户空间和内核空间?

答:有关CPU体系结构,各处理器可以有多种模式,而LInux这样的划分是考虑到系统的

安全性,比如X86可以有4种模式RING0~RING3  RING0特权模式给LINUX内核空间RING3给用户空间

linux内核是如何组成的?

答:linux内核由SCI(System Call Interface)系统调用接口、PM(Process Management)进程管理、MM(Memory Management)内存管理、Arch、

VFS(Virtual File Systerm)虚拟文件系统、NS(Network Stack)网络协议栈、DD(Device Drivers) 设备驱动

linux 内核源代码

linux内核源代码是如何组成或目录结构?

答:   arc目录    存放一些与CPU体系结构相关的代码  其中第个CPU子目录以分解boot,mm,kerner等子目录

block目录    部分块设备驱动代码

crypto目录    加密、压缩、CRC校验算法

documentation    内核文档

drivers        设备驱动

fs        存放各种文件系统的实现代码

include        内核所需要的头文件。与平台无关的头文件入在include/linux子目录下,与平台相关的头文件则放在相应的子目录中

init        内核初始化代码

ipc        进程间通信的实现代码

kernel        Linux大多数关键的核心功能者是在这个目录实现(程序调度,进程控制,模块化)

lib        库文件代码

mm        与平台无关的内存管理,与平台相关的放在相应的arch/CPU目录    net        各种网络协议的实现代码,注意而不是驱动

samples     内核编程的范例

scripts        配置内核的脚本

security    SElinux的模块

sound        音频设备的驱动程序

usr        cpip命令实现程序

virt        内核虚拟机

内核配置与编译

一、清除

make clean    删除编译文件但保留配置文件

make mrproper    删除所有编译文件和配置文件

make distclean    删除编译文件、配置文件包括backup备份和patch补丁

二、内核配置方式

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

make menuconfig    基于文本模式的菜单配置

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

make xconfig    图形化配置

三、make menuconfig一些说明或技巧

在括号中按“y”表示编译进内核,按“m”编译为模块,按“n”不选择,也可以按空格键进行选择

注意:内核编译时,编译进内核的“y”,和编译成模块的“m”是分步编译的

四、快速配置相应体系结构的内核配置

我们可以    到arch/$cpu/configs目录下copy相应的处理器型号的配置文件到内核源目录下替换.config文件

五、编译内核

1.

————————————————————————————

make zImage   注:zImage只能编译小于512k的内核

make bzImage

同样我们也可以编译时获取编译信息,可使用

make zImage V=1

make bzImage V=1

编译好的内核位于    arch/$cpu/boot/目录下

————————————————————————————

以上是编译内核make menuconfig时先“m”选项的编译  接下来到编译“y”模块,也就是编译模块

2.

make modules    编译内核模块

make modules_install    安装内核模块 ------>这个选项作用是将编译好的内核模块从内核源代码目录copy至/lib/modules下

六、制作init ramdisk

mkinitrd initrd-$version $version

/****  mkinitrd initrd-$(可改)version $version(不可改,因为这version是寻找/lib/modules/下相应的目录来制作)  ****/

七、内核安装

复制内核到相关目录下再作grub引导也就可以了

1.cp arch/$cpu/boot/bzImage /boot/vmlinux-$version

2.cp $initrd /boot/

3.修改引导器/etc/grub.conf(lio.conf)正确引导即可

#incldue

#include

static int hello_init(void)

{

printk(KERN_WARNING"Hello,world!\n");

return 0;

}

static void hello_exit(void)

{

printk(KERN_INFO"Good,world!\n");

}

module_init(hello_init);

module_exit(hello_exit);

___________hello,world!范例___________________

一、必需模块函数

1.加载函数    module_init(hello_init);    通过module_init宏来指定

2.卸载函数    module_exit(hello_exit);    通过module_exit宏来指定

编译模块多使用makefile

二、可选模块函数

1.MODULE_LICENSE("*******");     许可证申明

2.MODULE_AUTHOR("********");    作者申明

3.MODELE_DESCRIPTION("***");    模块描述

4.MODULE_VERSION("V1.0");    模块版本

5.MODULE_ALIAS("*********");    模块别名

三、模块参数

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

module_param(neme,type,perm);

name是模块参数名称

type是参数类型  type常见值:boot、int、charp(字符串型)

perm是参数访问权限 perm常见值:S_IRUGO、S_IWUSR

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

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

/*****——————范例————————*******/

int a = 3;

char *st;

module_param(a,int,S_IRUGO);

module_param(st,charp,S_IRUGO);

/*********————结束——————**********/

/**********----makefile范例----*************/

ifneq    ($(KERNELRELFASE),)

obj-m    :=    hello.o    //这里m值多用 obj-(CONFIG_**)代替

else

KDIR    :=    /lib/modules/$version/build

all:

make -C $(KDIR) M=$(PWD) modules

clean:

rm -f *.ko *.o *.mod.o *.mod.c *.symyers

endif

/*****这里可以扩展多文件makefile 多个obj-m***********end***************/

/******模块参数*****/

#include

#include

MODULE_LICENSE("GPL");

static char *name = "Junroc Jinx";

static int age = 30;

module_param(arg,int,S_IRUGO);

module_param(name,charp,S_IRUGO);

static int hello init(void)

{

printk(KERN_EMERG"Name:%s\n",name);

printk(KERN_EMERG"Age:%d\n",age);

return 0;

}

static void hello_exit(void)

{

printk(KERN_INFA"Module Exit\n");

}

moduleJ_init(hello_init);

module_exit(hello_exit);

/****************/

----------------------------------------------------------------------------

/proc/kallsyms 文档记录了内核中所有导出的符号的名字与地址

什么是导出?

答:导出就是把模块依赖的符号导进内核,以便供给其它模块调用

为什么导出?

答:不导出依赖关系就解决不了,导入就失败

符号导出使用说明:

EXPORT_SYMBOL(符号名)

EXPORT_SYMBOL_GPL(符号名)

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

模块版本不匹配问题的解决:

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

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

----------------------------------------------------------------------

printk内核打印:

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

在定义了8种记录级别。按照优先级递减分别是:

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中定义的整数

控制优先级的配置:

/proc/sys/kernel/printk(可以查看或修改)

/*******符号symbol各模块依赖范例*****/

--------/********hello.c*********/----

#include

#include

MODULE_LICENSE("GPL");

MODULE_AUTHOR("Junroc Jinx");

MODULE_DESCRIPTION("hello,world module! ");

MODULE_ALIAS("A simple modle test");

extern int add_integar(int a,int b);

extern int sub_integar(int a,int b);

static int __init hello_init()

{

int res = add_integar(1,2);

return 0;

}

static void __exit hello_exit()

{

int res = sub_integar(2,1);

}

module_init(hello_init);

module_exit(hello_exit);

/******hello.c****end**********/

/********start*****calculate.c******/

#include

#include

MODULE_LICENSE("GPL");

int add_integar(int a,int b)

{

return a+b;

}

int sub_integar(int a,int b)

{

return a-b;

}

static int __init sym_init()

{

return 0;

}

static void __exit sym_exit()

{

}

module_init(sym_init);

module_exit(sym_exit);

//EXPORT_SYMBOL(add_integar);

//EXPORT_SYMBOL(sub_integar);

/***********end*****calculte.c****/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/291099.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux下的压缩与解压缩

tar命令zip命令unzip命令gzip命令bzip2命令tar命令&#xff1a;压缩和解压缩tar格式的文件格式&#xff1a;tar [主选项辅选项] 文件或目录【主选项告诉tar要做什么事&#xff0c;是必须要有的&#xff0c;辅选项是辅助使用的&#xff0c;和通常的选项一样&#xff0c;可选】主…

Android之JNI动态注册native方法和JNI数据简单使用

1、爆结果照片 2、介绍JNI注册方式 JVM 查找 native 方法有两种方式: 1)、按照 JNI 规范的命名规则(静态注册) 2) 、调用 JNI 提供的 RegisterNatives 函数,将本地函数注册到 JVM 中(动态注册) 静态注册的实现可以参考我的这篇博客 http://blog.csdn.net/u01…

保存现场数据和状态:onSaveInstanceState\onRestoreInstanceState\onCreate()

当某个activity变得“容易”被系统销毁时&#xff0c;该activity的onSaveInstanceState就会被执行&#xff0c;除非该activity是被用户主动销毁的&#xff0c;例如当用户按BACK键的时候。 注意上面的双引号&#xff0c;何为“容易”&#xff1f;言下之意就是该activity还没有被…

setTimeout(function(){}, 0);

1 for (var i 0; i < 3; i) { 2 setTimeout(function() { 3 console.log(i); 4 }, 0); 5 console.log(i); 6 } 结果是&#xff1a; 0 1 2 3 3 3 分析&#xff1a; 1、在实践中&#xff0c;setTimeout 会在其完成当前任何延迟事件的事件处理器的执行&am…

Linux怎么查询全部容器时间,linuxea:如何单单修改docker容器的系统时间

一般情况下&#xff0c;我们仅仅需要修改容器的时间与我们宿主机的实际实际一致即可&#xff0c;我们知道&#xff0c;默认情况下docker容器是不允许访问系统时钟&#xff0c;但是有一款开源的软件使这样的需求变成了可能。此lib拦截用于检索当前时间和日期的所有系统调用&…

关闭系统索引(转)

转自“http://jingyan.baidu.com/article/d621e8daeaaa392865913f0a.html” 关闭系统索引 Windows索引服务是为文件、电子邮件和其他内容提供内容索引、属性缓存和搜索结果。 Windows系统在安装完成后&#xff0c;会逐步创建特定文件、文件夹和其它目标的索引&#xff0c;例如开…

Android之ndk中JNIENV env->NewStringUTF (*env)->NewStringUTF

JNIEnv是指向可用JNI函数表的接口指针&#xff0c;原生代码通过JNIEnv接口指针提供的各种函数来使用虚拟机的功能。JNIEnv是一个指向线程-局部数据的指针&#xff0c;而线程-局部数据中包含指向线程表的指针。实现原生方法的函数将JNIEnv接口指针作为它们的第一个参数。 原生代…

最佳新秀Java(22)——再次了解泛型

仿制药Java SE 1.5新功能。通用自然是参数化类型。即操作数据类型被指定为一个参数。这样的参数类型可以在课堂上使用、创建的接口和方法&#xff0c;他们被称为通用类、、泛型方法。Java语言引入泛型的优点是安全简单。规则和限制1、泛型的类型參数仅仅能是类类型&#xff08;…

如何编译 dotnet/aspnetcore 源代码

前言最近&#xff0c;准备为 dotnet/aspnetcore 修改 issue&#xff0c;但是在 clone 代码后&#xff0c;发现要编译成功&#xff0c;远没有想象中那么容易。因此&#xff0c;将整个过程进行记录&#xff0c;以供大家参考。以下操作都是在 Windows 10 下完成。0.环境准备详见官…

查看Linux进程CPU过高具体的线程堆栈(不中断程序)

转自&#xff1a;http://blog.csdn.net/mergerly/article/details/47731305 1、TOP命令&#xff0c;找到占用CPU最高的进程 [plain] view plaincopy $ top top - 20:11:45 up 850 days, 1:18, 3 users, load average: 1.04, 1.01, 0.99 Tasks: 61 total, 1 running, …

linux 编译工具链,Linux工具链for TKStudio下载_Linux工具链for TKStudio官方下载-太平洋下载中心...

Linux工具链for TKStudio是一款支持TKStudio IDE集成开发环境的辅助LINUX交叉编译工具链软件&#xff0c;交叉编译就是跨架构编译&#xff0c;编译出来的程序不能在本机执行(当然有例外情况)。所以这个时候就需要交叉编译工具链。译工具链一般最简化的为 binutils gcc glibc …

pom.xml配置详解

http://blog.csdn.net/uohzoaix/article/details/7035307转载于:https://www.cnblogs.com/friends-wf/p/3829580.html

Android之在Activity中动态得到Adapter类中数据

1、问题 Activity中动态得到Adapter数据2、解决办法 在Adapter中写入接口Class Adapter {Interface A {void onClick(int a, int b);}A a;public void setListen (A a) {this.a a;}public void A (int a, int b) {if (a ! null ) {a.onClick(a, b);}}} class MainActivity ex…

Convolutional Neural Networks for Visual Recognition 1

Introduction 这是斯坦福计算机视觉大牛李菲菲最新开设的一门关于deep learning在计算机视觉领域的相关应用的课程。这个课程重点介绍了deep learning里的一种比较流行的模型&#xff1a;Convolutional Neural Networks&#xff0c;简称CNN&#xff0c;主要利用CNN来做visual r…

记一次 .NET 某供应链WEB网站 CPU 爆高事故分析

一&#xff1a;背景 1. 讲故事年前有位朋友加微信求助&#xff0c;说他的程序出现了偶发性CPU爆高&#xff0c;寻求如何解决&#xff0c;截图如下&#xff1a;我建议朋友用 procdump 在 cpu 高的时候连抓两个dump&#xff0c;这样分析起来比较稳健&#xff0c;朋友也如期的成功…

html5做的太阳系

效果图&#xff1a; 源代码&#xff1a; <!DOCTYPE html><html><head><meta charset"UTF-8"> <title></title></head><body><canvas id"canvas" width"1000" height"1000" style&…

html中#include file的使用方法

有两个文件a.htm和b.htm&#xff0c;在同一文件夹下a.htm内容例如以下 <!-- #include file"b.htm" --> b.htm内容例如以下 今天&#xff1a;雨 31 ℃&#xff5e;26 ℃ <br />明天&#xff1a;雷阵雨 33 ℃&#xff5e;27 ℃ 直接在浏览器中打开a&#…

Android之第一次不显示EditText光标

1、问题 光标会默认显示在第一个EditText框中&#xff0c;如果不想显示光标&#xff0c;且也不想把该光标移动到下一个EditText框。2、解决办法 在该 EditText之前增加一个不可见的LinearLayout<LinearLayout android:focusable"true"android:focusableInTouchMod…

读取bmp图片数据

1 public void getBMPImage(String source) throws Exception {2 3 clearNData(); //清除数据保存区4 FileInputStream fs null;5 6 try {7 fs new FileInputStream(source);8 int bfLen 14;9 …

Windows 11 任务管理器重磅升级!界面迎来全新设计,十年来首次大改!

面向 Dev 频道的 Windows 预览体验成员&#xff0c;微软近日发布了 Windows 11 预览版 Build 22557。在此版本中&#xff0c;任务管理器迎来了全新的设计&#xff0c;这是其自 Windows 8 以来的首次变更&#xff0c; 也是任务管理器十年来最大的一次升级。史诗级更新&#xff0…