MINI2440 内核基础开发

Liunx内核图

在这里插入图片描述

Liunx内核简介

Liunx是如何构成的?
在这里插入图片描述
由上图得知,Liunx由用户空间和内核空间两部分组成。
为什么Liuxn系统要将系统划分为用户空间与内核空间?
ARM的7种工作模式

  • 用户模式usr
  • 快速中断fiq
  • 系统模式sys
  • 外部中断irq
  • 管理模式svc
  • 数据访问中止
  • 未定义指令异常
    内核空间组成部分:
    在这里插入图片描述

Liunx内核源代码

[内核源代码下载地址]

内核文件夹:

在这里插入图片描述
在这里插入图片描述

fs目录:

存放各种文件系统的实现代码,每个子目录对应一个文件系统的实现,公用的源程序用于实现虚拟文件系统vfs
||–devpts /* /dev/pts虚拟文件系统 /
||–ext2 /
第二扩展系统 /
||–fat /
MS的fat32文件系统 /
||–isofs /
ISO9660光盘cd-rom上的文件系统 */

include目录:

内核所需要的头文件。与平台无关的头文件在include/liunx子目录下,与平台相关的头文件则放在相应的子目录中!
在这里插入图片描述

lib目录:

库文件代码

mm目录:

mm目录中的文件用于实现内存管理中与体系结构无关的部分(与体系结构相关的部分在哪里实现)

net目录

linux所支持的每一种网络

samples目录:

一些内核编程的范例

scripts目录:

配置内核的脚本

security目录:

SElinux的模块

sound目录:

音频设备的驱动

usr目录:

cpio命令实现

virt目录:

内核虚拟机

Liunx内核配置和编译

Linux内核具有可定制的优点,具体步骤如下:

1.清除零时文件、中间文件和配置文件
  • 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
    删除编辑器留下的补丁文件

新建一个文件放置linux-5.1.1.tar.xz

在这里插入图片描述

打开终端进行解压

解压命令 tar -Jxvf linux-5.1.1.tar.xz
在这里插入图片描述

进入 linux-5.1.1文件夹,并进行清理 make distclean

不知道对不对,竟然没有一条清除语句
在这里插入图片描述

2.确定目标系统的软硬件配置情况,比如CPU的类型,网卡的型号,所需要支持的网络协议等(收集需求)
3.使用以下命令队内核进行配置

[Make menuconfig的遇到的错误总结 ]
[Ubuntu18.04解决make xconfig错误]
[Ubuntu下安装minitools+minitools烧写linux到开发板]
[Ubuntu安装Qt4教程(命令行方式apt-getinstall)]
[安装MiniTools后,不能识别USB的问题]
[在ubuntu16.04上安装MiniTools]
make config:基于文本模式的交互式配置

在这里插入图片描述
make menuconfig:基于文本模式的菜单型配置(推荐使用)
他每一个选项都是有自己的默认值,即使一个不改也可以运行!
可能出现以下错误:

//Your display is too small to run Menuconfig!
//It must be at least 19 lines by 80 columns.
//make[1]: *** [menuconfig] 错误 1
//make: *** [menuconfig] 错误 21234567

原因:终端窗口太小,最大化即可解决。
在这里插入图片描述
make oldconfig:使用已有的配置文件(.config),但是会询问新增的配置选项
配置项比第一个少
在这里插入图片描述
make xconfig:图形化配置(需要安装图形化系统)

配置完成之后文件夹中多出来了./config文件
在这里插入图片描述
配置项的选择
(*) (M) ( )

4.编译内核
利用已有内核配置文件,进行复制

进入arch/arm配置arm内核
在这里插入图片描述
打开ARM里的configs文件
在这里插入图片描述
将2410的内核参考文件复制道.conifg文件下
在这里插入图片描述
将自己的虚拟机内核复制到……(我也不知道为什么我的有两个文件)
在这里插入图片描述
现在打开的就是自己内核的配置
在这里插入图片描述

make zlmage
make bzImage

区别在x86平台,只能使用小于512K的内核
*make zlmage V=1
*make bzlmage V=1

编译好的内核位于arch//boot/目录下
编译时出现错误的解决方法
[scripts/sign-file.c:25:30: fatal error: openssl/opensslv.h: No such file or directory #include]
等了半个小时终于编译好了!
在这里插入图片描述

make bzImage V=1
5.编译内核模块

make modules

6.安装内核模块

make modules_install
将编译好的内核模块从内核源代码目录copy到/Lib/modules下
编译出现问题:Makefile:xxx: recipe for target ‘xxx’ failed
https://blog.csdn.net/wuyulanguang/article/details/86220770
解决方法里面出现问题:
https://www.cnblogs.com/luxiaorui/p/3931024.html

7.制作init ramdisk

mkinit

Liunx内核模块开发

模块的功能

什么是内核模块?
Linux内核的整体结构非常庞大,其包含的组件也非常多,如何使用需要的组件:
方式一:把所有的组件都编译进内核文件,即:zlmage或bzlmage,但这样会导致
两个问题: 一是生成的内核文件较大;二是如果添加或删除某个组件,需要重新编译整个内核

内核模块具有如下特点:
模块本身并不被编译进内核文件(zlmage或者bzlmage);
可以根据需求,在内核运行期间动态的安装或卸载;

#include <linux/init.h>
#include <linux/module.h>

static int hello_init(void)
{
printk(KERN_WARNING"hello,world!\n");
return 0;
}

static void hello_exit(void)
{
printk(KERN_INFO"Goodbye,world\n");
}
module_init(hello_init);
module_exit(hello_exit);
程序结构:
模块加载函数(必须)

安装模块时被系统自动调用的函数,通过module_init宏来指定,在helloWorld模块中,模块加载函数为:

模块卸载函数(必须)

卸载模块时被系统自动调用的函数,通过module_exit()宏指定,在HelloWorld模块中模块卸载为:

模块的编译:

在Linux 2.6下编译通常使用makefile
(我下载的资料里面没有这个)

ifneq ($(KERNELRELEASE),)

obj-m :=hello.o                               //要变

else

KDIR := /lib/modules/2.6.18-53.e15/build      //要变,依赖的内核的源代码
all:
     make -C $(KDIR) M=$(PWD) modules
clean:
    rm -f *.ko *.o *.mod.o *.mod.c *.symvers

endif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值