linux系统的系统调试.docxVIP

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

linux系统的系统调试

2系统调用修改

linux操作系统是一个专业的自由软件。它具有linux操作系统的功能。它的外部接口与linux操作系统非常相似,并且具有强大的网络功能。但Linux操作系统没有并行处理能力,要使其具有分布式并行处理能力,就必须扩充它的功能。

众所周知,用户作业只能在用户态下执行。而要迁移一个正在执行的用户作业,在用户层是没有办法做到的,必须进入核心态,在操作系统内核完成迁移进程的工作。因此,需要在Linux内核增加取进程数据和恢复进程数据代码。为了使增加的功能也能常驻内存,就要将这部分代码拼接到操作系统内核中,唯一的办法是重新编译连接内核源程序生成一个新的操作系统内核。将新内核拷贝到相应的目录,重新启动机器让增加的代码随着操作系统的重新调入也常驻内存。

在Linux操作系统中,由用户态程序进入操作系统内核只能通过系统调用。Linux的内核由几十个C语言(或汇编语言)程序文件组成,这些文件主要放在系统的/usr/src/linux的目录下,此目录下又有一些子目录,如kernel、mm、fs等。在此目录下增加一个与kernel并列的ssi子目录,用于存放扩充的系统调用C语言程序文件。同时,修改此目录下的Makefile文件,把新子目录ssi的有关信息加到这个文件中。这些工作做完后,在此目录下通过make命令编译、连接内核C语言程序源代码就可生成一个新的内核映象文件,它可包含新增的系统调用处理程序部分。为取进程数据和恢复进程数据,增加二条新的系统调用,它们的名字是sys-get-mtask和sys-put-mtask,其入口地址号分别为165和166。

操作系统原有系统调用名及有关信息放在两个文件中:一个是/usr/src/linux/arch/i386/entry.S文件;另一个是/usr/src/linux/include/asm/unistd.h文件。在entry.S中增加的二行内容是:

在unistd.h文件中也增加二行以表示这二个系统调用入口号。

这二条系统调用还有参数需要传递给内核,对这些参数的名称及它们的数据类型需要加上说明。这些系统调用有返回值,需要说明返回值的类型。为此又要增加二条说明,具体如下:

如果不修改gcc编译程序,在用户层程序中就无法使用sys-get-mtask、sys-put-mtask系统调用名调用新增的系统调用。但可以使用原来系统提供的系统调用函数stscall()带上新增系统调用入口地址号和相应的参数值就能调用这些新增系统调用函数了。

3虚拟地址的转化

现代操作系统都使用抽象存储模式管理内存。为了使转换比较容易,物理内存和虚拟内存都被分成大小相同的存储块,这就是页。Linux操作系统以每4(或8)Kbytes为一页。在Linux多用户分时操作系统上,每个程序的数据都由类似的虚拟地址控制着,即代码段、数据段的虚拟地址依次从十六进制数8048000开始向大地址方向连续编号;堆栈段虚拟地址编号从十六进制数c0000000开始向小地址方向扩展;库函数及其相关数据的虚拟地址从十六进制数4000000开始向大地址方向连续编号。每个进程的虚拟地址空间由一个vm-area-struct类型的结构(简称vm)连成的单向链表控制着。链表首结点的地址放在mm-struct类型结构(简称mm)的mmap指针成员变量中,该链表的每个结点控制着一片线性虚拟地址空间。只要找到进程的控制结构(taskstruct类型)task后,就可通过task找到mm结构,然后找到这条链表得到进程的所有虚拟地址编号。

Linux的虚拟地址由两部分组成:偏移量和虚拟页帧号。以4Kbytes一页为例,地址的0~11位表示页内偏移量,12位以上表示虚拟页帧号。每当处理机译码一条虚拟地址时,处理机必须求出偏移量和虚拟页帧号,且转换虚拟地址为物理地址,然后访问物理页中的单元。

Linux操作系统的内存管理分为三级:第一级是页目录,第二级是中间目录,第三级是页表。页表又由若干个页表项组成。存放三级目录的内存物理地址放在mm结构的pgd指针变量中。下面给出把虚拟地址转换成物理地址的算法。其中pgd-offset函数从vma所指结构找到mm结构,取出pgd成员变量的值,再加addr右移22位的值便得到页目录的地址;pmd-offset函数根据页目录找到页中间目录地址;pte-offset函数将addr右移12位(去掉0~11位)后再分离出右边10个二进制位(即原addr的12~21)的值,再加页中间目录中的值就得到页表项地址。在页表项中,右起第一位为1,表示此页在内存,则12位以上放着物理页的地址,0~11位放着这一页的属性;第一位为0表示此页不在内存,这时若右起第2位以上表示的数不为0,就说明这一页已放到对换区,为0表示

文档评论(0)

uyyyeuuryw + 关注
实名认证
文档贡献者

专业文档制作

1亿VIP精品文档

相关文档