Linux 用户态和内核态
来源:互联网 发布:mysql execreqforsql 编辑:程序博客网 时间:2024/05/17 07:37
1. 内存的申请和释放:
用户态下,可以使用malloc()和free()
内核态下,需要使用kmalloc()和kfree(), 原型如下:
void *kmalloc(unsigned int len, int priority);
void kfree(void *__ptr);
kmalloc的priority参数通常设置为GFP_KERNEL,如果在中断服务程序里申请内存则要用GFP_ATOMIC参数,因为使用GFP_KERNEL参数可能会引起睡眠,不能用于非进程上下文中(在中断中是不允许睡眠的)。
2. 内存互访
由于内核态和用户态使用不同的内存定义,所以二者之间不能直接访问对方的内存。而应该使用Linux中的用户和内核态内存交互函数(这些函数在include/asm/uaccess.h中被声明):
unsigned long copy_from_user(void *to, const void *from, unsigned long n);
unsigned long copy_to_user (void * to, void * from, unsigned long len);
copy_from_user、copy_to_user函数返回不能被复制的字节数,因此,如果完全复制成功,返回值为0。
include/asm/uaccess.h中定义的put_user和get_user用于内核空间和用户空间的单值交互(如char、int、long)。
3. 输出
在内核编程中,我们不能使用用户态C库函数中的printf()函数输出信息,而只能使用printk()。但是,内核中printk()函数的设计目的并不是为了和用户交流,它实际上是内核的一种日志机制,用来记录下日志信息或者给出警告提示。
每个printk都会有个优先级,内核一共有8个优先级,它们都有对应的宏定义。如果未指定优先级,内核会选择默认的优先级DEFAULT_MESSAGE_LOGLEVEL。如果优先级数字比int console_loglevel变量小的话,消息就会打印到控制台上。如果syslogd和klogd守护进程在运行的话,则不管是否向控制台输出,消息都会被追加进/var/log/messages文件。klogd 只处理内核消息,syslogd 处理其他系统消息,比如应用程序。
- Linux 用户态和内核态
- linux用户态和内核态理解
- Linux用户态和内核态
- linux用户态和内核态通信
- linux用户态和内核态理解
- linux的内核态和用户态
- Linux用户态和内核态
- Linux用户态和内核态
- linux用户态和内核态理解
- Linux用户态和内核态
- Linux用户态和内核态
- Linux用户态和内核态
- linux用户态和内核态理解
- linux用户态和内核态理解
- Linux用户态和内核态
- linux的用户态和内核态
- linux用户态和内核态理解
- Linux用户态和内核态
- Linux设备驱动 中的几个关键数据结构
- 勤动脑的名言警句
- linux 信号量使用实例
- 自旋锁与信号量
- c-tree数据库(c-treeACE)(6):服务端口
- Linux 用户态和内核态
- 《LINUX与UNIX SHELL编程指南》读后感
- 今天的收获--c#委托
- SVN简单配置(转载)
- 这两周的总结
- 关于ejb中的BMT和CMT
- 起风了
- Android 开发环境部署
- CCNA实验十七 交换机端口镜像