携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第25天,点击查看活动详情
若看到相同文章,为本人其他平台
目录
===================
哲学
佛教认为,没有任何人和神的精心策划,因缘和合的时候,一切就会出现,不需要任何神和鬼的干预。一切都是因缘的结果,一切都是自己掌控,来世的去向与境遇,都是自己创造的,不受任何鬼神的摆布,自己的未来自己决定,自己的命运自己创造。佛陀反反复复地讲,“我为汝说解脱法,解脱依己当精进。”佛陀从来没有自命为救世主,一切都靠自己。运气好不好、身体好不好,都是靠自己。
===================
扫盲
1.实模式
CPU复位(reset)或加电(power on)的时候以实模式启动,处理器以实模式工作。在实模式下,内存寻址方式和8086相同,由16位段寄存器的内容乘以16(10H)当做段基地址,加上16位偏移地址形成20位的物理地址,最大寻址空间1MB,最大分段64KB。可以使用32位指令。32位的x86 CPU用做高速的8086。在实模式下,所有的段都是可以读、写和可执行的。
3.内核地图:Kconfig和Makefile查找对应模块代码
4./dev,sysfs和/proc虚拟文件系统介绍
1.sysfs:
sysfs是一个特殊的文件系统, 类似/proc, sysfs不仅像/proc一个允许用户空间访问内核的数据, 而且更结构化的方式向用户提供内核数据信息. sysfs是一种内存文件系统,它和kobject(内核对象)关系非常亲密.系统中的每一个kobject对应着sysfs中的一个目录,而每一个sysfs中的目录代表一个kobject对象,每个sysfs文件代表对应的kobject的属性.
sysfs文件系统非常清晰的展示了设备驱动程序模型中各组件的层次关系. 其顶级目录包括block,device,bus,drivers,class,power,firmware等.
2. /proc:
Linux内核中的/proc文件系统是一种特殊的文件系统, 通过它可以在运行时访问内核的内部数据结构,改变内核设置,内核可以通过它向进程发送信息.应用程序可以通过/proc文件系统获取有关进程的有用信息,Linux中的ps,top命令就是通过读取/proc下的文件来获取它们需要的信息. 与其他文件系统不同,/proc主要存放由内核控制的状态信息,它存储于内存中而不是硬盘或其他存储设备上. /proc文件系统的根目录就是/proc. 对于系统中的任何一个进程来说,在proc的子目录都有一个同名的进程ID. 利用/proc文件系统可以获取进程信息,电源管理(APM)信息,CPU信息(cpuinfo),负载信息(loadavg),系统内存信息(meminfo)等等.
3. /dev
设备文件目录
5.centos切换开机图形界面和控制台界面
CentOS7开机不进入图形界面设置 和cent6系列不同的是,不再是直接改文件中的5就可以了。
systemctl get-default //获取当前的默认target
systemctl set-default multi-user.target 设置当前的target,可选值有graphical.target,multi-user.target,multi_user.target就是开机不进入图形界面的多用户模式。
6.多核和多处理器的区别:
多核:每个cpu共用一套cache和mmu
多处理器:每个cpu有自己的一套cache和mmu
===================
系统调用
1.Linux的系统调用
对于现代操作系统,系统调用是一种内核与用户空间通讯的普遍手段,Linux系统也不例外。
但是Linux系统的系统调用相比很多Unix和windows等系统具有一些独特之处,无处不体现出Linux的设计精髓——简洁和高效。 Linux系统调用很多地方继承了Unix的系统调用(但不是全部),但Linux相比传统Unix的系统调用做了很多扬弃,它省去了许多Unix系统冗余的系统调用,仅仅保留了最基本和最有用的系统调用,所以Linux全部系统调用只有400个左右(而有些操作系统系统调用多达1000个以上)。 这些系统调用按照功能逻辑大致可分为“进程控制”、“文件系统控制”、“系统控制”、“存储管理”、“网络管理”、“socket控制”、“用户管理”、“进程间通信”等几类,详细情况可参阅文章系统调用列表 如果你想详细看看系统调用的说明,可以使用man 2 syscalls 命令查看,或干脆到 <内核源码目录>/include/asm-i386/unistd.h源文件中找到它们的源本。
2.系统调用的功能:
- 控制硬件——系统调用往往作为硬件资源和用户空间的抽象接口,比如读写文件时用到的write/read调用。
- 设置系统状态或读取内核数据——因为系统调用是用户空间和内核的唯一通讯手段,所以用户设置系统状态,比如开/关某项内核服务(设置某个内核变量),或读取内核数据都必须通过系统调用。比如getpgid、getpriority、setpriority、sethostname
- 进程管理——一系统调用接口是用来保证系统中进程能以多任务在虚拟内存环境下得以运行。比如 fork、clone、execve、exit等
3.系统调用的实现
===================
网络子系统
===================
x86架构linux内核启动过程
参考博客:blog.csdn.net/GerryLee93/…
机器启动到linux初始化是一个比较复杂并且细节性较强的过程,大部分的实现都是由于历史遗留问题以及各种协议约定而来的,衔接性比较强,而且比较难跟踪,毕竟不是C语言那么简单,一个函数调用一个函数,整个脉络比较清晰明了。
这里主要是以linux-3.2.55版本内核为基础,将整个系统的初始化流程梳理了一下。
A、自摁下电源开关后,是由主板自动初始化处理器信息的,将CS、DS、ES、SS置为0xffff,而PC置为0x0000,由于初始化时,处理器处于实模式,那么也就是计算机执行的第一条指令在0xffff0这个位置。计算机执行的第一条指令是来自BIOS的,存储在ROM里面,通过ROM芯片译码以读取出来执行,该指令通常都是一条跳转指令,这是由于0xffff0距离可访问的内存结尾已经不远了,该指令可以用来跳转到具体的BIOS操作代码中;
B、BIOS开始执行后,做了不少事情,比如Power On Self Test(POST,开机自检),检查CPU寄存器、周边芯片的状态,以及针对动态内存、主板芯片组、显卡以及相关外围的寄存器做初始化设置,并检查能够正常工作,同时记录系统的设置值,最重要的就是将常驻程序库(可以理解为BIOS的库,基本上就是中断)放置在某段内存中,提供给操作系统或者应用程序调用,比如int 0x13等;
C、BIOS毕竟不是系统,完成了分内工作后,执行int 0x19(前面提到的BIOS的常驻程序库)将存储在磁盘0头0道1扇区的MBR读入到内存0x7c00中,然后BIOS通过跳转指令去到0x7c00去执行引导程序代码;
D、MBR的引导程序对不同的linux版本而言各有不同,最初0.11版本中,linux的/boot/bootsect.s自己实现了这个MBR引导程序,而如今3.2.55的linux内核版本自身已经不再实现MBR引导程序了,都是由GRUB的/stage1/stage1.S实现的,具体的引导程序历史可以参考linux内核中的/Documentation/x86/boot.txt;
E、Linux 0.11的引导过程就不谈了,关于这块的资料数不胜数,那么GRUB实现的引导,主要是给用户提供了系统引导选择和引导编辑等功能,核心的是它通过调用BIOS的常驻程序库去将linux内核映像加载到内存当中;
F、GRUB加载完了内核映像,将会跳转到内核的文件/arch/x86/boot/header.S里面的_start开始执行,其实_start也没什么好执行的,就跳转到start_of_setup去设置准备给实模式下main函数运行的环境;
G、开始进入main函数执行,该函数的实现在文件/arch/x86/boot/main.c里面,具体可以进入去分析里面的代码,其主要的莫过于一些参数的准备、堆的初始化、CPU的检测、BIOS的设置以及内存检测等工作(这里使用了一些BIOS中断,所以这些都是在实模式下的!!!),然后开始转入保护模式;
H、进入保护模式后,将会跳转去执行arch/x86/boot/compressed/head_32.S里面的startup_32,其主要设置一个基本的环境,如堆栈等;
I、再往下就是调用文件/arch/x86/boot/compressed/misc.c里面的decompress_kernel,用来解压内核,当内核被解压到内存中之后,就可以调用它了;
J、解压完内核,还要调用一个startup_32,这个不同于前面的那个,这个是位于文件/arch/x86/kernel/head_32.S里面的,主要工作是对页表进行初始化,并启动内存分页功能,初始化0号进程;
K、startup_32执行完了之后,最后进入内核的主题函数start_kernel,该函数位于文件/init/main.c,自此完成linux的最后初始化。
以上就是机器启动linux的整个过程,主要是梳理了初始化实现的一个线索,暂时不深入分析。
===================
Linux内核编译、安装流程
第一步:下载linux内核源码
查看当前操作系统安装了哪些内核(注意:当前操作系统可以安装许多内核,但是当前运行的内核只能有一个)
dpkg --list | grep linux-image
查看当前运行的内核版本
uname –r
sudo apt-get install libncurses5-dev libssl-dev -y
sudo apt-get install build-essential openssl -y
sudo apt-get install zlibc minizip -y
sudo apt-get install libidn11-dev libidn11 -y
sudo apt-get install bison -y
sudo apt-get install flex -y
sudo apt-get install libelf-dev -y
sudo apt-get install libelf-devel -y
sudo apt-get install elfutils-libelf-devel –y
sudo apt-get install flex –y
sudo apt-get install bison -y
第三步:配置编译选项开始编译安装内核
make mrproper #清空一些配置信息检查源码是否完整
make clean #清空一些编译信息
cd /usr/src/linux
make menuconfig
#(相当于make bzImage加make modules)另外make可以加-j 20 意思启动20个线程编译
make
#生成相应的模块
make modules
#将相应的模块拷贝到对应的目录下
make modules_install
#该命令的作用是将.config,vmlinuz,initrd.img,System.map文件到/boot/目录、更新grub。默认启动新内核
make install