llinux-4.9
文章平均质量分 71
18279216400
这个作者很懒,什么都没留下…
展开
-
4.7 中断篇-知识点总结
同步机制:1:原子操作(atomic_t)保证指令以原子的方式执行,执行过程不会被打断2:自旋锁(spin_lock)禁止抢占,禁止睡眠:1)抢占/睡眠 调度进程可能也会申请该锁,导致死锁。详解:spin lock的自动禁止抢占的也就是说,A如果那到锁以后,内核的抢占暂时被禁止。然后它休眠了,切换到另一个进程B(注意,这不是抢占,是进程自己放弃CPU)。等到进程B想要获得这个锁时发...原创 2020-05-06 14:49:59 · 281 阅读 · 0 评论 -
4.6 中断篇-代码应用:实现一个可多线程同时删除,增加的链表
功能:实现一个多线程同时删除,增加的链表要点:同时使用锁,消息队列,定时器,原子操作#include<linux/init.h>#include<linux/module.h>#include<linux/list.h>#include<linux/semaphore.h>#include<linux/sched.h>#in...原创 2020-05-01 10:43:25 · 260 阅读 · 0 评论 -
4.5 中断篇-内核同步
并发执行原因1)中断2)内核抢占3)睡眠4)对称多处理器临界区:访问和操作共享数据的代码段保护临界区:1)原子操作2)禁止抢占3)串行的访问临界区(自旋锁,互斥锁)同步措施1:原子操作:对变量的修改,装载,存储必须原子进行,不能分割结构体:typedef struct{int count;}atomic_t为什么原子类型的的定义要把一个整行放入结构体中?1、防止原...原创 2020-04-30 09:41:40 · 97 阅读 · 1 评论 -
4.4 中断篇-实现一个中断处理
1:简述中断模块初始化过程1)调用流程do_irq handler_irq generic_handle_irq_desc desc->**handle_irq**2)handle_irq挂载我们以handle_edge_irq为例(边沿触发)2.1 :__irq_set_handle流程可以最终将handle_edge_irq挂载道了desc->handl...原创 2020-04-29 11:48:22 · 249 阅读 · 0 评论 -
4.3 中断篇-时间系统
1:时钟中断概念系统使用时钟中断促使进程的切换,以保证所有的进程共享cpu,是整个操作系统的脉搏1)基本时钟硬件可编程定时/计数器产生的输出脉冲送入cpu后就会引发一个中断请求,也就是时钟中断时钟中断的周期也就是脉冲信号的周期,我们叫滴答或者节拍(tick)2)RTC(real time clock)实时时钟作用:长时间存放系统时间,关机后也可以依靠主板的CMOS来维持系统计时3)...原创 2020-04-28 21:18:46 · 506 阅读 · 0 评论 -
4.2 中断篇-处理机制
1:中断基本机制中断服务程序都是在关中断的条件下执行的,以避免嵌套。但是中断是随机事件,如果关中断时间过长就会导致中断丢失,因此内核就需要尽快的处理完中断请求,将耗费时间的处理推迟处理。中断上半部:不可中断,中断服务程序中断下半部:可中断2:中断下半部通过do_softirq来处理添加1)soft_irq用作对下半部执行时间比较紧急的场合,在中断上下文执行2)tasklet中断...原创 2020-04-28 12:06:27 · 174 阅读 · 0 评论 -
4.1 中断篇-基础知识
1:概述简介中断是什么?中断是cpu对系统发生某个事件做出的一种反应为什么引入中断?支持CPU和设备间的并行操作中断控制模型中断软件架构图1:普通外设驱动代码2:硬件无关代码3:cpu体系架构相关代码4:中断控制器的驱动代码中断向量2:中断处理机制处理流程1)确定中断向量号2)通过IDTR寄存器找到IDT表的地址,再通过中断向量号找到相应的中断描述符3)通...原创 2020-04-28 10:21:22 · 352 阅读 · 0 评论 -
2.4 内存篇-实现内存映射mmap
1:代码实现mmap.c#include <linux/init.h>#include <linux/kernel.h>#include <linux/module.h>#include <linux/errno.h>#include <linux/mm.h>#include <linux/vmalloc.h>...原创 2020-04-27 21:21:16 · 307 阅读 · 0 评论 -
2.3 内存篇-物理内存管理
1:内核空间划分低端内存:如图所示,将物理内存0-896M和kernel space线性映射内核空间虚拟内存和物理内存间的地址转化函数__pa(addr),返回addr的物理地址,addr-PAGE_OFFSET__va(addr),返回addr的虚拟地址,addr+PAGE_OFFSET高端内存:高于896M的内存,和虚拟内存的映射关系如下所示1)vmalloc2)持久映射...原创 2020-04-27 20:36:47 · 170 阅读 · 0 评论 -
2.2 内存篇-虚拟内存管理
1:虚拟内存管理机制地址映射机制:内核通过映射机制,将内存从磁盘映射到虚拟地址空间1:当进程执行时,发现访问的页没有映射到物理内存时,发出页请求,即请页机制。2:有空闲内存可分配就分配内存,这时用到的就是内存分配和回收机制3:同时把正在使用的页记录在页缓存中,这时就用到了页缓存和刷新机制4,5:如果此时没有空闲内存,那就需要交换机制腾出一部分内存6:交互机制中也需要用到交换缓存7:...原创 2020-04-27 17:42:48 · 300 阅读 · 0 评论 -
3.11 进程篇-总结
通信方式:1:无名管道特点:1)半双工2)端口无名3)只能用于有亲缘关系的进程函数:int pipe(int pipefd[2]);创建超过后会自动创建俩个文件描述符fd[0]和fd[1],fd[0]用来读,fd[1]用来写注意:1)已经明确指定为读端,则应该利用close函数关闭写段;相反亦然2)想管道中写入数据,管道会有一定的数据缓存区,如果没有读走,则会造成写段阻塞3...原创 2020-04-25 10:56:00 · 105 阅读 · 0 评论 -
3.10 进程篇-线程:用户线程
1:线程创建及传参#include<stdio.h>#include<pthread.h>#include<stdlib.h>#include<unistd.h>typedef struct A{ int a; float b;}A,*PA;void * func(void * n){ int i;// p...原创 2020-04-24 18:57:46 · 77 阅读 · 0 评论 -
3.9 进程篇-通信:两个进程通过共享内存交换数据
实现reader和writer两个进程,使它们通过共享内存交换数据。writer从标准输入读入字符串写入共享内存,reader把共享内存里的字符串打印到标准输出。reader和writer通过信号实现同步思路:a) reader进程将自己的PID写入共享内存的开头几个字节处,然后等待writer进程给自己发信号,收到信号就去读buf的内容并打印出来。b) writer进程将数据写入共享内存...原创 2020-04-23 21:54:10 · 2242 阅读 · 1 评论 -
3.8 进程篇-通信:司机与售票员问题
用信号模拟司机售票员问题:创建子进程代表售票员,父进程代表司机 ,同步过程如下:1 售票员捕捉SIGINT(代表开车),发SIGUSR1给司机,司机捕捉到该信号之后打印(“move to next station”)。2 售票员捕捉SIGQUIT(代表靠站),发SIGUSR2给司机,司机捕捉到该信号之后打印(“stop the bus”)。3 司机捕捉SIGTSTP(代表车到总站),发SIG...原创 2020-04-23 17:27:23 · 1784 阅读 · 0 评论 -
3.7 进程篇-通信:信号量
代码如下:sem.c#include "sem.h"//初始化信号量void sem_init(int sem_id,int value){ union semun sem; sem.val = value; if(semctl(sem_id,0,SETVAL,sem) < 0){ perror("semop"); exi...原创 2020-04-23 16:37:35 · 113 阅读 · 0 评论 -
3.6 进程篇-通信:共享内存
shm.h#ifndef __SHM_H__#define __SHM_H__#include<stdio.h>#include<string.h>#include<sys/ipc.h>#include<sys/shm.h>#include<unistd.h>#include<stdlib.h>#defi...原创 2020-04-23 11:22:27 · 99 阅读 · 0 评论 -
3.5 进程篇-通信:信号
概念:进程间的一种通信方式,异步函数:1)kill杀死传入的进程号的进程 kill(atoi(argv[1]),SIGKILL);2)raise给自己发信号#include<stdio.h>#include<unistd.h>#include<sys/types.h>#include<signal.h>#include&l...原创 2020-04-23 10:57:52 · 78 阅读 · 0 评论 -
3.4 进程篇-通信:管道
无名管道用与亲属间进程,半双工代码作用:实现~$ ls -l | grep “file”#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <string.h>int main(void){ int fd[2]; pid_t pid...原创 2020-04-23 10:09:05 · 64 阅读 · 0 评论 -
3.2 进程篇-API操作:创建/使用 等待/退出
wait原创 2020-04-22 11:29:55 · 257 阅读 · 1 评论 -
3.3 进程篇-API操作:进程扇/进程链
1:进程扇:父进程产生一系列子进程,每个子进程打印自己的PID然后退出。要求:父进程最后打印PID。代码实现:#include<stdio.h>#include<unistd.h>#include<stdlib.h>int main(void){ int i = 0; int ret = 0; pid_t pid; ...原创 2020-04-22 11:22:11 · 712 阅读 · 0 评论 -
3.1 进程篇-如何打印所有的进程信息
代码实现#include<linux/init.h>#include<linux/kernel.h>#include<linux/module.h>#include<linux/sched.h>#include<linux/init_task.h>#include<linux/mm_types.h>static...原创 2020-04-21 21:19:13 · 1162 阅读 · 0 评论 -
2.1 内存篇-如何找到存放hello world的物理地址
1:代码实现通过下面的vaddr_2_paddr函数即可完成虚拟地址到物理地址的转化,整体代码如下环境:ubuntu kernel-4.4#include<linux/kernel.h>#include<linux/init.h>#include<linux/module.h>#include<linux/mm.h>#include&l...原创 2020-04-21 10:45:26 · 694 阅读 · 0 评论 -
1.3 基础篇-内核链表使用实例
任务:使用内核链表将1,2,3,4,5,6,7,8,9,10,重新排列成1,3,5,7,9,10,8,6,4,2,即奇数升序偶数降序,并在屏幕上打印出来。代码:double_list.c#include"double_list.h"void init_list(my_plist *list){ //apply space *list = (my_plist)malloc(...原创 2020-04-19 11:53:47 · 120 阅读 · 0 评论 -
1.2 基础篇-内核链表功能简析
结构体:strcut list_head{ sttuct list_head *next,*prev;};初始化:#define LIST_HEAD_INIT(name) { &(name), &(name) }#define LIST_HEAD(name) \ struct list_head name = LIST_HEAD_INIT(name)stati...原创 2020-04-19 09:44:34 · 72 阅读 · 0 评论 -
1.1 基础篇-如何写一个ko
hello.c#include <linux/init.h>#include <linux/kernel.h>#include <linux/module.h>static int __init hello_init(void){ printk("hello init\n"); return 0;}static voi...原创 2020-04-18 21:51:25 · 619 阅读 · 0 评论 -
linux-4.9学习目录
当学习完linux-0.11后,结合实际的工作,重新理解和实践linux-4.9版本,学习计划如下:1:如何写一个ko2:内核链表3:内存寻址4:进程管理5:内存管理6:中断7:同步8:系统调用9:文件系统10:设备驱动...原创 2020-04-18 14:44:18 · 195 阅读 · 0 评论