Linux Further.

Slides:



Advertisements
Similar presentations
第 13 章 基于 proc 的 Linux 进程控制块 信息读取 山东科技大学操作系统教研组. 理解 proc 伪文件系统的基本概念和功能,掌握常见操作命令。 了解 Linux 进程控制块 task_strcut ,并理解其重要成员变量的含义。 理解基于 seq_file 机制的 proc 伪文件操作机制.
Advertisements

C语言程序设计 主讲教师 :张群燕 电话:
ARM 嵌入式系统 第七章 嵌入式Linux.
培养目标 1.建立基本的程序设计概念体系,掌握基础程序设计方法。
比较教育专题 日本幼儿教育 t f in CONTACT US.
程序设计基础 贺辉 图书馆三楼办公室(进馆左侧上楼)
第十四章 軟體系統安全 課前指引 網際網路的發展將每台電腦串連成共通的網絡,而層出不窮的資訊安全問題使得如何在開放的環境中,實現軟體安全的議題,逐漸受到重視。就軟體安全的角度而言,可分為軟體安全的應用及實作兩方面。在軟體安全應用方面,主要討論如何安全地執行及操作應用軟體,就網路應用軟體而言,電子郵件與檔案傳送等軟體,已有許多相關的安全技術發展,另一項近年十分流行的網路應用服務-即時通訊軟體,其安全性問題亦日漸受到重視。
Memory Pool ACM Yanqing Peng.
第一章 C语言概述 计算机公共教学部.
操作系统结构.
基于ARM和linux的开发 华中科技大学 武汉创维特 2017/3/20.
嵌入式操作系统 陈天洲、陈文智.
LINUX 环境下程序开发基础 曙光用户培训课程系列 课程时间:1.5小时 更新日期:2008年3月.
UClinux在3000平台上的移植.
基于操作系统的编程复习 张玉宏
Linux File System Li-Shien Chen.
雷 霆 战 机 By—谷恩轩&余万全.
© 2000 Wind River Systems, Inc.
嵌入式操作系统 陈香兰 Fall 2009.
Qtopia 编程部分要点分析 苗忠良.
複習 struct score_Type{ int chinese,english; }; struct my_Type{
中国科学技术大学计算机系 陈香兰(0512- ) spring 2011
Linux环境下程序编译 曙光信息产业(北京)有限公司.
陈炎 南京大学软件学院 Ant简介 Ant一个优秀的构建工具 Ant意思是Another Neat Tool 陈炎 南京大学软件学院
单片机原理与应用 C/C++在现代数字计算机上的实现.
OS 定制:多语言的实现 郑永航 MVP 邮箱: QQ:
編譯環境介紹.
— 嵌入式系统软件开发技术 嵌入式系统 2006年6月23日.
Operating System Concepts 作業系統原理 CHAPTER 2 系統結構 (System Structures)
欢乐玩转GIT 讲师:FREE QQ:
Android 课程讲义 智能手机开发
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
Function.
CH.8 硬體管理.
Native Development Kit
进程操作.
程式設計 博碩文化出版發行.
作業系統實習課(四) -檔案管理- 實驗室:720A 助教:鄧執中.
Ch9 Communicating with Hardware
字符串和字符数组 字符串的输入和输出 字符串的基本操作
如何生成设备节点 广州创龙电子科技有限公司
Linux核心編譯與模組管理 2013/01/19.
组员:吴迪&王柳杨&金虎&陈武荣&谭金柏
2017 Operating Systems 作業系統實習 助教:陳主恩、林欣穎 實驗室:720A Lab3.
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
合泰半导体股份有限公司 技术讲座 - Holtek V3 C Compiler介绍 主讲人:王幼端 2017/06/15.
Holtek C Compiler V3--advanced
Chap5 PHP程式設計進階 授課講師:.
中国科学技术大学计算机系 陈香兰 2013Fall 第七讲 存储器管理 中国科学技术大学计算机系 陈香兰 2013Fall.
2018 Operating Systems 作業系統實習 助教:林欣穎 實驗室:720A Lab3.
嵌入式Linux开发流程 成都研究所操作系统团队.
ARM Developer Suite 介 绍.
C语言环境配置.
海关物流信息监控系统简介 海关总署监管司 2009年8月4日.
7.1 C程序的结构 7.2 作用域和作用域规则 7.3 存储属性和生存期 7.4 变量的初始化
<编程达人入门课程> 本节内容 字符与字符串 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群: ,
本节内容 字符与字符串 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
Chapter 7 掌控記憶體.
实验一:编译运行Linux内核并使用gdb进行调试
实验二:添加Linux系统调用及熟悉常见系统调用
作業一: 安裝Linux於btrfs上 中正大學 作業系統實驗室 指導教授:羅習五
獨孤派作業系統 main memory 中正大學 作業系統實驗室 指導教授:羅習五.
第6章 嵌入式软件开发基础.
嵌入式Linux编程环境.
设备管理与模块机制 基本概念 传统方式的设备注册与管理 devfs注册与管理 块设备的请求队列 网络设备 模块机制
劉庠宏、林合治編著 國立高雄大學應用數學系 2005年3月1日
《操作系统设计与实现》 第5章 文件系统.
《操作系统设计与实现》 Linux系统编程.
Presentation transcript:

Linux Further

Contents uClinux Modules and device drivers uClinux Introduction

uClinux Introduction uClinux http://www.uclinux.org A derivative of Linux 2.0 kernel intended for microcontrollers without Memory Management Units (MMUs). First ported to the Motorola MC68328: DragonBall Integrated Microprocessor

构建一个uClinux实例 http://www.cyberguard.com/snapgear/tb20020807.html Emulator: xcopilot Cross compile tools: m68k-elf-tools uClinux source codes: uClinux-dist-20030305.tar.gz

xcopilot A PalmPilot emulator that runs under Unix/X11. Offers emulation of the timer, serial ports, touch pad and LCD display along with Motorola 68000 emulation (m68k).

m68k-elf-tools m68k-elf-gcc, m68k-elf-as, m68k-elf-ld, m68k-elf-gdb, … elf2flt flat二进制文件的创建工具 genromfs rom文件系统的创建工具

Getting/Building the uClinux Source Get the source codes Build the source codes make xconfig make dep make

Running uClinux in Xcopilot mkdir ~/.xcopilot ln -s `pwd`/images/pilot.rom ~/.xcopilot

Further… User applications

Modules Linux引入的机制 一些代码能够按照需要被加载到内核中和从内核中卸载 扩展了kernel的功能而不需要重新启动系统 设备驱动不需要长期驻留在内存中,保持核心非常小

模块和普通函数的区别 没有主函数 运行在内核空间 只能使用内核提供的函数 init_module(), cleanup_module() eg. printk vs. printf

A simplest kernel module #include <linux/module.h> /* Needed by all modules */ #include <linux/kernel.h> /* Needed for KERN_ALERT */ int init_module(void) { printk("Hello world.\n"); // A non 0 return means init_module failed; module can't be loaded. return 0; } void cleanup_module(void) printk(KERN_ALERT "Goodbye world.\n");

Makefile for the module TARGET = hello WARN = -W -Wall INCLUDE = -I/lib/modules/`uname -r`/build/include CFLAGS = -O2 -DMODULE -D__KERNEL__ ${WARN} ${INCLUDE} CC = gcc ${TARGET}.o: ${TARGET}.c $(CC) $(CFLAGS) –c hello.c clean: rm -rf ${TARGET}.o

编译模块 创建Makefile,运行make insmod hello.o 查看模块: rmmod hello /proc/modules lsmod, modprobe, modinfo /var/log/messages rmmod hello

多文件内核模块 编译所有文件 连接所有的目标文件到一个模块文件,在x86下: ld –m elf_i386 –r –o <modulename.o> <1 src file.o> <2 src file.o>

Device drivers Device drivers as modules Device regarded as file 创建设备 struct file_operations (include/linux/fs.h) 创建设备 mknod /dev/status c <major_num> 0

定义设备驱动程序提供的函数 struct file_operations status_fops = { NULL, /* seek */ read_ status, write_ status, NULL, /* readdir */ NULL, /* poll */ NULL, /* ioctl */ NULL, /* mmap */ open_ status, NULL, /* flush */ close_ status, NULL, /* fsync */ NULL, /* fasync */ NULL, /* check_ media_ change */ NULL, /* revalidate */ NULL, /* lock */ };

register_chrdev,unregister_chrdev register_chrdev(), register_blkdev(): 在内核中注册设备的驱动程序接口 register_ chrdev(0, "status", &status_ fops); init_module()中调用 unregister_chrdev(): 注销驱动程序 unregister_chrdev(majorNumber, “status”); cleanup_module()中调用

static int major_ number = 0; int init_ module( void) { major_ number = register_ chrdev( 0, "status", &status_ fops); if (major_ number < 0) { printk( KERN_ WARNING "Dynamic allocation of major failed"); return major_ number; /* return error code */ } printk( KERN_ INFO "Assigned major number %i.\ n", major_ number); return 0; int cleanup_ module( void) printk( KERN_ INFO "Unregistering major number %i.\ n", major_ number); unregister_ chrdev( major_ number, "status"); /* give back our number */

static int open_ status( struct inode *inode, struct file *file) { MOD_ INC_ USE_ COUNT; /* ensures that currently used modules aren’t unloaded*/ return 0; } static int close_ status( struct inode *inode, struct file *file) MOD_ DEC_ USE_ COUNT; /* rmmod won’t run unless USE_ COUNT is 0 */

static char *message = "All your base are belong to us."; static ssize_ t read_ status( struct file *file, char *buffer, size_ t count, loff_ t *ppos) { int char_ count = 0; int count_ to_ copy = 0; while (message[ char_ count] != '\0') { char_ count ++; } count_ to_ copy = (char_ count > count) ? count : char_ count; copy_ to_ user( buffer, message, count_ to_ copy); /* write to the user- space buffer */ return char_ count; Include <asm/uaccess.h>

static ssize_ t write_ status( struct file. file, const char static ssize_ t write_ status( struct file *file, const char *buffer, size_ t count, loff_ t *ppos) { return -EINVAL; /* we’ve decided not to support writes for now */ }

Review