SHOW_SPACE 函数

本文介绍了一个名为SHOW_SPACE的过程,该过程用于查询指定段的存储空间使用情况,包括总块数、未使用块数等详细信息,并能根据不同参数提供额外的空间使用分析。

SHOW_SPACE 函数


CREATE OR REPLACE PROCEDURE SYS.SHOW_SPACE(p_segname_1 IN VARCHAR2,
                                       p_space     IN VARCHAR2 DEFAULT 'AUTO',
                                       p_type_1    IN VARCHAR2 DEFAULT 'TABLE',
                                       p_analyzed  IN VARCHAR2 DEFAULT 'N',
                                       p_owner_1   IN VARCHAR2 DEFAULT USER) AS
  p_segname VARCHAR2(100);
  p_type    VARCHAR2(10);
  p_owner   VARCHAR2(30);
  l_unformatted_blocks NUMBER;
  l_unformatted_bytes  NUMBER;
  l_fs1_blocks         NUMBER;
  l_fs1_bytes          NUMBER;
  l_fs2_blocks         NUMBER;
  l_fs2_bytes          NUMBER;
  l_fs3_blocks         NUMBER;
  l_fs3_bytes          NUMBER;
  l_fs4_blocks         NUMBER;
  l_fs4_bytes          NUMBER;
  l_full_blocks        NUMBER;
  l_full_bytes         NUMBER;
  l_free_blks          NUMBER;
  l_total_blocks       NUMBER;
  l_total_bytes        NUMBER;
  l_unused_blocks      NUMBER;
  l_unused_bytes       NUMBER;
  l_LastUsedExtFileId  NUMBER;
  l_LastUsedExtBlockId NUMBER;
  l_LAST_USED_BLOCK    NUMBER;
  PROCEDURE p(p_label IN VARCHAR2,
              p_num   IN NUMBER) IS
  BEGIN
    dbms_output.put_line(rpad(p_label, 40, '.') || p_num);
  END;

BEGIN
  p_segname := upper(p_segname_1); -- rainy changed
  p_owner   := upper(p_owner_1);
  p_type    := p_type_1;
  IF (p_type_1 = 'i' OR p_type_1 = 'I') THEN
    --rainy changed
    p_type := 'INDEX';
  END IF;
  IF (p_type_1 = 't' OR p_type_1 = 'T') THEN
    --rainy changed
    p_type := 'TABLE';
  END IF;
  IF (p_type_1 = 'c' OR p_type_1 = 'C') THEN
    --rainy changed
    p_type := 'CLUSTER';
  END IF;
  dbms_space.unused_space(segment_owner => p_owner, segment_name => p_segname, segment_type => p_type,
                          total_blocks => l_total_blocks, total_bytes => l_total_bytes, unused_blocks => l_unused_blocks,
                          unused_bytes => l_unused_bytes, LAST_USED_EXTENT_FILE_ID => l_LastUsedExtFileId,
                          LAST_USED_EXTENT_BLOCK_ID => l_LastUsedExtBlockId, LAST_USED_BLOCK => l_LAST_USED_BLOCK);
  IF p_space = 'MANUAL' OR (p_space <> 'auto' AND p_space <> 'AUTO') THEN
    dbms_space.free_blocks(segment_owner => p_owner, segment_name => p_segname, segment_type => p_type,
                           freelist_group_id => 0, free_blks => l_free_blks);
    p('Free Blocks', l_free_blks);
  END IF;
  p('Total Blocks', l_total_blocks);
  p('Total Bytes', l_total_bytes);
  p('Unused Blocks', l_unused_blocks);
  p('Unused Bytes', l_unused_bytes);
  p('Last Used Ext FileId', l_LastUsedExtFileId);
  p('Last Used Ext BlockId', l_LastUsedExtBlockId);
  p('Last Used Block', l_LAST_USED_BLOCK);
  /*IF the segment is analyzed */
  IF p_analyzed = 'Y' THEN
    dbms_space.space_usage(segment_owner => p_owner, segment_name => p_segname, segment_type => p_type,
                           unformatted_blocks => l_unformatted_blocks, unformatted_bytes => l_unformatted_bytes,
                           fs1_blocks => l_fs1_blocks, fs1_bytes => l_fs1_bytes, fs2_blocks => l_fs2_blocks,
                           fs2_bytes => l_fs2_bytes, fs3_blocks => l_fs3_blocks, fs3_bytes => l_fs3_bytes,
                           fs4_blocks => l_fs4_blocks, fs4_bytes => l_fs4_bytes, full_blocks => l_full_blocks,
                           full_bytes => l_full_bytes);
    dbms_output.put_line(rpad(' ', 50, '*'));
    dbms_output.put_line('The segment is analyzed');
    p('0% -- 25% free space blocks', l_fs1_blocks);
    p('0% -- 25% free space bytes', l_fs1_bytes);
    p('25% -- 50% free space blocks', l_fs2_blocks);
    p('25% -- 50% free space bytes', l_fs2_bytes);
    p('50% -- 75% free space blocks', l_fs3_blocks);
    p('50% -- 75% free space bytes', l_fs3_bytes);
    p('75% -- 100% free space blocks', l_fs4_blocks);
    p('75% -- 100% free space bytes', l_fs4_bytes);
    p('Unused Blocks', l_unformatted_blocks);
    p('Unused Bytes', l_unformatted_bytes);
    p('Total Blocks', l_full_blocks);
    p('Total bytes', l_full_bytes);
  END IF;
END;

GRANT EXECUTE ON show_space TO PUBLIC
CREATE OR REPLACE Public SYNONYM  show_space FOR SYS.Show_Space

`vendor_show_logo` 通常是一个在嵌入式系统或 Linux 内核驱动中用于**显示厂商 Logo** 的函数,常见于 **Bootloader(如 U-Boot)** 或 **Linux 内核的帧缓冲(framebuffer)子系统** 中。它的主要作用是在设备启动过程中,将存储在 Flash 或 ROM 中的厂商 Logo 图像渲染到屏幕上。 --- ### 典型使用场景: - 在 Android 设备开机时,首先看到的 “品牌 Logo”(如小米、华为等),而不是 Linux 小企鹅。 - 在工业控制设备、路由器、智能电视等嵌入式设备上显示定制启动画面。 - 替代内核默认的 `tty` 启动界面,提升用户体验。 --- ### 示例实现:基于 Linux Framebuffer 显示 BMP 格式的 Logo 以下是一个简化版的 `vendor_show_logo` 函数,使用 C 语言操作 `/dev/fb0` 来显示一个简单的 RGB888 格式图像(假设已解码为原始像素数据): ```c #include <linux/module.h> #include <linux/kernel.h> #include <linux/fb.h> #include <linux/uaccess.h> #include <linux/vmalloc.h> struct fb_info *info; // 假设已获取有效的 framebuffer 信息 /** * vendor_show_logo - 显示厂商 Logo 到 framebuffer * @logo_data: 解码后的图像像素数据(RGB888) * @width: 图像宽度 * @height: 图像高度 * @x_offset: 显示位置 X 坐标 * @y_offset: 显示位置 Y 坐标 * * 返回 0 成功,非零失败 */ int vendor_show_logo(const char *logo_data, int width, int height, int x_offset, int y_offset) { struct fb_image image; u32 bg_color = 0; // 背景色黑 if (!info || !logo_data) return -EINVAL; // 1. 清屏(可选) fb_fillrect(info, &(struct fb_fillrect) { .dx = 0, .dy = 0, .width = info->var.xres, .height = info->var.yres, .color = bg_color, .rop = ROP_COPY }); // 2. 设置 fb_image 结构 memset(&image, 0, sizeof(image)); image.dx = x_offset; image.dy = y_offset; image.width = width; image.height = height; image.fb_image.pad_count = 0; image.image.data = logo_data; image.size = width * height * 3; // RGB888 每像素3字节 // 3. 根据 framebuffer 格式设置 color_map 和 depth image.depth = 24; image.color_space = V4L2_COLORSPACE_DEFAULT; // 4. 调用底层驱动绘制图像 if (info->fbops->fb_imageblit) { info->fbops->fb_imageblit(info, &image); return 0; } return -ENOTSUPP; } ``` --- ### 如何配合 U-Boot 或 Kernel 使用? #### 方法一:U-Boot 阶段显示 Logo 在 U-Boot 中调用类似函数: ```c // board/some_board/logo.c void vendor_show_logo(void) { extern const unsigned char company_logo_bmp[]; // 预编译进来的 BMP 数据 bmp_display(company_logo_bmp, BMP_LOGO_OFFSET_X, BMP_LOGO_OFFSET_Y); } ``` 然后在 `board_init_r()` 后调用它。 #### 方法二:Linux 内核模块中显示 你可以写一个内核模块,在初始化时加载 logo 并显示: ```c static int __init logo_init(void) { const char *my_logo = /* 从文件或内置数组读取 */; return vendor_show_logo(my_logo, 240, 160, 100, 50); } static void __exit logo_exit(void) { printk(KERN_INFO "Logo module exited.\n"); } module_init(logo_init); module_exit(logo_exit); MODULE_LICENSE("GPL"); ``` --- ### 注意事项: 1. **图像格式支持**: - 建议使用原始 RGB 或 RLE 压缩格式以减少解码开销。 - 可借助 `logo_linux_clut224`(内核内置小企鹅)机制扩展自定义 Logo。 2. **内存对齐与字节序**: - 确保像素数据按目标平台字节序排列(RGB vs BGR)。 - 某些硬件要求行对齐(如每行 4 字节对齐)。 3. **双缓冲问题**: - 若使用 GPU 或合成器,需刷新页面(`fb_pan_display`)。 4. **权限与时机**: - 必须在 framebuffer 初始化完成之后调用。 - 多线程/中断上下文中注意同步。 --- ### 内核配置相关选项 在 `.config` 中启用 logo 支持: ```bash CONFIG_LOGO = y CONFIG_LOGO_LINUX_CLUT224 = y CONFIG_FB = y CONFIG_FB_CMDLINE = y ``` 你也可以添加自己的 logo 到内核源码树: ``` drivers/video/logo/logo-my-company.ppm ``` 并修改 Kconfig 加载它。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值