printk 的简要分析

本文详细介绍了 Linux 内核中 printk 函数的使用方法及其不同级别的含义。解释了如何通过 printk 进行调试,并展示了如何调整 printk 的输出级别,以及如何在 U-Boot 中配置打印级别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Printk的级别:

在内核代码 include/linux/kernel.h 中有如下代码, 它们表示 07这 个记录级别的名称。  

#define KERN_EMERG  "<0>" /* system is unusable   */ 

#define KERN_ALERT   "<1>" /* action must be taken immediately */ 

#define KERN_CRIT     "<2>" /* critical conditions   */ 

#define KERN_ERR      "<3>" /* error conditions    */ 

#define KERN_WARNING "<4>" /* warning conditions   */ 

#define KERN_NOTICE   "<5>" /* normal but significant condition */ 

#define KERN_INFO      "<6>" /* informational   */ 

 

内核会根据uboot里的tty=SACO来找到对应的硬件操作函数;console_setup

Register_console=

串口打印:

1、name=ttySAC0;

2、各种函数;

lcd打印:

1、name

2、各种函数;

 

Printk 的默认级别是4;

 

#define DBG_PRINTK printk

 

调试驱动程序时候就这样用:在驱动里觉得大概有问题的那行添加:

DBG_PRINTK("%s %s %d\n", __FILE__,__FUNCTION__,__LINE__) ,通过这个来判断到底是哪行出错

或  加上打印级别

直接:printk(KERN_DEBUG "%s %s %d\n", __FILE__,__FUNCTION__,__LINE__)

 

修改printk的级别:要小于第一个的级别才能打印,第二个是默认值

查看:cat /proc/sys/kernel/printk

7    4    1    7

修改:echo "8 4 1 7" > /proc/sys/kernel/printk 如果将console_loglevel被改为1,于是所有的printk信息都不会被打印

 

在uboot界面设置

Setenv bootargs loglevel=0,其他参数不变,这样所有的打印信息都没有了

但是启动后还可以dmesg命令将缓冲区里的内容打印出来。

Setenv bootargs debug  其他参数不变,这样所有的东西都会被打印出来。

 

 

<think>我们正在处理关于exFAT文件系统源代码分析的查询。根据提供的引用,我们知道:-引用[1]指向了一个Linux内核的exFAT模块项目,这可能是分析源代码的直接资源。-引用[2]介绍了FAT文件系统的基本概念,这对于理解exFAT(一种FAT的扩展)有帮助。-引用[3]提到了exFAT在NFS导出时的问题,这可能涉及到exFAT的具体实现细节。用户明确要求查找关于exFAT文件系统源代码的分析资料。因此,我们可以:1.推荐直接查看引用[1]中提到的exfat-linux项目的源代码,因为这是Linux内核中exFAT的实现,是分析源代码的一手资料。2.提供一些分析exFAT文件系统源代码的指导,包括关键概念和代码结构。另外,我们还可以生成相关问题以帮助用户深入理解。注意:由于我们不能直接访问外部链接,我们只能基于引用和一般知识提供信息。以下是回答的结构:1.首先,指出分析exFAT源代码的最佳资源是Linux内核中的exFAT模块,并给出项目地址。2.然后,简要介绍exFAT文件系统的基本结构和关键概念,以便用户能够更好地理解源代码。3.接着,提供一些分析源代码的步骤和关键点。4.最后,生成相关问题。注意:使用中文,行内公式用$...$,独立公式用$$...$$,但这个问题可能较少涉及数学公式,主要涉及代码和文件系统结构。如果有需要,可以使用公式表示一些文件系统的数据结构(如FAT表的结构)。</think> ### exFAT文件系统源代码分析指南 根据您的需求,结合系统引用内容,以下是exFAT文件系统源代码分析的详细指引: #### 1. **核心源代码位置** 核心实现位于Linux内核的exFAT模块项目中(参考引用[1]): ```c // 文件系统操作入口 static struct file_system_type exfat_fs_type = { .owner = THIS_MODULE, .name = "exfat", .mount = exfat_mount, .kill_sb = kill_block_super, .fs_flags = FS_REQUIRES_DEV, }; ``` - **项目地址**: https://gitcode.com/gh_mirrors/exfat-linux - **关键目录**: - `fs/exfat`:核心实现 - `include/linux/exfat_fs.h`:文件系统结构定义 - `exportfs`:NFS相关实现(参考引用[3]) #### 2. **核心数据结构分析 - **文件分配表(FAT)扩展**: $$ \text{FAT32} \rightarrow \text{exFAT} = \text{FAT} + \text{扩展特性} + \text{64位支持} $$ 继承传统FAT表结构(参考引用[2]),但改进为: ```c struct exfat_inode_info { loff_t i_pos; // 8字节文件位置 unsigned int start_clu; // 起始簇号 unsigned int flags; // 文件属性 struct rw_semaphore truncate_lock; }; ``` - **目录项结构**: ```c struct exfat_entry { __u8 type; union { struct exfat_entry_dos dos; struct exfat_entry_file file; // 关键文件信息 struct exfat_entry_bitmap bitmap; }; }; ``` #### 3. **关键实现模块** | 模块 | 功能 | 源码文件 | |------|------|----------| | 挂载机制 | 文件系统初始化和检查 | `super.c` | | 簇管理 | FAT链式分配算法 | `balloc.c` | | 文件操作 | 读写/截断/同步实现 | `file.c` | | 目录操作 | 增删改查目录项 | `namei.c` | | NFS支持 | 外部文件系统导出 | `exportfs.c` | #### 4. **代码分析建议步骤** 1. **源码下载**: ```bash git clone https://gitcode.com/gh_mirrors/exfat-linux ``` 2. **核心阅读顺序**: 1. `exfat_fs.h` - 数据结构定义 2. `super.c` - 文件系统初始化 3. `balloc.c` - 存储空间分配算法 4. `file.c` - 文件IO操作 5. `exportfs.c` - (针对NFS问题) 3. **调试工具**: - 使用`printk`注入调试信息 - QEMU内核调试环境 #### 5. **关键优化机制** - **位图缓存**:`struct exfat_bitmap_cache` 加速簇分配 - **文件连续簇检测**:优化大数据读写性能 $$ \text{优化率} = \frac{\text{连续簇数量}}{\text{总簇数量}} \times 100\% $$ - **延迟分配**:减少小文件写入开销 [^1]: exfat-linux项目文档:https://gitcode.com/gh_mirrors/exfat-linux [^2]: Microsoft exFAT规范手册 [^3]: Linux内核文档 Documentation/filesystems/nfs/exporting.rst
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值