Liunx是如何构成的?
由上图得知,Liunx由用户空间和内核空间两部分组成。
为什么Liuxn系统要将系统划分为用户空间与内核空间?
ARM的7种工作模式
[内核源代码下载地址]
存放各种文件系统的实现代码,每个子目录对应一个文件系统的实现,公用的源程序用于实现虚拟文件系统vfs
||–devpts /* /dev/pts虚拟文件系统 /
||–ext2 / 第二扩展系统 /
||–fat / MS的fat32文件系统 /
||–isofs / ISO9660光盘cd-rom上的文件系统 */
内核所需要的头文件。与平台无关的头文件在include/liunx子目录下,与平台相关的头文件则放在相应的子目录中!
库文件代码
mm目录中的文件用于实现内存管理中与体系结构无关的部分(与体系结构相关的部分在哪里实现)
linux所支持的每一种网络
一些内核编程的范例
配置内核的脚本
SElinux的模块
音频设备的驱动
cpio命令实现
内核虚拟机
Linux内核具有可定制的优点,具体步骤如下:
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
删除编辑器留下的补丁文件
解压命令 tar -Jxvf linux-5.1.1.tar.xz
[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) ( )
进入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
make modules
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
mkinit
什么是内核模块?
Linux内核的整体结构非常庞大,其包含的组件也非常多,如何使用需要的组件:
方式一:把所有的组件都编译进内核文件,即:zlmage或bzlmage,但这样会导致
两个问题: 一是生成的内核文件较大;二是如果添加或删除某个组件,需要重新编译整个内核;
内核模块具有如下特点:
模块本身并不被编译进内核文件(zlmage或者bzlmage);
可以根据需求,在内核运行期间动态的安装或卸载;
#include
#include
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