linux0.11内核之copy_strings()

   研究内核也两三个月了,今天读了个copy_strings(),晚上没啥事,写写心得:

   这个函数是用来复制指定个数的参数字符串到参数和环境变量中的,它的一大特点是用到了许多get_ds()和

get_fs_long()等函数,它们的定义在segment.h文件中。首先设置new_fs,old_fs,是为from_kmem服务的,如果

from_kmem == 1或者2,则设置fs指向内核空间,否则指向用户空间。如果指向内核空间,不要忘记在函数返回时将fs还原回去。在copy_strings()函数之前fs曾被设置为指向用户空间(sys_call.s中的_system_call:z)。

   下面我们来看看这个函数的重点(我认为的),tmp = (char *)get_fs_long(((unsiged long *)argv)+argc),argv 参数指针数组,argc参数个数,若如图,则argv+argc指向0x223c,get_fs_long()这个函数是用来读取fs段中指定地址处的4字节长度,于是我们便得到了0xabcd,tmp也就变成了指向地址0xabcd的地址变量(指针),之后我们设len = 0;,然后进入循环,再一次执行get_fs_byte(tmp++)函数,该函数取地址0xabcd处的字节,于是得到一个字符,依次循环,因为串是以NULL为结尾的,所以可以退出循环。退出循环后,我们便得到了该参数的长度,以此长度为基础,我们又进入了一个while(len)循环,上来一个if(--offset < 0)因为offset = 0;在前面已经设置过了,所以if判断语句为真,进入offset = p % PAGE_SIZE;,这条语句设置在一个页面中(PAGE_SIZE)的当前那指针

偏移量,它和后面的p / PAGE_SIZE,相辅相成,p / PAGE_SIZE计算出来的是走过了多少个页, p % PAGE_SIZE计算出来的是,下一个页内p的位置,也就是页内偏移offset.后面的就没什么了。时间不早了,睡了。    

 

 

 

 

 

 



 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值