linux0.11之加载二进制文件

 

因为先接触的是嵌入式OS,所以在阅读linux0.11源码的时候,总是会带些嵌入式OS惯性思维在思考,关于linux0.11中用户入口是我从头到尾看的过程中一直思考和寻求的问题,我很想知道对于一个用户的例程或者行为,内核的处理流程。

先说下嵌入式OS,看嵌入式OS的时候我会在内核代码中看到一个用户API接口文件夹,里面封装了所有系统函数,供给用户调用,这样的一个接口形式非常清晰。嵌入式OS会提供main接口给用户插入自己的代码,比如创建进程,创建进程时指定入口函数就可以,这样创建进程后系统就会调度到该进程,就会从用户写的函数入口开始执行。很显然,用户例程和内核时编译在一起的。

Linux平台下通常说的用户API接口库是GLIBC,但是它不同内核一起编译,用户例程也一样。Linux平台下通常时这样的,用户用GLIBC提供的API接口编写了用户例程,编译好之后成为可执行文件,然后通过shell加载并运行。

从上面看来,shell加载运行可执行文件就是内核处理用户例程或者操作的关键所在了。

先贴上一个图来看一下内核对于shell的响应流程。这个时《linux0.11内核完全注释》中的一个截图。

这个图对应的代码这儿就不贴了。/bin/sh是一个可执行的linux外壳程序,内核加载并运行sh的过程如上所示,先fork一个进程,然后调用execve系统调用加载sh可知性文件,这个加载的过程参见do_execve函数执行,简单的说就是把刚刚fork的一个进程的上下文配置成sh的上下文,加载之后sh就开始执行了,sh进程可以说时用户与内核之间的桥梁,用户通过sh命令使得内核执行用户的例程。比如用户编写了一个hello.c,编译成可知性hellosh./hello命令则可以让内核执行hello了。这里我得强调下sh在这个过程中做的事情,sh会先fork一个进程,然后调用execve系统调用加载hello,这个过程跟sh被内核加载时一样的。Shhello都是可执行文件,内核加载一个shsh用来加载用户的可执行文件。

到了这里也就知道了,linux0.11中用户入口并不是main,而是 mian运行起的sh。用户例程也不和内核一起编译,内核通过加载用户可执行文件运行用户例程,所以,linux平台离不开文件系统。

 

带中文注释可成功编译运行的Linux0.11+Bochs2.62实验环境说明 此注释以网上获得的“linux带中文注释的0.11版本”为基础,对照赵炯博士《Linux内核完全注释(0.11) 》V3.0版(http://oldlinux.org/download/clk011c-3.0.pdf)编辑而成。作为对赵博士感谢,以及对Linux初学者的回馈,特发布在CSDN上。 此注释可以在http://oldlinux.org/Linux.old/bochs/提供的Linux-0.11-devel-XXXXXX实验环境下正确编译成功,使用:"make disk"命令重启Bochs虚拟机后,新编译源码直接生效,便于学习者直接阅读源码,直接进行实验。 注意事项: 1、为了使注释版与实验环境上的Linux0.11内核保持一致,达到对应文件可以互换的目的,与Linux0.11原始版本相比,加入了15个系统调用函数(参见include/Linux/sys.h第78-92行。赵博士原书没有这部分注释,我不敢班门弄斧),其它相关的文件加入了相应的定义。新加入的代码只有函数体定义,没有具体实现,对其它原始代码没有改变、没有影响。 2、键盘定义改成了美式键盘(原始代码中是芬兰键盘,会导致个别键出问题,调试的时候我曾被迷糊了好久,以为自己把程序搞乱了)。 3、把网上VC版的注释统一改成了 “/* */” 格式的注释。经测试,在Linux0.11实验环境中(gcc1.40),只有标准C注释语法可以正常编译。 4、由于《Linux内核完全注释(0.11) 》原书版本更新的原因,注释中提到的图、表可能与V3.0版书中不一致。 5、由于代码中加入注释,代码行号发生变化,注释中提到的代码行号会出现不一致,建议对照3.0版查询对应内容。 6、实验方法:请先安装附带的Bochs2.62版安装包,双击Test.bxrc即可启动实验系统,执行命令:sh t,即可完成对linuxcn的编译。 7、linux目录中是此实验系统中/usr/src/linux提取出来的不含中文注释的linux0.11源码(此版本比原始的0.11版多15个系统调用函数),linuxcn是加入了中文注释的源码。 8、diskb.img是实验系统与Windows环境下进行文件交换的1.44M软盘映像,执行脚本命令"sh t"时会自动从此映像中读取linux.tar、linuxcn.tar包,解包并编译,编译结果在:/usr/root/zw/linuxcn目录下。为了方便文件交换,建议使用7zip为压缩/解压缩工具(7zip可以直接生成tar包),用WinImage实现Windows环境与软件映像交换文件。 9、实验系统下 .profile中加入了几个命令,请读者注意。 10、若实验环境的启动盘被破坏,请用压缩包中的bootimage-0.11-hd覆盖对应文件即可。 11、若实验环境的要命文件系统被破坏,请用压缩包中的hdc-0.11-new.img覆盖对应文件即可。 2014-5-4 cyfx2288
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值