操作系统高级教程
操作系统linux-0.11源码分析
Icoding_F2014
相信代码可以变化世界
展开
-
linux-0.12源码分析——缓冲区等待队列(栈)sleep_on+wake_up分析
今天,我们来看一个有趣的东西,那就是中当有多个进程去读或写同一个文件,然后被这个文件对应的同一个缓冲区阻塞时,linux-0.12是如何把这些进程给阻塞起来,同时又是如何把被阻塞的进程一一唤醒。从一个奇怪的地方说起我们来看buffer-head的结构include\linux\fs.hstruct buffer_head { char * b_data; /* pointer to ...原创 2019-05-12 13:12:29 · 691 阅读 · 7 评论 -
操作系统分析——从开机加电到main执行前的关键流程
个人手绘,机器开机加电到main执行前的关键步骤原创 2018-11-21 23:47:22 · 279 阅读 · 0 评论 -
bread 块设备读取函数解析(1)
引言bread 块设备读取函数,顾名思义就是读取块设备内容的函数,这个函数的第一次调用是在main函数里面进程1的init()函数里面,sys_setup函数调用的。第一次调用主要是为了读取硬盘上的第一个扇区的内容,因为第一个扇区有着分区表等重要信息。bread的技术路线特别长,可以说它操作系统里面的缓冲区,请求项,驱动等多个版本都结合起来,想要充分理解整个函数,是十分需要耐心的。OK,L...原创 2018-11-14 21:06:10 · 2152 阅读 · 0 评论 -
copy_page_tables函数分析
先看看分页机制里面的页目录表、页表、页之间的关系。分页机制是用于将一个线性地址转换为一个物理地址。在I32 CPU环境里面,首先通过设置CR0寄存器,打开保护模式、开启分页机制。然后将页目录表的物理地址基址给CR3寄存器。开启分页机制后,I32将全部的物理内存空间、线性地址空间划分为一个个的页。每个页可以是4KB或者4MB。页目录表里面存放页目录表项,每个页目录表项指向页表。其中页目录表项的高...原创 2018-10-30 01:15:16 · 1468 阅读 · 3 评论 -
操作系统分析——_TSS(n)宏解析
在linux内核代码中,会遇到如下的宏定义:#define _TSS(n) ((((unsigned long) n)<<4)+(FIRST_TSS_ENTRY<<3)) #define _LDT(n) ((((unsigned long) n)<<4)+(FIRST_LDT_ENTRY<<3))#define ltr(n) __asm__("...原创 2018-11-07 15:00:17 · 1476 阅读 · 2 评论 -
move_to_user_mode()一个push esp的疑问
#define move_to_user_mode() \__asm__ ( &quot;movl %%esp,%%eax\n\t&quot; \ &quot;pushl $0x17\n\t&quot; \ &quot;pushl %%eax\n\t&quot; \ &quot;pushfl\n\t&quot; \ &quot;pushl $0x0原创 2018-10-16 23:36:13 · 356 阅读 · 0 评论 -
操作系统分析——main.c(2) move_to_user_mode()函数
今天来看看move_to_user_mode()函数这个宏函数是在main()函数开启中断以后调用的。这个函数的作用是什么呢?经过sti()以及之上的语句,进程0就已经创建完毕了。其中最主要的就是创建了类型为task_union 的init_task。static union task_union init_task = {INIT_TASK,};其中INIT_TASK是linus硬编码进...原创 2018-10-16 09:56:38 · 1114 阅读 · 4 评论 -
操作系统——main.c(1)sched_init()
今天我们来看看内核main函数调用的sched_init()函数。main函数void main(void) { ROOT_DEV = ORIG_ROOT_DEV; drive_info = DRIVE_INFO; memory_end = (1&amp;lt;&amp;lt;20) + (EXT_MEM_K&amp;lt;&amp;lt;10); memory_end &amp;amp;= 0xfffff原创 2018-10-16 00:42:08 · 909 阅读 · 0 评论 -
进程0的LDT0代码段描述符分析
LDT0的值为···· { \ {0,0}, \ /* ldt */ {0x9f,0xc0fa00}, \ {0x9f,0xc0f200}, \ },···其中第二项{0x9f,0xc0fa00}为代码段的描述符。然后看task中对ldt的定义:struct task_struct {/* these are hardcoded -...原创 2018-10-12 23:36:57 · 880 阅读 · 5 评论 -
操作系统分析——为什么需要RPL,request privilege level
在学特权级的时候,我们都会知道一共有三个特权级:CPL,DPL,RPL。CPL和DPL是比较好理解的,CPL是当前CPU所在的特权级,这个值是保存在CS段寄存器的段选择子中的。而DPL则是目标段描述符的特权级。我们想啊,我现在帅的等级为CPL,这个等级可以通过我身上的一个叫做CS的东西知道。然后我想去访问某个地方。这个地方不是可以随便访问的,这些地方是有特权级DPL,世界的法则规定只有CPL&amp;amp;l...原创 2018-10-15 20:40:59 · 899 阅读 · 4 评论 -
C语言内联汇编
在阅读linux 源码的时候,我们会看到很多C语言内联汇编的代码。下面我们集中看看C语言内联汇编是怎么样的。首先,我们得想想为什么会有在C语言里面内联汇编的需求。主要有两个,一个是我们觉得在被频繁调用的函数,如果使用C写出来的代码,可能执行效率达不到我们的预期,于是我们就使用汇编语言来把这个函数的逻辑实现出来,例如qsort函数;另一个是我们需要使用某些只能通过汇编指令才能实现的功能。可能有...原创 2018-09-26 22:06:43 · 7308 阅读 · 1 评论 -
学习linux-0.11内核——搭建环境(编译、调试bootsec)
编译内核获取内核代码git clone https://github.com/jmhIcoding/linux_kernel12.gitgit checkout check其中 linux_kernel12的目录结构为:·||————source_code 原始linux-0.11代码,里面有vs2015的工程文件,可以方便的看代码||----source_co...原创 2018-09-14 01:17:49 · 2327 阅读 · 0 评论