随笔分类 - 嵌入式之深入浅出Hello World
摘要:首先的感谢那些无私奉献的大牛们,深入Hello World下载地址在http://blog.linux.org.tw/~jserv/archives/001844.html。在上面 还有源码的下载地址链接,同时还要感谢那些网上的勤勤恳恳写blog的bloger们。 Hello World是学习程序设计语言的第一个程序浅出 Hello World。我们试图分析自linux上的Hello World运行的整个过程,主要 包括下面的几个过程: 1.hello程序的编译链接过程和hello上可执行文件格式 2.hello可执行程序的加载及如何开始执行 3.hello在内存中镜像 4.寻址 5.调度程序
阅读全文
摘要:卸载hello程序现在再来看看我们的Hello World程序:#include <stdio.h>int main (){ printf ("hello world\n"); return 0;}在进程运行结束后,我们会显示的调用exit()或者return退出正在运行的进程,如果调用return的话,编译器会自己加上exit().此时,保存子进程的一部份信息是很有必要的,因为父进程可以读取这些消息而取得子进程的退出状态.如果子进程退出.但父进程没有用wait(),这就成为了我们常说的僵尸进程,exit()系统调用在内核中的相应接口为sys_e
阅读全文
摘要:应用进程1内核空间用户空间 应用进程2内核空间用户空间 物理RAM有内核空间共享 物理RAM,对应进程1对应进程2 应用进程1内核空间用户空间 应用进程2内核空间用户空间 物理RAM有内核空间共享 物理RAM,对应进程1对应进程2 系统调用实现参考文章:http://docs.huihoo.com/joyfire.net/6-1.html操作系统为在用户态运行的进程与硬件的通信提供了一组接口,然而用户进程是不能直接和硬件交互的,而是通过系统调用来实现和硬件的交互。首先来说明的是“用户态”和“内核态”。http:/
阅读全文
摘要:开始”映射“之旅,在上面的讲解中经常提及到“”映射“的概念,那到底什么是映射?一个线性区可以和磁盘上的某个文件关联或者是某个文件的一部分来关联,这也就意味着内核把线性区的访问页内某个字节的访问转换成对于文件的中相应页面的访问,这种技术称之为“内存映射”。使用strace hello得到:...open("/usr/lib/locale/en_AU.UTF-8/LC_TIME", O_RDONLY) = -1 ENOENT (No suc
阅读全文
摘要:这里开始分析hello中的一个寻址过程的实现。当然现在的情景是:(当然可能只是一小部分加载到了内存中,大部分的需要使用缺页异常处理来实现内存分配)。在sys_exece()函数中,在内存ram中保存了命令行参数,环境参数,但是代码段,数据段,bss段,可执行文件的其他段提供”映射“(映射的具体含义参见"深入理解Hello World 3"),此时文件到虚存的映射仅仅是建立了一种映射关系,也就是说,虚存页面到物理页面之间的映射还没有建立。在说明内存寻址 之前,先来看看进程是如何管理虚拟地址,然后开始说明在没有缺页的情况下,保护模式下的寻
阅读全文
摘要:现在的假设是:hello可执行文件已经存在于磁盘上(存储介质上),并且在可执行文件中包含了被执行的text,同时也包含了这些目标代码使用的数据,同时上面的分析可得,在elf中定义的只是虚拟的地址(linux中对于每个process的话,否有4GB的虚拟地址空间,当然这些地址只是virtual的,真正的数据的存储还是在实际的ram中,OS提供虚拟存储空间主要是为了能够在ram容量较小的机器中运行一些占用内存较大的应用程序)。下面开始今天的旅行。假设你在shell中键入:./hello,shell创建一个新的进程,新的进程又使用系统调用sys_execve(),sys_execve()系统调用首先
阅读全文