怀旧笔记
作者:******@bmy
2011-2
[说明]都是多年前所做的笔记了,里面的内容也不一定正确,权当怀旧。
主要是三方面的内容:
linux 内核学
以及当年在 bmy bbs 上的一次讨论(那还是刚混 bbs 的时候)
linux 内核学
2006-11
linux
-boot
-- 将映像加载到内存里面
-- 读机器系统数据到 0x90000,移动内核到 0 处,加载 idtr,gdtr,
开启 A20,进入保护模式,跳到 处,通过设置段选择符完成
-- 加载各个数据段寄存器,设置 idt,gdt,监测 A20,分页设置,
运行 main()
-fs
--
-include
--asm
--- 模式切换,中断门设置 set_trap_gate(),填写 IDT 表
--linux 内核使用的头文件
---
---
--- 系统调用表的数组值赋值 sys_call_table[]
--- task_struct,tss_struct,i387_struct,INIT_TASK
--sys 内核资源相关的头文件
---
-- 系统调用号,_syscall 宏,系统调用使用的函数原型
--
-init
-- 指明内存起始,虚拟盘,硬件初始化,任务 0 初始化
-kernel
-- 中断处理的门,进行堆栈保护,然后进入内部 c 语言处理函数
-- 中断处理 c 函数,trap_init(){set_trap_gate();}
-- 系统调用的入口_system_call:
-- 系统调用的 c 函数
--blk_drv
--chr_drv
--math
-lib
-mm
-tools
1.
对于形如#define __LIBRARY__
后面没有任何东西,用处何在???
观察文件 include/ 便可以看到#ifdef __LIBRARY__
2.
fork()函数产生新进程
新进程也应当是从当前地方 fork()之后开始执行。
3.
c 语言外部变量与外部函数
4.
系统调用,嵌入式汇编,内联函数,c 语言汇编相互调用,
?
变量定义是混合编程的基本问题。C 程序与汇编程序定义的变量相互之间可以进
行访问。在汇编程序中定义时,需要在变量前加下划线“_”,
定义为全局变量。在 C 程序中则需要说明为 extern 变量。
C 语言中常用的数组与指针也可以很方便地在汇编程序中定义并互相访问。如例,
定义占用 6*32 个字的全局变量_AC_RSLT,在 C 程序中被
说明成一个 6*32 的 16 位无符号数的二位数组。当然,在汇编程序中,数据的存
放格式需要满足 C 对二维数组数据存放格式的要求。即在存储器中,从低地址
到高地址,二维数组的内容从第一行起各行依次放入存储器中。实际上,这个数
组定义也可以看作是指针定义。
汇编程序:
_AC_RSLT .usect “ADDATA”, (6*32)
.global _AC_RSLT
C 程序:
extern INT16U AC_RSLT[6][32];
( extern INT16U *AC_RSLT; )
6.
调度实现原理
再系统状态中,进行 schedule()函数的调用
7.
每个程序都具有内核堆栈段和用户堆栈段
8.
boot 程序无法直接将程序直接挪到地址 0 处,原因是一开始数据从启动盘上移动
到内存中依靠的是 bios 的中断处理程序。而其中断向量表即存放在地址 0 处。
?
模拟中断返回动作,使用 iret 指令。
。
首先 bios 负责将内核的开始部分装入内存,然后 boot 负责装入其他部分,再是
模式下完成一些初始化,然后跳到程序开始出运行,设置中断处理程序,设
怀旧笔记 来自淘豆网m.daumloan.com转载请标明出处.