操作系统
文章平均质量分 83
lcjmsr
这个作者很懒,什么都没留下…
展开
-
现代操作系统学习之进程与线程
1.进程是对正在运行程序的一个抽象。一个进程就是一个正在执行程序的实例,包括程序计数器、寄存器、和变量的当前值。从概念上说,每个进程拥有它自己的虚拟cpu。当然实际的cpu各进程之间来回切换。2.创建进程,有四种主要事件导致进程的创建:1.系统初始化。2.执行了正在运行进程所调用的进程创建系统调用。3.用户请求创建一个新进程。4.一个批处理作业的初始化。启动操作系统时,通常会创建若干进程。原创 2016-02-24 16:20:14 · 647 阅读 · 0 评论 -
linux内核上下文切换解析
linux的上下文切换就是进程线程的切换,也就是切换struct task_struct结构体,一个任务的上下文包括cpu的寄存器,内核栈等,由于1个cpu上的所有任务共享一套寄存器,所以在任务挂起的时候需要保存寄存器,当任务重新被调度执行的时候需要恢复寄存器。每种处理器都提供了硬件级别的上下文切换,比如x86架构下的TSS段,TSS段包括了一个任务执行的所需要的所有上下文,主要有:1.通...原创 2018-09-22 00:41:53 · 2355 阅读 · 0 评论 -
linux内核进程创建fork源码解析
平时写过多进程多线程程序,比如使用linux的系统调用fork创建子进程和glibc中的nptl包里的pthread_create创建线程,甚至在java里使用Thread类创建线程等,虽然使用问题不大,但需要知道底层原理。这次在自己写操作系统的时候,看了一遍linux内核的进程创建过程。算是有了比较深入的理解。 进程概念:进程是对正在运行程序的一个抽象。一个进程就是一个正在执行...原创 2018-08-20 23:25:51 · 2166 阅读 · 0 评论 -
linux内核缺页中断处理
现代处理器大部分都有MMU,除了一些小型嵌入式设备。MMU可以做虚拟地址到物理地址的转换,使用MMU我们就可以使用更多的内存空间,因为程序具有局部性原理,我们可以将暂时用不到的数据存放到磁盘,当访问到时会发生缺页中断,从磁盘中将所需要的数据加载到内存。所以我们可以通过mmu运行程序大小大于内存的程序和打开大于内存的文件。现代处理器通过分段分页机制实现虚拟地址到物理地址转换一般支持二级页表或四级页表...原创 2018-07-12 22:56:58 · 5985 阅读 · 2 评论 -
linux进程虚拟空间布局
首先看linux进程的虚拟空间内存布局,以i386 32位机器为例每个用户进程的虚拟地址空间为0x0—0xC0000000也就是3GB,其中0x0—0x08000000 128MB地址空间用于捕获空指针,用户空间分为代码段,堆,mmap区,栈。堆的起始地址start_brk依据代码段和数据段的大小确定,堆从低地址往高地址增长,mmap区从高地址往低地址增长当两个区域相撞时则区域耗完,mmap区基地...原创 2018-07-02 23:10:50 · 1373 阅读 · 0 评论 -
linux内存管理slab算法之slab初始化
业余时间写的玩具操作系统,准备把内存管理部分加强一下,伙伴系统分配页面算法已经完成,下面就要开始写更加细粒度的内存分配,毕竟伙伴系统是按照页为基本单位分配的,参考内核版本linux2.6.30,没分析高版本的源码,算法基本思想应该差不多。 slab算法是一个高效的内存分配算法,它通过把经常使用的内存块比如32字节,64字节大小或者某个常用结构体大小的类型组织成一个kmem_cache结构原创 2017-07-31 17:34:26 · 495 阅读 · 0 评论 -
linux内存管理slab算法之kmem_cache结构创建
kmem_cache是slab的核心结构体,主要描述slab的各种信息和链接空闲slab,还保存高速缓存的指针数组。所以要想使用slab分配得先创建kmem_cache结构体。struct kmem_cache *kmem_cache_create (const char *name, size_t size, size_t align, unsigned long flags, void原创 2017-08-31 11:39:00 · 3604 阅读 · 0 评论 -
内存分配算法 伙伴系统
#include #include #include #include //双向链表struct list_head { struct list_head *prev, *next;};//拉链法存储空闲内存typedef struct free_area { struct list_head free_list; //把空闲内存块链接到空闲链表 uns原创 2017-06-22 12:50:22 · 1016 阅读 · 0 评论 -
操作系统之x86架构下的bootloader
bootloader主要做四件事,1.开启A20地址线;2.探测内存,把内存相关信息告诉内核;3.初始化全局描述符表,开启分段机制,进入保护模式;4.把操作系统内核从磁盘加载到内存指定位置,跳转到内核,执行内核代码。1.开启A20地址线,把内存寻址扩展到4GB。enable20.1: inb $0x64, %al t原创 2017-05-06 21:49:14 · 1621 阅读 · 0 评论 -
操作系统学习之BIOS
在x86架构的机器中,有一块ROM,里面存放了BIOS程序,BIOS程序就是开机自检程序,初始化内存控制器,中断控制器,设置中断向量等,将系统软硬件带到一个合适的状态,为操作系统内核准备环境。在ARM架构中没有BIOS,但是得自己写bootloader,bootloader一般存放在flash内,起始地址一般为0x00000000。下面看一下x86架构启动方式。 8086是16位机器,原创 2016-08-14 19:00:15 · 2685 阅读 · 0 评论 -
glibc nptl库pthread_mutex_lock和pthread_mutex_unlock浅析
一、futex简介 futex全称是fast user-space locking,也就是快速用户空间锁,在linux下使用C语言写多线程程序时,在需要线程同步的地方会经常使用pthread_mutex_lock()函数对临界区进行加锁,如果加锁失败线程就会挂起,这就是互斥锁。但是pthread_mutex_lock并不是立即进行系统调用,而是首先在用户态进行CAS操作,判断其它线程是...原创 2019-03-16 23:46:38 · 5831 阅读 · 2 评论