Advertisement

关于get_ds, set_fs, get_fs函数的使用

阅读量:

深入的阐述可供参考:https://wenku.baidu.com/view/ae7f2e7576c66137ef061903.html?re=view

当编写Linux内核代码时

get_ds获得kernel的内存访问地址范围(IA32是4GB),

get_fs是取得当前的地址访问限制值。

set_fs是设置当前的地址访问限制值

一个进程从用户态迁移至核心态时,在task_struct结构中的成员addr_limit也会随之发生变化。具体来说,在用户态时 addr_limit设置为0xBFFFFFFF(相当于3GB的虚拟内存空间),而在核心态则被设置为0xFFFFFFFF(扩展了1GB的有效地址范围)。这些函数的设计目的是为了确保系统的安全性,并且会通过检查来保证逻辑的一致性。当调用set_fs(KERNEL_DS)函数时,默认跳过这些安全检查以提高性能效率

下面是典型用法:

//#define VersionControlFlag
//#define CoreKernel
//#define UserModule
#include <linux/unistd.h>;
#include <linux/init.h>;
#include <linux/module.h>;
#include <linux/kernel.h>;
#include <linux/file.h>;
#include <linux/fs.h>;
#include <linux/sched.h>;
#include <asm/uaccess.h>;
#include <asm/processor.h>;

int init_module(void)
{
struct file *fp = NULL;
char buf[100];
int i;

循环变量i从0开始一直到99次迭代,
将数组buf的第i个元素置零,
然后调用printk函数以显示警报信息:"Hello ,ftyjl.\n";
接着通过内核的open函数打开文件/filename/8899,并指定文件权限为可读( flags=3 )以及不可执行( mode=0 ),返回文件指针fp;
如果返回值为NULL,
则会打印警报信息"filp_open error ,ftyjl.\n";
随后设置当前执行环境为内核态,
以便后续操作正常进行;
接下来使用fp->f_op->read()方法来真正读取数据到buf中,
并记录读取的位置信息fp->f_pos;
最后恢复之前的执行环境并打印读取结果到缓冲区的内容:"ftyjl:read[%s]\n" % buf;

通过 printk 函数输出警报信息 'end of Hello ,ftyjl.\n';
函数返回0作为退出码;
cleanup_module 函数结束执行后会调用 printk 函数输出告别信息 'Good bye, ftyjl\n';

MODULE_LICENSE("Proprietary");

全部评论 (0)

还没有任何评论哟~