kstrdup函数功能描述:kstrdup( )函数的功能是为常量字符串s分配内存空间并将该字符串拷贝到所分配的地址空间中。

kstrdup文件包含

#include

kstrdup函数定义

在内核源码中的位置:linux-3.19.3/mm/util.c

函数定义格式:

char *kstrdup(const char *s, gfp_t gfp)

kstrdup输入参数说明

s:待分配内存空间的字符串。

gfp:分配模式,其取值及含义参考kmalloc( )函数的分析。

kstrdup返回参数说明

返回值指向为字符串所分配的内存空间的起始地址。

kstrdup实例解析

编写测试文件:kstrdup.c

头文件及全局变量声明如下:

#include

#include

#include

MODULE_LICENSE("GPL");

static int __init kstrdup_init(void);

static void __exit kstrdup_exit(void);

模块初始化函数:

int __init kstrdup_init(void)

{

char * temp;

const char *s = "hello world! "; //定义一个常量字符串

char * addr = kstrdup( s, GFP_KERNEL); //调用函数,分配模式为GFP_KERNEL

printk("addr = 0x%lx\n", (unsigned long)addr); //将字符串s拷贝到内存中的起始地址

printk("*addr = %c\n", *addr); //输出第一个字符

printk("*addr+4 = %c\n", *(addr+4)); //输出第五个字符

for(temp = addr; *temp ! ='\0'; temp ++) //循环地址中的字符值

printk("%c", *temp);

printk("\n");

return 0;

}

模块退出函数:

void __exit kstrdup_exit(void)

{

printk("exit ok! \n");

}

模块初始化及退出函数调用:

module_init(kstrdup_init);

module_exit(kstrdup_exit);

实例运行结果及分析:

首先编译模块,执行命令insmod kstrdup.ko插入模块,然后执行命令dmesg -c,会出现如图所示的结果。

结果分析:

该测试程序中定义了一个常量字符串char * s = “hello world! ",将其作为参数传递给kstrdup( )函数,目的是为该字符串分配一个内存空间,并将其拷贝到该内存空间中。然后输出addr的值可看到所分配的内存空间的起始地址,再输出地址偏移为0和4处的内容,依次为’h’和’o',最后循环输出地址中的字符值,为“hello world! ”,可知原字符串已经被分配空间,并且成功完成拷贝。

strdup linux,内存管理 – Linux内核API kstrdup相关推荐

  1. Linux内存管理Linux Memory Management Notes

    Linux 内存基础 地址类型 linux内核中有许多种不同的地址类型 用户虚拟地址 用户空间看到的常规地址,通过页表可以将虚拟地址和物理地址映射起来 物理地址 用在cpu和内存之间的地址叫做物理地址 ...

  2. MySQL 调优基础:Linux内存管理 Linux文件系统 Linux 磁盘IO Linux网络

    http://www.cnblogs.com/digdeep/category/739915.html

  3. 高端内存映射之kmap持久内核映射--Linux内存管理(二十)

    日期 内核版本 架构 作者 GitHub CSDN 2016-09-29 Linux-4.7 X86 & arm gatieme LinuxDeviceDrivers Linux内存管理 在内 ...

  4. Linux内存管理 (4)分配物理页面

    专题:Linux内存管理专题 关键词:分配掩码.伙伴系统.水位(watermark).空闲伙伴块合并. 我们知道Linux内存管理是以页为单位进行的,对内存的管理是通过伙伴系统进行. 从Linux内存 ...

  5. linux内存段页,linux内存管理-段式和页式管理

    该博文参考国嵌视频和http://www.cnblogs.com/image-eye/archive/2011/07/13/2105765.html,在此感谢作者. 一.地址类型 物理地址:CPU通过 ...

  6. Linux内存管理之slab 2:slab API

    Linux内存管理之slab 2:slab API 0. 前沿/须知: 1. kmem_cache_create 1.1 kmem_cache_create (仅分配一个kmem_cache实例)未分 ...

  7. Linux内核分析(三)----初识linux内存管理子系统

    原文:Linux内核分析(三)----初识linux内存管理子系统 Linux内核分析(三) 昨天我们对内核模块进行了简单的分析,今天为了让我们今后的分析没有太多障碍,我们今天先简单的分析一下linu ...

  8. 关于linux内存管理相关的内核参数

    最近闲来无事,就打算整理一下linux内存管理相关的内核参数,以便以后查阅使用.在整理的过程中除了参考内核文档Document/sysctl/vm.txt之外,更多的是参考网上的各位大神写的资料,大部 ...

  9. 万字整理,肝翻Linux内存管理所有知识点【Linux内核开发人员必学】都是精髓

    Linux的内存管理可谓是学好Linux的必经之路,也是Linux的关键知识点,有人说打通了内存管理的知识,也就打通了Linux的任督二脉,这一点不夸张.有人问网上有很多Linux内存管理的内容,为什 ...

  10. Linux内存管理初探

    linux内存是后台开发人员,需要深入了解的计算机资源.合理的使用内存,有助于提升机器的性能和稳定性.本文主要介绍linux内存组织结构和页面布局,内存碎片产生原因和优化算法,linux内核几种内存管 ...

最新文章

  1. Python 类对象及属性内置方法 classmethod、delattr、dir、hasattr、getattr、callable
  2. SQL中CONVERT转化函数的用法
  3. c语言 中insert变量值,c – 在VS2010中的vector :: insert执行意外结果
  4. 1、请简述DNS的作用,并说明当你输入网址“www.nxtc.edu.cn“按下回车后,DNS是怎么工作的?(关键步骤可以给出相应图示) 2、详细描述域名劫持攻击的过程及防御方式。
  5. R语言观察日志(part1)--subset函数
  6. 注入点批量收集工具_原来微信群也是能够批量管理的,学到了
  7. 生成器案例,#采集日志
  8. HTTPS协议的简述
  9. AIR Android开发--APK结构详解
  10. Linux面试题(34道)
  11. ARM交叉编译工具链
  12. gg修改器修改内购_GG入门学习第六课:GG的防闪
  13. EditText实现输入自定义表情
  14. 【BI工具支持的数据源对照表(帆软/PowerBI/永洪/观远)】
  15. Codeforces Global Round 8
  16. Servlet.service() for servlet SpringMVC threw exception ---- java.lang.NullPointerException
  17. 【JZOJ4883】【NOIP2016提高A组集训第12场11.10】灵知的太阳信仰
  18. 力回馈方向盘测试软件,真假如何辨?力反馈方向盘深度剖析
  19. 22下教师资格证面试备考攻略
  20. 【超实用】爬取2000+免费PPT模板(新手向)

热门文章

  1. 上面两点下面一个三角形_【人人都能欣赏的数学证明】为什么三角形的三个内角相加是180度?...
  2. .desktop 桌面快捷_两个按键:手机截屏且保存至电脑桌面
  3. 水利工程中计算机软件用到什么,水利工程设计中计算机技术的应用论文
  4. Vue教程20:Vuex入门
  5. Oracle中ORACLE_SID,INSTANCE_NAME,DB_NAME几个名词的区别
  6. 【Selenium】1.介绍 Selenium
  7. sqool导出oracle数据
  8. 虚拟目录下apache点击报The requested URL* was not found on this server.
  9. 在向服务器发送请求时发生传输级错误。
  10. 通过 Socket 实现 TCP 编程入门