1. Linux体系结构
从整体上来分,linux可以分为User Space和Kernel Space构成,即用户空间和内核空间
用户空间:应用程序 C库 系统配置文件等
内核空间:在内存中,用户一般不能直接接触到(系统调用接口,体系结构相关的一些代码等等)
这样划分的的好处:
其实内核空间与用户空间是程序执行的两种不同的状态,通过系统调用和硬件中断能够完成从用户空间到内核空间
转移。
下面来了解一下Linux内核架构:
从上图中可以看到内核架构是有七个子系统组成的。
1. 系统调用接口模块
2. 进程管理模块
3. 内存管理子系统
4. 体系结构相关的子系统(和CPU密切相关)
5. 虚拟文件系统
6. 网络协议栈子系统
7. 设备驱动程序模块
这七个部分就组成linux内核了
下载linux内核源代码:www.kernel.org
下面简要介绍linux内核源码下几个重要的目录文件:
arch目录:arch是architecture的缩写,内核所支持的每种cpu体系,在该目录下都有对应的子目录。每个CPU的子目录,有进一步分解为boot,mm,kernel等子目录,分别包含控制系统引导,内存管理,系统调用等
documentation目录:内核的文档(比如一些驱动的使用方法,一些内核的更新记录等等都是放在这个目录里面)
drivers目录:设备驱动程序
include目录:内核所需要的头文件,与平台无关的头文件在include/linux子目录下,与平台相关的头文件则放在相应的子目录中
fs目录:存放各种文件系统的实现代码,每个子目录对应一种文件系统的实现,公用的源程序用于实现虚拟文件系统VFS
上面初步了解了linux内核的一些相关的概念之后!下面来体会一下如何把linux内核源码变成可以在开发板上运行的程序!这里就涉及到了内核的配置和编译部分了!
内核配置方法:
下载解压内核源码,在内核源码目录下,有两个命令可以配置内核
1. make config: 基于文本模式的交互式配置
2. make menuconfig: 基于文本模式的菜单型配置(这个配置方法更直观、简单、高效)这个进入菜单后如何配置自己查下资料每个选项的选中的符号所代表的意义,这个操作两次就会了。
这里简要介绍下三个选项所代表的意义:
选择该功能,该功能会被编译进内核,运行在内存中
选中该功能,内核模块,不编译进内核,会将相应的模块编译成.O文件,然后放到相应的目录下存放在硬盘里面,当要用到该功能时,内核会把该功能加载到内存中,不用的时候从内存中删除,这样可以节省内存,提高内存利用率
< >本次编译不选中该功能
内核配置的结果:内核配置通常是在一个已有的配置文件基础上,通过修改得到新的配置文件,linux内核提供了一系列可供参考的内核配置文件,位于Arch/$cpu/configs
编译内核:
编译内核模块:
这个是针对X86上安装linux内核的
内核清理:
make clean 是清除产生的.o文件 但是不会清除掉.config文件
make disclean 同时清除.o文件和.config文件
以上是更新PC机上linux内核的一些相关步骤,下面来详细重点介绍嵌入式linux制作!
制作嵌入式平台使用的linux内核,方法和制作PC平台的Linux内核基本一致
1. 清除原有配置和中间文件
X86: make distclean
arm: make distclean
内核制作步骤
2. 配置内核
X86: make menuconfig
arm: make menuconfig ARCH=arm
3. 编译内核
X86: make bzImage
arm: make uImage ARCH=arm CROSS_COMPILE=arm-linux-
tar xvzf filename.tar.gz解压文件到当前目录
然后make distclean命令做清除工作
然后执行make menuconfig ARCH=arm
执行完后可以看到进图图像配置界面:
下面来就可以愉快的配置linux内核了(这里使用一个开发厂商提供的.config配置文件)
这里把配置文件config-file改成.config 并且复制到上面解压的目录下
然后在make menuconfig ARCH=arm(当然这里不用改什么,不过这里用国嵌提供的后边编译会出错,这里需要修改一个地方)
这里需要把配置文件的一个地方的路径改为上面fs目录所在的路径,不过视频中老师用的和自己用的肯定不一样
老师的用的是这个路径:CONFIG_INITRAMFS_SOURCE="/home/S5-driver/lesson8/rootfs"
下面红色部分是我自己的路径,但是我改了后发现还是编译不过!后来对比着其他的资料看把这里面的路径删除去掉就OK了,记得第一次学到这里的时候是看了后边的视频然后才搞清楚这里为什么错了!这个编译之前已经make distclean 了,但拷贝进去的.config文件的路径都是上面老师视频里面的路径!
把上图红色部分引号里面的路径全部去掉,然后编译,就OK了
这里贴一张编译成功后的截图:
在 /arch/arm/boot/目录下 uImage编译成功!
红色部分改成我自己fs目录所在的路径,这个编译的时间稍微长一点,大概十分钟左右吧!
编译通过后然后下载到开发板运行看效果!