博文

目前显示的是 一月, 2010的博文

Linux 系统内核初始化过程

转载自: http://linux.chinaunix.net/bbs/ 一、对硬件数据结构的初始化过程。 1、系统首先调用 printk() 函数在屏幕上打印 Linux 内核版本号和编译内核所使用的 gcc 编译器版本号、启用时间等,如果这个过程失败,将显示一个参考信息给用户。 2、调用 arch/i386/kernel/setup.c 中的 setup_arch() 函数,初始化系统主板上各个集成电路控制器,最后在 command line、memory_start 和 memory_end 中返回结果。 获取外设的参数。将硬盘、鼠标、显示器、根设备的主从设备号、高级电源管理以及总线类型等参数, 写入相关的内存单元。 如果设置了 RAM盘,则把各参数写入相应的内存单元。 设置 init_task.mm 代码结构在内存中的起点和终点以及数据段的终点。 把命令行参数拷贝到 save_command_line 变量。分析、排除 “mem=”形式的命令。获取 CPU类型,以判断是否支持扩展分页,即允许页框大小为 4MB的页。调整内存边界参数 start_mem 。 调用 reguest_region() 函数为主板上的 I/O芯片申请I/O内存使用空间。这些集成芯片是 timer定时计数器、DMA控制器1、DMA控制器2以及协处理器 fpu。 3、调用 arch/i386/init.c 中的 paging_init() 函数初始化内核页表。它实现的功能如下: 调整 memory_start 按下一个可用页边界对齐。 对临时页目录表项中的第 0 个目录项清零,这样就将从 0 开始的最初 4MB 的线性地址和物理地址消除,以便使用户可使用0 到 4194303 之间的线性地址空间。 初始化页目录的第0项到768项以及各个目录项对应的页表表项。 4、调用 arch/i386/kernel/trap.c 中的 trap_init() 函数中对中断描述符表IDT进行初始化。为了使用异常处理,trap_init() 函数将处理异常的函数地址的选择符写入 IDT的陷阱门描述符中。这些门的设置时由 set_trap_gate() 和set_system_gate() 函数来完成的。 5、调用 arch/i386/kernel/irq.c 中的 init_IRQ() 函数。设置基准时

笔记

QEMU uses SDL for it’s output (video as well as sound), and you need to run QEMU in an X Window session. There is an option to the qemu binary called -nographic that you can use to circumvent the X session requirement, but you still need the X and SDL libraries installed on your system. Typically, you would use -nographic for a virtual machine you’ve already installed previously, and that allows remote access through SSH, VNC or XDMP, and where you no longer need the virtual machine’s local console. FrameBuffer的原理   FrameBuffer 是出现在 2.2.xx 内核当中的一种驱动程序接口。   Linux是工作在保护模式下,所以 用户态进程是无法象DOS那样使用显卡BIOS里提供的中断调用来实现直接写屏 , Linux抽象出FrameBuffer这个设备来供用户态进程实现直接写屏 。Framebuffer机制模仿显卡的功能,将显卡硬件结构抽象掉,可以通过Framebuffer的读写直接对显存进行操作。用户可以将Framebuffer看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写操作,而写操作可以立即反应在屏幕上。这种操作是抽象的,统一的。用户不必关心物理显存的位置、换页机制等等具体细节。这些都是由Framebuffer设备驱动来完成的。       但Framebuffer本身不具备任何运算数据的能力,就只好比是一个暂时存放水的水池.CPU将运算后的结果放到这个水池,水池再将结果流到显示器.中间不会对数据做处理. 应用程序也可以直接读写这个水池的内容.在这种机制下,尽管Framebuffer需要真正的显卡驱动的支持,但所

笔记

TUN/TAP:是操作系统内核中的虚拟网络设备。不同于普通靠硬件网路板卡实现的设备,这些虚拟的网络设备全部用软件实现,并向运行与操作系统上的软件提供与硬件的网络设备完全相同的功能。 TUN:等同于一个以太网设备,它操作第二层数据包如以太网数据帧 TAP:模拟了网络层设备,操作第三层数据包比如IP数据封包 操作系统 通过TUN/TAP设备向 绑定该设备的用户空间的程序 发送数据,反之, 用户空间的程序 也可以像操作硬件网络设备那样,通过TNU/TAP设备发送数据。在后种情况下,TUN/TAP设备向 操作系统的网络栈 投递(或“注入”)数据包,从而模拟从外部接受数据的过程。   ------ 基于优先级抢占式调度 :系统中每个任务都有一个优先级,内核总是将CPU分配给处于就绪态的优先级最高的任务运行。如果系统发现就绪队列中有比当前运行任务更高的优先级任务,就把当前运行任务置于就绪队列中,调入高优先级任务运行。系统采用优先级抢占方式进行调度,可以保证重要的突发事件及时得到处理。

读书笔记

图片
嵌入式BootLoader技术内幕: 嵌入式系统从软件层次上包括4个部分: 1. 引导加载程序。 包括固化在固件(firmware)中的 boot 代码(可选),和 Boot Loader 两大部分。 2. Linux 内核。 特定于嵌入式板子的定制内核以及内核的启动参数。 3. 文件系统。 包括根文件系统和建立于 Flash 内存设备之上文件系统。通常用 ram disk 来作为 root fs。 4. 用户应用程序。 特定于用户的应用程序。有时在用户应用程序和内核层之间可能还会包括一个嵌入式图形用户界面。常用的嵌入式 GUI 有:MicroWindows 和 MiniGUI 懂。     引导加载程序是系统加电后运行的第一段软件代码. 以PC机为例,PC 机中的引导加载程序由 BIOS(其本质就是一段固件程序)和位于硬盘MBR(Main Boot Record 主引导记录--位于硬盘第一个分区第一个个扇区前512个字节)中的OS Boot Loader(比如,LILO和GRUB等)一起组成。BIOS 在完成硬件检测和资源分配后,将硬盘 MBR 中的Boot Loader读到系统的RAM 中,然后将控制权交给OS Boot Loader。OS Boot Loader 的主要运行任务就是将内核映象从硬盘上读到 RAM 中,然后跳转到内核的入口点去运行,也即开始启动操作系统。 而在嵌入式系统中,通常并没有像BIOS 那样的固件程序(注,有的嵌入式 CPU 也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由Boot Loader来完成。比如在一个基于ARM7TDMI core的嵌入式系统中,系统在上电或复位时通常都从地址0x00000000 处开始执行,而在这个地址处安排的通常就是系统的Boot Loader程序。 Boot Loader 的 stage1 通常包括以下步骤(以执行的先后顺序): 硬件设备初始化。 为加载Boot Loader的stage2准备RAM 空间。 拷贝Boot Loader的stage2 到RAM 空间中。 设置好堆栈。 --为stage2执行C语言代码作好准备 跳转到 stage2的C入口点。 Boot Loader的stage2 通常包括以下步骤(以执行的先后顺序): 初始化本阶段要使用

ubuntu 9.04 启动后进入字符界面

图片
因为在ubuntu下面要做一些实验,所以在windows的VMware虚拟机里面安装了ubuntu 9.04 桌面版。我机器本身配置不高,迅驰1.6CPU,512MB内存,共享显存。所以如果也在虚拟机里面启动桌面的话,会相当影响HOST OS的性能。于是,边让其在字符界面下工作。 但在网上尝试了很久,有两种方法,第一:在/etc/目录下面加入inittab文件,让其默认运行在level 3目录下面,然后把/etc/init.d/rc3.d/目录下面含有S13gdm的文件删除,这样就可以登录到文本界面了。----这种方法,我尝试了,不行!不是因为我的不是gnome界面,不知道是什么就是不行,这种方法在网上最泛滥。很多博客里面都是这样copy来copy去,而并没有去切身实践过,唉,网络有利有弊啊~。其实我们发帖是应该负责任的,不应该制造网络垃圾~ 第二种方法是安装rcconf,这样的话讲要启动的gdm服务关掉,我觉得这种方法应该是可行的,就像windows下面,msconfig命令的作用一样,可以定制我们要启动的服务,但我apt-get install rcconf或者是zhconf都没有找到,可能是我没有加入那么多的源的原因吧。 -------下面的这种方法,仅仅适用于“在启动的时候,不会看见图形画面”并不能不进入图形桌面----------- 第三种方法是将/boot/grub/munu.lst的文件里面,启动项里的splash去掉。 综上,用第二种方法应该是最好的。 我觉得这种方法最安全,最简洁,最实用!因此,建议网友们用这种方法来达到我们的目的。

10年第一天

图片
今天是2010年的第一天,唉,发觉人年龄一大,一年一年感觉怎么就有点悲壮呢。上午快9点的时候才起床,然后就发觉外面竟然下起了小雨。本来是先准备去图书馆还书,然后就回宿舍整开题报告。但图书馆今天很显然是放假了,而我还想去尝试一下。回宿舍,其实也没心情搞开题报告,主要是前天太受打击了。整个什么都不是,说话语言还没有组织好,结结巴巴,搞得老板很不爽,我当然也不希望这样咯,可是29号之前一直在准备随机过程的考试,哪有心思搞这个啊。因此就突击了一下,也难怪,我本以为没什么好说的,都写在幻灯片上了,大家都知道,但还是需要表达一下才好。而且,开题的时候,金老板是不知道我们准备的这个东西的。操,TNND,搞个开题就给学生这么大的压力,何苦来哉!~ 看了一会儿网队的比赛录像,然后就看看黄蜂和火箭的比赛录像。阿联现在打球确实不赖,不过老感觉他在网队的地位还不巩固,因为,他虽然出手次数多,是因为,每一次拿到球,他是一定要往篮上走的,中间搞策应,是绝对不会想到他的,看着他在场上跑来跑去心里怪不舒服,谁叫他是咱家的孩子呢。 下午的时候睡起来,就搞了一会儿PPT,然后就下去转了转。 晚上来实验室把剩下的,需要上网查的资料给补齐,然后就准备怎么用语言描述吧。 刚刚发现,北邮的一位大四本科生竟然自己搞了一个Linux.真是NB啊。看来北邮人论坛上N人还是蛮多。 http://forum.byr.edu.cn/wForum/disparticle.php?boardName=Linux&ID=86094&pos=7   从这位小x兄的观点看,我还是操作系统育红班的水平啊,赶紧升级~! 发一张美图