Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4066030
  • 博文数量: 251
  • 博客积分: 11197
  • 博客等级: 上将
  • 技术积分: 6862
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-05 14:41
个人简介

@HUST张友东 work@taobao zyd_com@126.com

文章分类

全部博文(251)

文章存档

2014年(10)

2013年(20)

2012年(22)

2011年(74)

2010年(98)

2009年(27)

分类: LINUX

2011-04-23 21:16:09

Linux环境下,在内核写程序限制很多,相比用户态程序:

n  不能使用C

n  不能使用系统调用

n  理解内核各个部分的实现原理及相关函数的机制及作用

n  熟悉内核使用的锁机制并仔细处理跟锁相关的细节

 

之前做过将一个用户态的加密库(包括AESRSA的实现)移植到内核态使用,主要涉及调试消息的打印,内存空间申请与释放,数据类型的转换,随机数的生成等问题。

 

没有printf,如何打印消息?

内核中可用printk函数来向将信息写到标准输出(或者日志文件)上,printk提供多种日志级别以适应多种不同的环境(如“调试消息”、“警告消息”、“紧急消息”)。

 

没有malloc,如何申请/释放内存?

内核栈的空间很小,通常接近两个物理页的大小,因此内核程序不能过度的使用栈空间,容易导致内核栈溢出。内核中提供kmallocvmalloc内存分配接口,kmalloc分配的内存在物理上连续,理论上有128KB大小的限制,其基于伙伴系统实现;vmalloc将一组非连续的物理页映射到连续的逻辑地址上,因此当需要获取大块内存时,需要使用到vmallloc

 

数据类型的转换

内核中定义了一系列的定长数据类型,如__u8, __s8表示八位的无符号和有符号数,__s32, __u32表示32位的无符号和有符号数,使用定长数据类型,可增强程序的移植性。

 

如何获取随机数

不能使用C库的rand()函数了,可从/dev/random/dev/urandom(收集系统的中断信息,这些信息都是随机产生的)文件中获取随机数。要想从这两个虚拟设备中读取数据,首先要解决如何在内核态读取文件的问题,该问题也可以扩展为如何在内核态使用系统调用,参见:http://blog.sina.com.cn/s/blog_6237dcca0100fb3y.html

 

阅读(4648) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~