Linux内核编程(三)----------Linux内核的基本概念
写在前面:充满机遇与挑战的2019年来了,年前由于各个项目的原因,这个系列停滞了好久,新的一年虽然项目也是非常紧张,但还是争取闲暇的时间利用起来,把这个系列咬咬牙写完。任何成功和舒适,都是苦尽甘来,你想要得到,就必须付出;想要成功,就必须努力。只有现在吃了学习的苦,将来才会少吃生活的苦。2019,我们都是追梦人。
正文:本篇主要介绍Linux内核的基本概念
1、 物理地址&虚拟地址:
(1)、地址转换:Linux内核所使用的地址一定是虚拟地址,但是CPU真正最后访问的是物理地址,所以必须有一个转换的过程。
虚拟地址转换成物理地址接口:static inline phys_addr_t virt_to_phys(const volatile void *x);// //arch/arm/include/asm/memory.h
物理地址转换成虚拟地址接口:static inline void *phys_to_virt(phys_addr_t x);//arch/arm/include/asm/memory.h
(2)、页表:物理地址到虚拟地址转换,必须通过查一张表格来进行转换,这张表格就是页表。Linux里面最小的内存管理单元是页,一般页的大小是4K,所以页表 的大小就是访问的所有的物理地址除以4K。即如果内存空间大小是4G,则页表的大小是4G/4k = 1M大小。页表是存在内存中的。
页表初始化:init/main.c
start_kernel->mm_init->mm_alloc_pgd //初始化第一级页表
将驱动设备本身的内存空间映射到主页表中
arch/arm/include/asm/io.h
ioremap(cookie,size) //cookie,物理地址,size,大小
ioremap->_arch_ioremap->arm_ioremap->_arm_ioremap->__arm_ioremap_pfn_caller->ioremap_page_range---分配pgd
(3)、内存的属性:可读、可写、可执行。即每一个页都会有一个属性。物理地址到虚拟地址转换的一个重要的原因是操作系统要实现对内存属性的控制。
2、Linux内核中的内存管理:
(1)、内核以页(4K bytes)为单位进行内存管理。
(2)、内存管理相关的几个API举例:
alloc_pages(gfp_t gfp_mask, unsigned int order)
作用:内核分配内存的底层调用,可以分配整页的内存,他分配的内存以页为单位即4K为单位
gfp_mask:区分内存的条件。
参数: GFP_NOWAIT:分配内存的过程不允许等待(一般中断里面)。
GFP_ATOMIC:原子操作,大致也是不允许等待
GFP_NOFS:申请的内存不用于文件操作
GFP_KERNEL:申请的内存给内核用
GFP_USER:申请的内存给用户用
GFP_IOFS:申请的内存给外设用
order:分配的页的个数,分配2^order个页面。
kmalloc(size_t size, gfp_t flags)
作用:内核中常用的分配内存的函数,可以以字节为单位进行分配,分配连续的内存,速度快。
vmalloc(unsigned long size)
作用:也是内核中分配内存的函数,他和kmalloc的不同点,vmalloc分配的可以是物理上不连续的内存,效率较低,用于不重要场合。
3、系统调用:
用户程序想要调用内核函数的一种方式(API)。通过一个execption,使得一个应用程序陷入内核中执行。
例如:比如应用程序想要运行另一个程序,可以用exec族函数,exec族函数会产生SWI类型的exception(异常),从而陷入内核,执行内核函数sys_execve->do_execve,从而运行另一个程序。
4、 内核线程:
(1)、内核中只有线程,没有进程(或者只有1个进程)。因为所有的内核代码空间只有1份。
(2)、线程的task_struct,线程运行的核心数据结构,包含内核的所有信息。这个结构体非常庞大,包括进程的优先级(int prio, static_prio, normal_prio;nsigned int rt_priority;)、堆栈信息(void *stack;)、打开的文件句柄信息(struct files_struct *files;)等等。
(3)、内核线程的调度。内核线程中只有3种调度方式:SCHED_RR(时间片轮转)、SCHED_PRI(优先级)、SCHED_RT(实时)。调度的时机:时钟中断发生、Linux发生内核态和用户态互相切换时、Linux执行信号时。
5、中断:
(1)、中断的硬件概念:就是一个外部的电平信号,通过外部电平信号的高低来中断cpu。
(2)、中断处理的上半部:当发生一个中断时,Linux内核暂时不响应其他硬件中断的处理,这个时间很短,一定时处理关键而迅速完成的程序段。另外,这个程序段一定不能等待其他条件发生。
(3)、中断处理的下半部:上半部中来不及处理的比较冗长的程序段;需要等待其他程序运行结果或者需要等待获取其他资源的程序段。
6、时钟和定时器管理:
(1)、时钟的硬件概念:时钟从硬件上讲是一种产生定时中断的电路。
(2)、RTC和system timer: RTC:实时计数器;system timer:很多情况就是用作为延时和计算相对时间的。
(3)、tick&&jiffies: tick,时钟中断的周期。jiffies:是一个全局变量,如果是64 bit系统,他就是一个64位的变量,记录了从上电开始所经历的tick数。
查看cpu的tick:在 linux-3.0.8目录下 打开 .config 文件,找到 CONFIG_HZ=200 这个宏就可以,即tick的周期事1/200s。
jiffies的定义,是个全局变量:# define jiffies raid6_jiffies()
7 、文件系统概述:
(1)、虚拟文件系统(VFS):是Linux 内核为了屏蔽物理文件系统差异,所产生的一个中间层。linux内核访问实际物理文件系统时的中间层。
do_mount ->do_new_mount ->do_kern_mount -> vfs_kern_mount -> mount_fs -> root = type->mount(type, flags, name, data);
(2)、主要的物理文件系统(ext4、yaffs2等):ext4最大特点是有完善的日志系统。yaffs2比较适合在nandflash上部署的文件系统。ubifs和btfs,这两种是比较流行的新的文件系统。
8、内核中的同步和线程间通信方式:
(1)、原子操作:不会被打断的基本操作,即一条指令就可以完成的事情,不同的CPU架构不同,例如,i++在有的平台一条指令可以完成,有的平台一条指令不会完成。
(2)、同步通信方式:linux 内核中有两大类
1、自旋锁 spin_lock
2、信号量 (semaphore)up和down两个函数(up 释放信号量,down 获取信号量)
上述两者的区别:spin_lock不会引起阻塞,可用在中断上半部, up和down可引起阻塞,不能用在中断上半部
(3)、异步通信方式:主要有信号(signal)实现(注意信号和信号量是完全不同的东西),例如:进程A向进程B发个信号要求进程B做个事情,一般不要求进程B马上执行。
Linux内核编程(三)----------Linux内核的基本概念相关推荐
- Linux 串口编程三 使用termios与API进行串口程序开发
在 termios 结构体以及内部终端控制标志中,并非所有的参数对于实际的物理串口都是有效的,在使用过程中也不需要对于所有标志的作用都有所理解.事实上,快速掌握一项技术的核心点也是一种学习能力.对于使 ...
- linux c编程项目实例,Linux c编程实例_例子
例一:字符与整型变量的实现 #include int main() { int c1,c2; char c3; c1='a'-'A'; c2='b'-'B'; c3='c'-; printf(&quo ...
- Linux 环境编程 day01 Linux系统介绍、GNU编译工具、静态/共享库、环境变量表
Linux 环境编程 day01 Linux系统介绍.GNU编译工具.静态/动态库.环境变量表 学习Linux环境编程的原因 UNIX系统介绍 Linux系统介绍 GNU工程 POSIX标准 GNU通 ...
- Linux内核及内核编程之五Linux下的C编程特点
3.5 Linux下的C编程特点 3.5.1 Linux编码风格 Linux有独特的编码风格,Linux程序的命名习惯和Windows程序的命名习惯及著名的匈牙利命名法有很大的不同.在Windows程 ...
- Linux系统编程(三) --进程间通信
文章目录 1 进程间通信总览 1.1 进程间如何通信 1.2 Linux IPC 分类 1.3 Linux IPC常用手段 2 无名管道 2.1 pipe 函数 2.2 用pipe进行进程间通信 3 ...
- shell编程(三) : [Linux基础] Linux 环境变量
接上一篇文章Linux shell编程(二): Linux shell基础 2.3 Linux环境变量 bash shell用一个叫作环境变量(environment variable)的特性来存储有 ...
- 【Linux系统编程】Linux进程管理
00. 目录 文章目录 00. 目录 01. 概述 02. 进程相关概念 03. 进程的状态 04. 进程调度 05. 程序调度函数 06. 附录 01. 概述 在Linux的内核的五大组成模块中,进 ...
- 【Linux系统编程】 Linux系统调用概述
系统调用概述 系统调用,顾名思义,说的是操作系统提供给用户程序调用的一组"特殊"接口.用户程序可以通过这组"特殊"接口来获得操作系统内核提供的服务,比如用户可以 ...
- linux 可定义信号数,Linux系统编程(20)——信号基本概念
信号及信号来源 信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的.信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知 ...
- 【Linux | 系统编程】Linux系统编程(文件、进程线程、进程间通信)
文章目录 Linux系统编程 文件IO open/close函数 read/write函数 文件描述符 阻塞.非阻塞 fcntl函数 lseek函数 传入传出参数 文件系统 文件存储 文件操作 sta ...
最新文章
- 6.5 scp:远程文件复制
- 如何使用点击超链接的方式打开Android手机上的应用
- android 索引怎么使用情况,android 數據庫查詢中使用索引-大幅提高數據庫操作速度...
- Maven-pon.xml模板(ssm自用)持续更新
- 李践《高效人士的五项管理-行动日志》 表格
- 怎么改java游戏_jar游戏按键修改,怎么修改jar游戏按键
- 用计算机制作课程表,怎么用word做表格-Word制作课程表的方法,学习必备表格,简单易学...
- php 虚线怎么画,ps画虚线最详细教程
- hive生产实践问题(一)在使用Hive Client跑job时,一直提示job被kill,
- jca 实例 java_采用jca分析javacore文件示例
- windows安全事件ID编号解释大全
- 2017南京大学计算机考研复试分,2018.的南大复试考生,:2017南京大学中国古代史考研复试经...
- 用Python画漂亮的专业插图 ?So easy!
- Python项目实战:绕圈圈面试题
- 神经网络量化入门--基本原理
- 使用SaveFileDialog将DataTable文件保存成csv文件
- 如何替换kubeadm,kubelet的版本
- URL长链接转短链接
- 光纤同轴音频解码蓝牙MP3音箱芯片方案
- 2019上半年教资信息技术学科知识与教育能力——主观题