linux0-12
文章平均质量分 81
一枝春美食
这个作者很懒,什么都没留下…
展开
-
linux 0.12之boot启动过程从实模式变为保护模式的一些说明
本次讨论的是linux 0.12版本,在bochs模拟x86的环境下。 在bootsect和setup代码都是执行在16位的实模式下,而head是执行在32位的保护模式下,这两模式的切换在代码中是如何实现的,这里做一个总结。 在setup将system copy到地址0后,开始了cpu的模式转变。 第一步lidt idt_48 ! load idt with 0,0lgdt gdt_48 !原创 2015-06-17 12:20:12 · 1245 阅读 · 0 评论 -
linux 0.12之head.s跳转到main.c的说明
因为只有引导代码中使用了as86的编译器,linux0.12其他汇编都是基于GNU as汇编的,这是背景。 head.s是在gnu as下编译的,使用的是AT&T汇编模式。主要完成一些GDT的初始化,然后跳转到main.c函数执行,这两者如何顺利调用的,今天研究一下。 下面是linus给出的关键源码:after_page_tables: pushl $0 # These are the p原创 2015-06-23 20:11:29 · 1169 阅读 · 0 评论 -
linux0.12之main.c的工作流程分析
之前分析了head.s到main.c的跳转,下面看看mian.c的工作流程分析。 boot之后的执行代码是init目录下的main.c,执行初始化任务。研究一下 linus一开头就给出了四个内联静态函数static inline _syscall0(int,fork)static inline _syscall0(int,pause)static inline _syscall1(int,s原创 2015-06-18 08:54:31 · 669 阅读 · 0 评论 -
linux0.12之内核代码signal.c说明
首先理论理解一下 信号是一种“软件中断”处理机制。信号机制提供了处理异步事件的方法。 信号也叫软中断。注意,信号只是用来通知某进程发生了什么事件,并不给该进程传递任何数据。 内核代码中使用无符号长整型(32bit)编码信号,被定义在include/signal.h中typedef unsigned int sigset_t; /* 32 bits */#define _NSIG原创 2015-07-08 15:35:07 · 713 阅读 · 0 评论 -
linux0.12之内核代码之fork.c说明
在system_call.s中.align 2_sys_fork: call _find_empty_process testl %eax,%eax js 1f push %gs pushl %esi pushl %edi pushl %ebp pushl %eax call _copy_process addl $20,%esp1: ret这是系统fork入口,会调用两个原创 2015-07-06 14:08:29 · 1268 阅读 · 0 评论 -
linux0.12之内存管理(1)-整体框架思路
内存管理一直是本人比较佩服linus的地方。为此先看linux0.11版本,又看了0.12版本,基本思路一样,差异性会单独列出来。 本篇博客只是梳理一下大体思路,具体函数分析,放在后面的博客。一、 从实模式到保护模式谈起 1、简单讲实模式,是16位寻址的访问方式,保护模式是32位的访问方式。在linux0.12的启动代码中bootsect和setup是工作在实模式下,之后的所有代码都运行在保护原创 2015-06-29 21:45:24 · 522 阅读 · 0 评论 -
linux0.12之内核代码之『深入追踪fork函数』
在(1)中简单分析了内核中fork的实现,那从用户层去分析fork函数的实现。 目前已经知道这是一个系统调用函数,看看能不能找到fork函数原型,很不幸花了十分又十分钟,还是没有找到。 但是在内核init中的main.c有调用fork函数,就以此为线索吧。void main(void) /* This really IS void, no error here. */{ /* The原创 2015-07-09 08:55:36 · 1040 阅读 · 0 评论 -
linux0.12之内存管理(2)-再理解分段分页
分段是完成逻辑地址向线性地址的映射,这样对于用户任务而言,其寻址就是在4G的线性地址上面。 分页管理的目的是将物理内存页面映射到某一线性地址处。 线性地址对应的物理地址 上面是线性地址到物理地址的转换, linux的页目录和页表在head.s中设置,是在地址0放置页目录随后放置4个页表,这5个表是内核在内核空间映射的,任务0,是在内核中执行,所以任务0也是使用这个表,但是之后fork出来原创 2015-07-06 13:51:25 · 771 阅读 · 0 评论 -
linux0.12之内核代码之『深入追踪变参函数的实现』
在内核段要显示,需要printk.c函数集 看看printk这个函数int printk(const char *fmt, ...){ va_list args; int i; va_start(args, fmt); i=vsprintf(buf,fmt,args); va_end(args); console_print(buf); return i;}看看其中的变量以及函数原创 2015-07-14 22:07:07 · 584 阅读 · 0 评论