自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(26)
  • 收藏
  • 关注

原创 linux内核分析之panic.c

#include #include void sys_sync(void);死机,内核出现重大错误volatile void panic(const char * s){ printk("Kernel panic: %s/n/r",s);        如果当前进程是第一个进程,是不能死机的 if (current == task[0])  printk("In swapper task

2008-09-30 09:44:00 2660

原创 linux内核分析之printk.c

#include #include #include static char buf[1024];extern int vsprintf(char * buf, const char * fmt, va_list args);内核打印函数,该函数调用了tty_write函数,该函数需要使用fs寄存器,指定为数据段寄存器,在调用前,需要将其入栈保存。int printk(const

2008-09-30 09:38:00 2369

原创 linux内核分析之vsprintf.c

#include #include 判断给定字符是不是0-9的数字#define is_digit(c) ((c) >= 0 && (c) 将给定数字字符串转换成整型static int skip_atoi(const char **s){ int i=0;  判断字符是不是数字,如果是数字就累加 while (is_digit(**s))  i = i*10 + *((*s)++)

2008-09-30 09:02:00 2540

原创 linux内核分析之sys.c

#include #include #include #include #include #include #include 这个文件中包含了绝大部分系统调用函数的实现,如果系统调用在该内核版本中没实现,就直接返回ENOSYSint sys_ftime(){ return -ENOSYS;}int sys_break(){ return -ENOSYS;}int sys_ptrac

2008-09-29 09:41:00 4356

原创 linux内核分析之fork.c

#include #include #include #include #include 申明外部调用函数,验证地址所指向的页面是否可写extern void write_verify(unsigned long address);全局变量,用于产生可用的进程idlong last_pid=0;对指定起始地址和长度进行验证void verify_area(void * addr,int

2008-09-27 21:53:00 2217 1

原创 linux内核分析之exit.c

#include #include #include #include #include #include #include int sys_pause(void);int sys_close(int fd);释放当前进程,对进程进行清理void release(struct task_struct * p){ int i;    如果待释放的进程指针为空,立即返回 if (!p)  

2008-09-25 23:13:00 2134

原创 linux内核分析之signal.c函数

该文件分装了信号处理函数#include #include #include #include 用volatile修饰符修饰函数,表示该函数不会返回,并且保证编译器不会给出告警volatile void do_exit(int error_code);取得当前进程被阻塞的信号掩码int sys_sgetmask(){ return current->blocked;}设置当前进程的

2008-09-23 21:39:00 2350

原创 linux内和分析之sched.c程序

该内核程序主要包含进程调度程序的实现。进程调度采用了基于优先级的时间片轮转算法。#include  #include  #include  #include  #include   #include   #include  #include   这是一个宏,用来取得信号的二进制数值。输入:信号编号,1-32输出:信号的二进制数值#define _S(nr) (1被阻塞的信号掩码,其中有

2008-09-20 20:02:00 5491

原创 linux内核分析之system_call.s

1. 系统调用处理底层程序,通过int 0x80进行系统调用2. 时钟,硬盘,软盘中断处理程序信号,子进程结束SIG_CHLD = 17定义了从系统调用返回时各个寄存器在堆栈中的偏移值(ret_from_sys_call)EAX  = 0x00EBX  = 0x04ECX  = 0x08EDX  = 0x0CFS  = 0x10ES  = 0x14DS  = 0x18EIP  = 0x

2008-09-15 21:14:00 5131

原创 linux内核之trap.c文件分析

该程序主要定义和实现了asm.s中所引用的各个硬件异常中断处理程序#include #include #include #include #include #include #include 取给定段以及偏移处的一个字节输出寄存器eax,输入寄存器eax,内存地址addr#define get_seg_byte(seg,addr) ({ /register char __res; /__a

2008-09-13 14:45:00 3268

原创 linux内核代码分析之asm.s

该文件主要是定义了CPU异常产生的中断函数的调用分成2类: 1. 带返回错误码的中断调用 2. 不带返回错误码的中断调用分别对应的符号为: 1. error_code: 2. no_error_code:.globl _divide_error,_debug,_nmi,_int3,_overflow,_bounds,_invalid_op.globl _double_fault,_coproc

2008-09-10 22:43:00 1734 1

原创 linux系统启动main.c分析

为了使用unistd.h中的宏,该宏用来进行系统调用,系统调用是通过0x80进行的,防止使用用户栈空间。#define __LIBRARY__#include #include 声明系统调用,采用内联的方式。fork系统调用static inline _syscall0(int,fork)pause系统调用static inline _syscall0(int,pause)setup系统调用s

2008-09-09 21:29:00 3114 1

原创 linux引导程序剖析(三)

该部分程序是在内核代码的开头部分,用来做一些初始化的操作,比如重新设置idt,gdt,设置页表等,最后将控制转移到内核的main函数。.text.globl _idt,_gdt,_pg_dir,_tmp_floppy_area这个标志是站位的,之后该程序会将页目录表存放在该处将head.s的开头部分覆盖。也就是说把页目录表放在内存最开始处。_pg_dir:程序开始startup_32: 段

2008-09-07 11:00:00 1074

原创 linux引导程序剖析(二)

为什么不一开始就把内核代码移动到0x0000处,是因为,在 setup.s程序中,我们需要利用BIOS提供的中断功能来加载 一些系统参数。而BIOS的中断向量表一开始存放在内存开始的 地方。 INITSEG  = 0x9000 ! we move boot here - out of the way SYSSEG   = 0x1000 ! system loaded at 0x10000 (655

2008-09-06 21:13:00 658

原创 linux引导程序剖析(一)

注释版权:Gilbert Wang!! SYS_SIZE is the number of clicks (16 bytes) to be loaded.! 0x3000 is 0x30000 bytes = 196kB, more than enough for current! versions of linux!SYSSIZE = 0x3000.globl begtext, begdata,

2008-09-06 21:12:00 727

原创 Inclusive Makefile

以前项目中,我都用Recursive Make去构建编译环境。这种方式感觉直观,而且单一,仅仅用Makefile就可以完成,但是不足之处是,扩展起来麻烦,数据定义和规则耦合在一起,并且每执行一次子Make都要step到那个目录。耗时。最近发现在北电的项目中,使用了一种叫做Inclusive的Make。完全摒弃了Recursive的缺点。尤其是在定义和规则相分离上优势明显,并且扩展起来很方便。项目中

2008-09-06 21:08:00 856

原创 各种段的特权级检查

数据段的特权级检查: 当访问数据段中的操作数的时候,需要把数据段的段选择符加载进段寄存器,比如DS,SS,ES,FS,GS。处理器需要进行特权级检查:        DPL>= RPL 并且 DPL>=CPL,CPL取max(CPL,RPL) 当访问堆栈段时,应满足: DPL = CPL = RPL,CPL不改变 代码段之间进行跳转的特权级检查: 对于非一致性代码段的检查,应该满足:       

2008-09-06 21:03:00 669

原创 保护模式内存管理总结

保护模式内存管理部分,大致分为两大部分,它们分别是分段机制和分页机制。我们知道80386+的系统,地址总线位宽是32位,那么能直接寻址的能力可以达到4G。段寄存器CS,DS,SS仍然是16位的,如何利用16位的段寄存器来寻址4G的空间呢?这个就是保护模式所要解决的问题。对于实模式,段寄存器中存放的直接是段基址,左移4位后,加上偏移地址就形成了物理地址,送地址总线。因此,在这种模式下,最大的寻址空间

2008-09-06 21:02:00 732

原创 CPL、RPL、DPL的区别

CPL、RPL、DPL的区别         CPL(Current   Privilege   Level) 当前(代码)特权级。在保护模式下,CS寄存器、SS寄存器中分别存放着代码段、堆栈段的选择子。CPL在CS、SS的第0、1位(第0位到15位)中。CPL一般情下等于所装载的段的特权级。对于一致代码段来说,CPL不会随着所装载的段的特权级而改变。         DPL(Descriptor

2008-09-06 21:01:00 906

原创 内联汇编总结

内联汇编是指在高级语言中嵌入汇编语言片段,通常和C/C++语言连用。格式如下所示: __asm__ __volatile__ (        “汇编语句” ………… :输出参数列表:输入参数列表:使用的寄存器列表 ); 注意: 1.使用的寄存器列表,不包含输入输出列表中的寄存器. 2.使用的寄存器应该用双%号表示。 3.每一行结束使用/n/t分隔。 4.一些常用的寄存器加载代码:a(eax),b

2008-09-06 21:00:00 802

原创 Linux通过0x80进行系统调用

系统调用:操作系统分为用户态和核心态,当用户调用用户态函数的时候,需要进行用户态到核心态的切换,CPU需要对现场进行保存。如果用户直接调用系统调用,就不需要进行二态切换,提高代码运行效率。并且编译链接后生成的可执行的ELF体积小,运行效率高。用户可以通过系统提供的C语言API进行系统调用,同时也可以通过0x80中断进行调用。下面介绍通过中断进行调用的方法。参数传递:功能号和返回值通过%eax来传递

2008-09-06 20:59:00 1475

原创 常用的GCC编译选项总结

-v    (在标准错误)显示执行编译阶段的命令.同时显示编译器驱动程序,预处理器,编译器的版本号. -pipe    在编译过程的不同阶段间使用管道而非临时文件进行通信.这个选项在某些系统上无法工作,因为那些系统的 汇编器不能从管道读取数据. GNU的汇编器没有这个问题.-nostdinc    不要在标准系统目录中寻找头文件.只搜索`-I选项指定的目录(以及当前目录,如果合适).-nostd

2008-09-06 20:58:00 1186

原创 8259A PIC 总结

处理器与外设的数据通信,一般有三种方式:程序直接I/O、中断以及DMA方式。外设一般包含3种类型的寄存器,他们是数据寄存器、状态寄存器和控制寄存器。数据寄存器是用来传送数据的,状态寄存器用于查询设备状态,而控制器存器用来发送命令控制外设工作。程序直接I/O,意味着程序中需要直接同这三类寄存器进行交互。程序需要去查询设备的状态,这样不能充分的利用CPU。而DMA方式则是DMA控制器向CPU发出总线使

2008-09-06 20:56:00 1248

原创 参数传递总结

参数传递大概有3种方式,它们是:通过寄存器传递、通过地址表传递以及通过堆栈传递。用得最多的是第三种传递方式。1.         通过寄存器传递参数。优点:简单易用。缺点:寄存器数量有限,所以传递参数个数有限例子:SUB_CODE SEGMENT       ASSUME CS:SUB_CODE       SUBPROG PROC FAR              PUSH AX        

2008-09-06 20:53:00 861

原创 80x86常用指令总结

1.    数据传送指令 MOV,MOVSX,MOVZX 不能直接在存储器之间,段寄存器之间传送数据,必须通过通用寄存器。目的操作数不能是立即数寻址。指令不影响标志位。 PUSH,POP 操作数可以是立即数、存储器、寄存器中的任何一种寻址方式,但是POP指令不能是CS寄存器。不影响标志位。 2.         地址传送指令 LEA 将原操作数的有效地址送到目的寄存器。 LDS,LES,LFS,L

2008-09-06 20:48:00 1285

原创 汇编实现c语言标准库函数

extern "C" void _cdecl MyStrcpy(char * src,char *dest);extern "C" int _cdecl MyStrlen(char * src);extern "C" int _cdecl MyStrcmp(char * src,char * dest);extern "C" int _cdecl MyStrchr(char * src,char

2008-09-06 20:30:00 1354

Kafak技术原理介绍

Kafak技术原理介绍

2024-02-24

INNODB关键技术原理以及MYSQL常用规范

技术分享

2022-10-20

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除