笔记 3 :linux 0.11 中的重要的全局变量 (b)及注释的函数 move_to_user_mode() , sti() , find_empty_process()

(15) 接着介绍缓冲区初始化,首先介绍一个全局量 end ,表示 源代码编译的终点,随后就是缓冲区。缓冲头环形双链表的 end 的节点的地址保存在内核数据区的指针 start_buffer 里,以供内核代码使用,这是个全局变量。 经 static 修饰的 指针 free_list 仅有 buffer . c 文件使用:

在这里插入图片描述

上图里也介绍了关于缓冲区的其它几个全局变量。全局数组 hash_table 的位置肯定是在 end 以前定义的。end 后为随机数据缓冲区。

(16) 接着介绍缓冲区头部 buffer_head 这个结构体。意思是若该内存缓冲区读取了来自 设备 dev 的块 block 的数据,就把 设备的块信息等级在缓冲头结构中:

在这里插入图片描述

(17) 由于初始化了缓冲区后,得出操作系统指导的内存分布图:

在这里插入图片描述

(18) 接着介绍硬盘初始化时的全局变量与结构:

在这里插入图片描述

(19) 接着要使 0 号进程转到用户态。书中说:linux 操作系统规定,所有进程都要由已存在的进程在 3 特权级创建

在这里插入图片描述

给出 move_to_user_mode() 这个 宏定义的源码:

在这里插入图片描述

执行上面代码的时候 , CPU 里的重要的寄存器都已赋值 : GDTR 、 LDTR 、TR 、 IDTR 、 CR0 、 CR3 、 ESP 等。

(20) 接着是宏定义 sti () ,跟函数似的,而且 c 语言语法不直接支持汇编语句的书写:

在这里插入图片描述

(21) 接着介绍在 main 函数里是如何调用 fork ( ) 函数的,及全局变量 errno ,此值记录函数调用出错码 :

在这里插入图片描述

(22) 关于 fork() 函数,可以参考笔记 1 ,这里继续补充,这里记录下 全局函数指针数组 sys_call_table 的定义,及 typedef 的用法,可见这些函数都不能有参数:

在这里插入图片描述

以及测试 typedef 的补充例子:

在这里插入图片描述

以及确认函数类型:

在这里插入图片描述

(23) 继续分析 fork( ) 函数的执行过程及编译时候的符号链接:

在这里插入图片描述

(24) 再来看看 system_call 系统调用的定义,由以上分析知,系统足以在 int 80H 中断发生时,根据功能号来找到合适的子例程来执行:

在这里插入图片描述

(25) 再举一例,关于编译 linux 0.11 源码的编译器的对符号的链接问题, 表示全局描述符表 gdt 和中断描述符表 idt 这两个 c 语言中的全局变量的赋值问题:

先介绍一个 sourceinlight 的好用的功能,用于变量名和函数名的跟踪:

在这里插入图片描述

如下图:

在这里插入图片描述

(26) 本条目分析例程 find_empty_process ( ) ,并介绍汇编指令 test 的功能,以及又一个新的全局变量 last_pid :

在这里插入图片描述

(27)
谢谢

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值