- 浏览: 6659 次
- 性别:
- 来自: 武汉
最新评论
在内核中读写配置文件,读文件我测试过,写文件还没。这段代码摘自网络,源出处已无可考。
以下是测试用的代码
调用这些测试代码需要以下几个转换方法
#define FILE_MAX_SIZE 2048 /*maximum size of configure file*/ char filebuff[FILE_MAX_SIZE]; int filesize= 0; struct file *filcp = NULL; #define LEFT_BRACE '[' #define RIGHT_BRACE ']' #define FILEC ("./sys.conf") int newline(char c) { return ('\n' == c || '\r' == c )? 1 : 0; } int end_of_string(char c) { return '\0'==c? 1 : 0; } int left_barce(char c) { return LEFT_BRACE == c? 1 : 0; } int isspace(char c) { return ' ' == c ?1:0; } int isright_brace(char c ) { return RIGHT_BRACE == c ? 1 : 0; } int load_ini_file(void) { int i=0; ssize_t ret; mm_segment_t old_fs; ipline = 0; filesize= 0; memset(filebuff,0,sizeof(filebuff)); /*open readonly configure file */ filcp = filp_open(FILEC, O_RDONLY , 0644); if(IS_ERR(filcp)) printk(KERN_EMERG"open error...\n"); /*store user data space */ old_fs = get_fs(); /*set kernel space in order to operate file in kernel*/ set_fs(get_ds()); filcp->f_op->llseek(filcp,0,0); do { ret = filcp->f_op->read(filcp, &filebuff[i], 1, &filcp->f_pos); if(ret > 0) { //printk(KERN_EMERG"%c",buff[i]); } else if(ret == 0) { //printk(KERN_EMERG"read nothing.............\n"); } else { printk(KERN_EMERG"read error\n"); set_fs(old_fs); filp_close(filcp,NULL); return -1; } if(i >= FILE_MAX_SIZE -1) { printk(KERN_EMERG"read overcoving FILE_MAX_SIZE error\n"); set_fs(old_fs); filp_close(filcp,NULL); return -1; } }while(filebuff[i++] > 0); set_fs(old_fs); filebuff[i]='\0'; filesize = i; filp_close(filcp,NULL); return 1; } // int parse_file(const char *section, const char *key, const char *buf,int *sec_s,int *sec_e, int *key_s,int *key_e, int *value_s, int *value_e) { const char *p = buf; int i=0; if(buf == NULL || section == NULL || key == NULL) return -1; *sec_e = *sec_s = *key_e = *key_s = *value_s = *value_e = -1; while( !end_of_string(p[i]) ) { /*find the section*/ if( ( 0==i || newline(p[i-1]) ) && left_barce(p[i]) ) { int section_start=i+1; /*find the ']'*/ do { i++; } while( !isright_brace(p[i]) && !end_of_string(p[i])); if( 0 == strncmp(p+section_start,section, i-section_start)) { int newline_start=0; i++; /*Skip over space char after ']'*/ while(isspace(p[i])) { i++; } /*find the section*/ *sec_s = section_start; *sec_e = i; while( ! (newline(p[i-1]) && left_barce(p[i])) && !end_of_string(p[i]) ) { int j=0; /*get a new line*/ newline_start = i; while( !newline(p[i]) && !end_of_string(p[i]) ) { i++; } /*now i is equal to end of the line*/ j = newline_start; if(';' != p[j]) /*skip over comment*/ { while(j < i && p[j]!='=') { j++; if('=' == p[j]) { if(strncmp(key,p+newline_start,j-newline_start)==0) { /*find the key ok*/ *key_s = newline_start; *key_e = j-1; *value_s = j+1; *value_e = i; return 0; } } } } i++; } } } else { i++; } } return -1; } /** *@brief read string in initialization file\n * retrieves a string from the specified section in an initialization file *@param section [in] name of the section containing the key name *@param key [in] name of the key pairs to value *@param value [in] pointer to the buffer that receives the retrieved string *@param size [in] size of result's buffer *@return0 : read success; \n -1 : read fail */ int read_profile_string( const char *section, const char *key,char *value,int size) { int sec_s,sec_e,key_s,key_e, value_s, value_e; /*check parameters*/ if(section == NULL || key == NULL || value == NULL || size < 0 ) { return -1; } if(parse_file(section,key,filebuff,&sec_s,&sec_e,&key_s,&key_e,&value_s,&value_e)==-1) { printk("parse_file func error\n"); return -1; /*not find the key*/ } else { int cpcount = value_e -value_s; if( size-1 < cpcount) { cpcount = size-1; } memset(value, 0, size); memcpy(value,filebuff+value_s, cpcount ); value[cpcount] = '\0'; return 0; } return 0; }
以下是测试用的代码
int MTU; int ETH1; char mac[6] char tmp[50]; if(load_ini_file()!=1) return -1; memset(tmp,0,sizeof(tmp)); if(read_profile_string("GLOBA", "MTU", tmp, sizeof(tmp)) == -1) { printk( KERN_EMERG "Read MTU error.\n"); return -1; } MTU=atoi(name); memset(tmp,0,sizeof(tmp)); if(read_profile_string("GLOBA", "Eth1", tmp, sizeof(tmp)) == -1) { printk( KERN_EMERG "Read Eth1 error.\n"); return -1; } ETH1=iptoint(tmp); memset(tmp,0,sizeof(tmp)); if(read_profile_string(section, "mac", tmp, sizeof(tmp)) == -1) { printk( KERN_EMERG "Read mac error.\n"); break; } str2hex(tmp,mac,12);
调用这些测试代码需要以下几个转换方法
int atoi(const char *s) { int i, n; n = 0; for(i = 0; s[i] >= '0' && s[i] <= '9'; ++i) n = 10*n + s[i] - '0'; return (n); } char* strrev(char* szT) { int i,j,k,t; char ch; if ( !szT ) // 处理传入的空串. return ""; i = strlen(szT); t = !(i%2)? 1 : 0; // 检查串长度. for(j = i-1 , k = 0 ; j > (i/2 -t) ; j-- ) { ch = szT[j]; szT[j] = szT[k]; szT[k++] = ch; } return szT; } char* itoa(int value, char* str, int radix) { int rem = 0; int pos = 0; char ch = '!' ; do { rem = value % radix ; value /= radix; if ( 16 == radix ) { if( rem >= 10 && rem <= 15 ) { switch( rem ) { case 10: ch = 'a' ; break; case 11: ch ='b' ; break; case 12: ch = 'c' ; break; case 13: ch ='d' ; break; case 14: ch = 'e' ; break; case 15: ch ='f' ; break; } } } if( '!' == ch ) { str[pos++] = (char) ( rem + 0x30 ); } else { str[pos++] = ch ; } }while( value != 0 ); str[pos] = '\0' ; return strrev(str); } // 将16进制的字符串转换成数组 int str2hex(const char* pstrin,unsigned char* pstrout,int len) { int i = 0; if(len & 1) return -1; for(; i < len; i++) { if(pstrin[i] >= '0' && pstrin[i] <= '9') { if(i & 1) pstrout[i>>1] |= ((pstrin[i] - '0') & 0x0f); else pstrout[i>>1] = (pstrin[i] - '0') << 4; } else if(pstrin[i] >= 'A' && pstrin[i] <= 'F') { if(i & 1) pstrout[i>>1] |= ((pstrin[i] - 0x37) & 0x0f); else pstrout[i>>1] = (pstrin[i] - 0x37) << 4; } else if(pstrin[i] >= 'a' && pstrin[i] <= 'f') { if(i & 1) pstrout[i>>1] |= ((pstrin[i] - 0x57) & 0x0f); else pstrout[i>>1] = (pstrin[i] - 0x57) << 4; } else return -1; } return 0; } // 将字符串格式类似于“192.168.0.1”的ip地址转换成整形数 int iptoint(const char *ip) { const char *ptmp1 = ip; unsigned char actmp[4] ={0}; int iVal = 0,j=0,iIP =0,c = 0; int m= 0,k =0; memset(actmp,0,sizeof(actmp)); while( *ptmp1 != '\0') { if(j >= 4) return -1; if((*ptmp1 < '0' || *ptmp1 > '9') && (*ptmp1!=0x2e)) return -1; actmp[j++] = *ptmp1-0x30; if(*ptmp1++ == '.' || (*ptmp1 == '\0' && c == 3)) { if(*ptmp1 != '\0') { for( m= 1;m < j ; m++) { iVal = iVal*10 + actmp[m-1]; } } else { for( k = 0;k <j ; k++) { iVal = iVal*10 + actmp[k]; } } if(iVal > 255) return -1; ((unsigned char*)&iIP)[c] = iVal; memset(actmp,0,sizeof(actmp)); j = 0; iVal =0; c++; } } if(c== 4 && j == 0 && (actmp[0] ^ 0x80)) return iIP; else return -1; }
相关推荐
1. **创建配置项**: 在配置文件中定义新的配置项。 2. **编写Makefile**: 根据新添加的代码创建相应的Makefile文件,指定编译规则和依赖关系。 3. **集成到内核**: 将新的代码和Makefile文件整合到内核的适当位置,...
3. **更新配置文件**:通过`make menuconfig`等方式,添加或更新`.config`文件中的相应配置选项。 4. **编译内核**:运行`make`命令来编译整个内核,确保新加入的代码被正确编译并链接到最终的内核映像中。 通过...
在Linux内核中,驱动程序可以以模块的形式加载,也可以直接编译进内核。对于驱动直接编译进内核的过程,主要是通过内核配置机制来实现。 内核配置系统由三大部分构成: 1. **Makefile**:这些文件位于内核源代码的...
5. **执行读取程序**:在开发板上运行该程序,它会从指定的NAND Flash分区读取内核数据,并保存到文件中。 #### Bootloader的读取方法 Bootloader的读取方法与内核类似,只是需要关注的是Bootloader所在的NAND ...
在C语言中,读取文本文件通常会用到`fopen()`、`fgets()`等函数,而解析配置文件可能涉及到字符串处理和条件判断,以便提取和显示内核配置项。 `procLinuxKernelCfg.dsp`则可能是Visual C++的项目文件,它存储了...
2. 工具读取Kconfig配置文件,这是一个包含配置选项及其依赖关系的文本文件。 3. menuconfig调用curses库,显示交互式的配置界面。 4. 用户可以通过菜单导航,选择或取消选项,工具会根据用户的选择更新配置文件。 5...
顶层Makefile负责读取配置文件.config中的配置选项,并通过include指令包含特定体系结构的Makefile来指定平台相关信息。配置文件(config.in和Kconfig)为用户提供配置选择的功能。配置工具包括命令解释器和用户界面...
- **允许通过/proc/config.gz访问内核的配置信息**:提供一种简单的方式,使用户可以直接读取内核的配置信息。 - **CPUset支持**:主要用于多处理器或多节点系统中,允许进程被绑定到特定的CPU或节点上运行,有助于...
5. **修改etc**:在/etc目录下创建必要的配置文件,例如`inittab`定义了系统的启动行为。 6. **创建rc.d**:rc.d是初始化脚本存放的地方,创建`rc.sysinit`文件来完成系统的初始化任务。 7. **创建fstab**:`fstab...
- 在 Kbuild 系统中,通过 `-obj-y` 指定的目标文件将会被链接到最终的 `vmlinux` 文件中,作为内核的一部分。 ##### 3.3 -obj-m 标识 - `-obj-m` 用于指示那些应该被编译为独立模块的目标文件。 - 这些模块可以在...
例如,通过添加一个新的驱动程序(如TEST Driver),开发者需要在适当的子目录下创建Makefile条目,以便在配置过程中识别该驱动,并在`.config`文件中设置相应的配置选项。 在编写Makefile时,开发者需要注意以下几...
在Linux的多用户、多任务环境中,配置文件扮演着不可或缺的角色,它们控制着包括用户帐号管理、磁盘配额分配、电子邮件及新闻组管理以及内核参数配置在内的各项管理任务。本文将概述Linux配置文件的分类,并解释它们...
- **Kernel.config support**:内核配置文件支持,允许访问和修改/proc/config.gz中的配置信息,便于系统维护和故障排查。 - **Kernel log buffer size**:内核日志缓冲区大小,控制内核可以缓存的日志消息数量,...
在本项目中,我们利用STM32实现了一个基于RTX实时操作系统和Fatfs文件系统的U盘操作,能够进行INI配置文件的读写。以下是这个项目涉及到的关键知识点: 1. **STM32微控制器**:STM32系列是意法半导体推出的32位微...
3. **修改配置文件**:在`config.in`文件中添加相应的配置项,使用户在配置内核时可以选择是否编入你的驱动。 4. **重新配置内核**:运行`make menuconfig`等命令,重新配置内核,选择包含你的驱动的选项。 5. **...
本文将深入探讨内核模块管理、内核配置编译、2.6.X内核选项以及/proc文件系统。 首先,内核模块是内核功能的可扩展部分,它们允许用户根据需要添加或删除功能,而不必重新编译整个内核。模块化内核使得系统更加灵活...
通常,这些变量的初始化信息来源于静态配置文件,在内核启动时被读取并用于构建内存中的数据结构。然而,当静态配置文件内容发生变化时,内核必须重启才能识别到新的配置,这对于那些要求不间断运行的服务器来说是不...