Linux中put_user和memcpy的区别

我在从事linux kernel开发的时候,知道user app和kernel模块之间传输数据不能使用memcpy,必须使用copy_to/from_user或是put/get_user。原因就是kernel和user app内存不能直接互访。仅仅明白到这个层次。具体为什么不能直接互访,也说不出什么来。

最近在ARM平台上开发,看了一下kernel中put_user的代码和关于linux kernel的资料,自己对这个问题的理解有加深了一些。现在总结如下

首先 Linux的kernel和user app运行在不同的模式。在ARM上就是kernel运行在SVC模式(最高级),App运行在user模式。当user app执行一个system call调用kernel代码,kernel会完成CPU的模式切换。SVC模式能访问的寄存器更多,如果在kernel中对user app传入的地址直接访问,可能会有以下问题:传入的地址是错误的,则kernel也可以访问,可能会破坏其他kernel内容,这会引起安全问题,memcpy不会进行地址检查,使用专用的put_user就会执行地址检查,判断是否是<0xc0000000,是否在user app地址空间之内。同时在ARM平台上,最后调用的函数是__put_user_1/2/4/8。这个是一个汇编函数,使用的数据访问指令为ldrbt,这个ARM汇编指令使用user mode来访问内存,如果这个访问非法,这会触发一个exception,在kernel中都加入了一个异常函数表,出现异常则调用__get_user_bad

个人感觉使用专用函数在kernel和user app之间传递数据就是为了安全,防止参数非法破坏kernel

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sdssly/archive/2009/07/29/4390949.aspx

你可能感兴趣的:(exception,linux,汇编,user,System,平台)