linux安全体系分析与编程pdf下载,linux内核printk调试(摘录《Linux安全体系分析与编程》)...
asmlinkage long sys_syslog(int type, char __user * buf,
int len)
{
return do_syslog(type, buf, len);
}
int do_syslog(int type, char __user *buf, int len)
{
unsigned long i, j, limit, count;
int do_clear = 0;
char c;
int error = 0;
error = security_syslog(type);//检查是否调用这个函数的权限
if (error)
return error;
switch (type) {
case 0:/*关闭日志*/
break;
case 1:/*打开日志*/
break;
case 2:/*读取日志信息*/
error = -EINVAL;
if (!buf || len < 0)
goto out;
error = 0;
if (!len)
goto out;
if (!access_ok(VERIFY_WRITE, buf, len)) {//验证是否有写的权限
error = -EFAULT;
goto out;
}
//当log_start - log_end为0时,表示环形缓冲区无数据可读,把当前进程放入
等待队列log_wait
error = wait_event_interruptible(log_wait,(log_start - log_end));
if (error)
goto out;
i = 0;
spin_lock_irq(&logbuf_lock);
while (!error && (log_start != log_end)
&& i < len) {
c = LOG_BUF(log_start);//从环形缓冲区得到读取位置log_start
log_start++;
spin_unlock_irq(&logbuf_lock);
error = __put_user(c,buf);//将c地址的字符传递到用户空间的buf中
buf++;
i++;
cond_resched();//条件调度,让其他进程有运行时间
spin_lock_irq(&logbuf_lock);
}
spin_unlock_irq(&logbuf_lock);
if (!error)
error = i;
break;
case 4:/*读/清除上一次内核消息*/
do_clear = 1;
/* FALL THRU */
case 3:/*读取上一次内核消息*/
error = -EINVAL;
if (!buf || len < 0)
goto out;
error = 0;
if (!len)//读取长度为0
goto out;
if (!access_ok(VERIFY_WRITE, buf, len)) {//验证有写权限
error = -EFAULT;
goto out;
}
count = len;
if (count > log_buf_len)
count = log_buf_len;
spin_lock_irq(&logbuf_lock);
if (count > logged_chars)// logged_chars是上次读/清除以来产生的日志字符数
count = logged_chars;
if (do_clear)
logged_chars = 0;
limit = log_end;
/* __put_user()可以睡眠,当__put_user睡眠时,printk()可能覆盖写正在
拷贝到用户空间的消息,因此,这些消息被反方向拷贝,将buf覆盖部分的数据重写到buf的起始位置*/
for (i = 0; i < count && !error; i++) {//读取count个字符
j = limit-1-i;
if (j + log_buf_len < log_end)
break;
c = LOG_BUF(j); //从环形缓冲区得到读取位置j
spin_unlock_irq(&logbuf_lock);
//将c位置的字符传递到用户空间的buf中,如果发生错误,将发生错误的c位置给error
error = __put_user(c,&buf[count-1-i]);
cond_resched();
spin_lock_irq(&logbuf_lock);
}
spin_unlock_irq(&logbuf_lock);
if (error)
break;
error = i;
if (i != count) {//表示__put_user没有拷贝完成
int offset = count-error;
/*拷贝期间缓冲区溢出,纠正用户空间缓冲区*/
for (i = 0; i < error; i++) {
if (__get_user(c,&buf[i+offset]) ||
__put_user(c,&buf[i])) {//将覆盖部分的数据
重写到buf的起始位置
error = -EFAULT;
break;
}
cond_resched();
}
}
break;
case 5:/*清除环形缓冲区*/
logged_chars = 0;
break;
case 6:/*关闭向控制台输出消息*/
console_loglevel = minimum_console_loglevel;
break;
case 7:/*开启向控制台输出消息*/
console_loglevel = default_console_loglevel;
break;
case 8:/*设置打印到控制台的日志级别*/
error = -EINVAL;
if (len < 1 || len > 8)
goto out;
if (len < minimum_console_loglevel)
len = minimum_console_loglevel;
console_loglevel = len;
error = 0;
break;
case 9:/*得到日志消息所占缓冲区的大小*/
error = log_end - log_start;
break;
case 10:/*返回环形缓冲区的大小*/
error = log_buf_len;
break;
default:
error = -EINVAL;
break;
}
out:
return error;
}
linux安全体系分析与编程pdf下载,linux内核printk调试(摘录《Linux安全体系分析与编程》)...相关推荐
- linux内核printk调试手段,linux内核printk调试
通过printk打你希望追踪的消息.从它的名字可以看出,这个东西有点类似与gnu c中的printf.不过用于内核的东西总该有些特色,printk添加了一些日志级别(loglevel),具体日志级别定 ...
- ubuntu php入门教程,《Ubuntu Linux从入门到精通》PDF 下载_IT教程网
资源名称:<Ubuntu Linux从入门到精通>PDF 下载 内容简介: <Ubuntu Linux从入门到精通>详细介绍Ubuntu Linux操作系统,<Ubunt ...
- linux内核printk调试
linux内核printk调试(摘录<Linux安全体系分析与编程>) 1 printk及控制台的日志级别 函数printk的使用方法和printf相似,用于内核打印消息.printk根 ...
- linux常用命令速查手册PDF下载
Linux常用命令速查手册 需要该PDF文档的朋友扫码关注下方二维码[入门小站],后台回复 「1001」 自取 点击下面标题即可获取对应资料 LeetCode刷题开源手册 LeetCode题解[jav ...
- linux npm 修改 源_多线程m3u8下载工具,支持windowsamp;amp;linux;两个羊毛线报
m3u8下载工具还是挺多的,很多也是基于ffmpeg,这个也是. 这个命令行下载工具,支持windows和linux 64位系统. 支持多线程,支持设置header[一些m3u8链接可能需要设置hea ...
- python密码学编程pdf-Python密码学编程 PDF 下载
相关截图: 资料简介: Python是一种高级程序设计语言,因其简洁.易读及可扩展性日渐成为程序设计领域备受推崇的语言.同时,Python语言在算法领域也得到了很好的应用.本书通过理论和实例相结合的方 ...
- python神经网络编程 pdf下载_Python神经网络编程 PDF 高质量完整版
给大家带来的一篇关于Python相关的电子书资源,介绍了关于Python.神经网络.Python编程方面的内容,本书是由人民邮电出版社出版,格式为PDF,资源大小11.5 MB,塔里克·拉希德编写,目 ...
- 商业分析实践指南pdf下载_PMI-PBA?商业分析专业人士认证——高效备考指南
献给每一位期望一次通过PMI-PBA®认证的职场人! 本文亦适用于PMP®认证. 事物的价值总是相对的--于他人有用,不代表于你有用:于他人无用,不代表于你无用. 所以,遍历分析认证含金量的文章,不如 ...
- react java编程_快速上手React编程 PDF 下载
资料目录: 第1章 初积React 3 1.1 什么是React 4 1.2 React解决的问题 5 1.3 使用React的好处 6 1.3.1 简单性 6 1.3.2 速度和 ...
最新文章
- InnoDB与MyISAM对比
- CentOS5 部署 戴尔OMSA
- 加法变乘法(蓝桥杯)
- 《JSON笔记之三》---postman中传入json串
- springboot 没有找到service_Spring Boot 应用程序五种部署方式
- swift-自定义无限轮播图
- 在iOS App中增加完整的照片多选功能
- 如何获取AS程序的SHA1值用于百度SDK的下载并且避免keytool的错误
- 模拟小型电子商务网站绘制ER图
- linux ubuntu安装svn,在Ubuntu下安装SVN工具RabbitVCS
- 如何用html把图片做成动画的软件,如何用HTML做动画?
- gst-rtsp-server 编译日志
- 从零开始的iOS开发:10 | 如何构建一个APP
- 基于php的房产中介信息网
- iReal Pro for Mac(优秀的音乐练习参考工具)
- 9.8.1 1.打印head标签的内容。2.打印body标签的内容。3.打印id为Hi的标签对象
- python3.6爬虫库_python3.6 网络爬虫
- 圆极化天线宽带化方法
- 计算机毕设(附源码)JAVA-SSM驾校预约考试管理系统
- ROOT后安装Magisk,使用Magisk Hide 解决建设银行APP-一元流量不能用问题
热门文章
- Docker(十四):Docker:网络模式详解
- NSURLCache
- mysql 源码安装 5.6.21_Mysql5.6.21源码安装
- 堆排序怎么建立初始堆_学习笔记-详解堆排序
- 管理活动目录域服务实训_酒店管理专业开展酒店实训活动
- 接口里面的方法都是抽象方法吗_正确的敷面膜方法 你真的都掌握了吗
- vb.net usb通用协议api_充电头百花齐放不通用,热门全协议充电头盘点,充电问题一站搞定...
- python 粒子动画_初试PyOpenGL四 (Python+OpenGL)GPU粒子系统与基本碰撞
- java中单例实现常用的方式_Java单例的常见形式
- 7-8 超速判断 (C语言)