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安全体系分析与编程》)...相关推荐

  1. linux内核printk调试手段,linux内核printk调试

    通过printk打你希望追踪的消息.从它的名字可以看出,这个东西有点类似与gnu c中的printf.不过用于内核的东西总该有些特色,printk添加了一些日志级别(loglevel),具体日志级别定 ...

  2. ubuntu php入门教程,《Ubuntu Linux从入门到精通》PDF 下载_IT教程网

    资源名称:<Ubuntu Linux从入门到精通>PDF 下载 内容简介: <Ubuntu Linux从入门到精通>详细介绍Ubuntu Linux操作系统,<Ubunt ...

  3. linux内核printk调试

    linux内核printk调试(摘录<Linux安全体系分析与编程>) 1  printk及控制台的日志级别 函数printk的使用方法和printf相似,用于内核打印消息.printk根 ...

  4. linux常用命令速查手册PDF下载

    Linux常用命令速查手册 需要该PDF文档的朋友扫码关注下方二维码[入门小站],后台回复 「1001」 自取 点击下面标题即可获取对应资料 LeetCode刷题开源手册 LeetCode题解[jav ...

  5. linux npm 修改 源_多线程m3u8下载工具,支持windowsamp;amp;linux;两个羊毛线报

    m3u8下载工具还是挺多的,很多也是基于ffmpeg,这个也是. 这个命令行下载工具,支持windows和linux 64位系统. 支持多线程,支持设置header[一些m3u8链接可能需要设置hea ...

  6. python密码学编程pdf-Python密码学编程 PDF 下载

    相关截图: 资料简介: Python是一种高级程序设计语言,因其简洁.易读及可扩展性日渐成为程序设计领域备受推崇的语言.同时,Python语言在算法领域也得到了很好的应用.本书通过理论和实例相结合的方 ...

  7. python神经网络编程 pdf下载_Python神经网络编程 PDF 高质量完整版

    给大家带来的一篇关于Python相关的电子书资源,介绍了关于Python.神经网络.Python编程方面的内容,本书是由人民邮电出版社出版,格式为PDF,资源大小11.5 MB,塔里克·拉希德编写,目 ...

  8. 商业分析实践指南pdf下载_PMI-PBA?商业分析专业人士认证——高效备考指南

    献给每一位期望一次通过PMI-PBA®认证的职场人! 本文亦适用于PMP®认证. 事物的价值总是相对的--于他人有用,不代表于你有用:于他人无用,不代表于你无用. 所以,遍历分析认证含金量的文章,不如 ...

  9. 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  速度和 ...

最新文章

  1. InnoDB与MyISAM对比
  2. CentOS5 部署 戴尔OMSA
  3. 加法变乘法(蓝桥杯)
  4. 《JSON笔记之三》---postman中传入json串
  5. springboot 没有找到service_Spring Boot 应用程序五种部署方式
  6. swift-自定义无限轮播图
  7. 在iOS App中增加完整的照片多选功能
  8. 如何获取AS程序的SHA1值用于百度SDK的下载并且避免keytool的错误
  9. 模拟小型电子商务网站绘制ER图
  10. linux ubuntu安装svn,在Ubuntu下安装SVN工具RabbitVCS
  11. 如何用html把图片做成动画的软件,如何用HTML做动画?
  12. gst-rtsp-server 编译日志
  13. 从零开始的iOS开发:10 | 如何构建一个APP
  14. 基于php的房产中介信息网
  15. iReal Pro for Mac(优秀的音乐练习参考工具)
  16. 9.8.1 1.打印head标签的内容。2.打印body标签的内容。3.打印id为Hi的标签对象
  17. python3.6爬虫库_python3.6 网络爬虫
  18. 圆极化天线宽带化方法
  19. 计算机毕设(附源码)JAVA-SSM驾校预约考试管理系统
  20. ROOT后安装Magisk,使用Magisk Hide 解决建设银行APP-一元流量不能用问题

热门文章

  1. Docker(十四):Docker:网络模式详解
  2. NSURLCache
  3. mysql 源码安装 5.6.21_Mysql5.6.21源码安装
  4. 堆排序怎么建立初始堆_学习笔记-详解堆排序
  5. 管理活动目录域服务实训_酒店管理专业开展酒店实训活动
  6. 接口里面的方法都是抽象方法吗_正确的敷面膜方法 你真的都掌握了吗
  7. vb.net usb通用协议api_充电头百花齐放不通用,热门全协议充电头盘点,充电问题一站搞定...
  8. python 粒子动画_初试PyOpenGL四 (Python+OpenGL)GPU粒子系统与基本碰撞
  9. java中单例实现常用的方式_Java单例的常见形式
  10. 7-8 超速判断 (C语言)